From b1a049f193af687432805ee4edda3fa9f5ecb631 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 21 Mar 2017 12:13:56 +0100 Subject: [PATCH] Final fixes --- .../l10n/DEFAULT/Moose.lua | 35416 +++++++++++++++- Moose Mission Setup/Moose.lua | 35416 +++++++++++++++- .../SCO-100 - Scoring of Statics.miz | Bin 45360 -> 262968 bytes .../SCO-101 - Scoring Client to Client.miz | Bin 26265 -> 243873 bytes ... - Scoring Multi Player Demo Mission 1.miz | Bin 3896106 -> 4113714 bytes ...10 - A2G Task Dispatching Destroy Test.miz | Bin 259106 -> 259917 bytes ...- A2G Task Dispatching DETECTION_AREAS.miz | Bin 253119 -> 253930 bytes ...- A2G Task Dispatching DETECTION_AREAS.miz | Bin 260168 -> 260979 bytes ...- A2G Task Dispatching DETECTION_TYPES.miz | Bin 255129 -> 255940 bytes ...- A2G Task Dispatching DETECTION_UNITS.miz | Bin 271350 -> 272161 bytes ...00 - A2G Task Dispatching with SCORING.miz | Bin 261083 -> 261894 bytes ...Task Dispatching per AREAS and SCORING.miz | Bin 264616 -> 265427 bytes ... Task Dispatching per TYPE and SCORING.miz | Bin 271747 -> 264352 bytes 13 files changed, 70798 insertions(+), 34 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 b688c14b7..9585e6212 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,31 +1,35413 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170321_1125' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20170321_1213' ) local base = _G Include = {} - +Include.Files = {} 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 - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) +end + +--- Various routines +-- @module routines +-- @author Flightcontrol + +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 - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() + 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 -Include.ProgramPath = "Scripts/Moose/" -env.info( "Include.ProgramPath = " .. Include.ProgramPath) +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end -Include.Files = {} +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end -Include.File( "Moose" ) +routines.utils.metersToNM = function(meters) + return meters/1852 +end -BASE:TraceOnOff( true ) +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 + + + + + +--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 + + +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, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):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' )) + +--- This module contains derived utilities taken from the MIST framework, +-- which are excellent tools to be reused in an OO environment!. +-- +-- ### Authors: +-- +-- * Grimes : Design & Programming of the MIST framework. +-- +-- ### Contributions: +-- +-- * FlightControl : Rework to OO framework +-- +-- @module Utils + + +--- @type SMOKECOLOR +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +SMOKECOLOR = trigger.smokeColor -- #SMOKECOLOR + +--- @type FLARECOLOR +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +FLARECOLOR = trigger.flareColor -- #FLARECOLOR + +--- Utilities static class. +-- @type UTILS +UTILS = {} + + +--from http://lua-users.org/wiki/CopyTable +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 +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] = "f() " .. 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 +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 + + +UTILS.ToDegree = function(angle) + return angle*180/math.pi +end + +UTILS.ToRadian = function(angle) + return angle*math.pi/180 +end + +UTILS.MetersToNM = function(meters) + return meters/1852 +end + +UTILS.MetersToFeet = function(meters) + return meters/0.3048 +end + +UTILS.NMToMeters = function(NM) + return NM*1852 +end + +UTILS.FeetToMeters = function(feet) + return feet*0.3048 +end + +UTILS.MpsToKnots = function(mps) + return mps*3600/1852 +end + +UTILS.MpsToKmph = function(mps) + return mps*3.6 +end + +UTILS.KnotsToMps = function(knots) + return knots*1852/3600 +end + +UTILS.KmphToMps = function(kmph) + return kmph/3.6 +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. +]] +UTILS.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 = UTILS.Round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = 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 = UTILS.Round(latMin, acc) + lonMin = 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 + + +--- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +function UTILS.Round( num, idp ) + local mult = 10 ^ ( idp or 0 ) + return math.floor( num * mult + 0.5 ) / mult +end + +-- porting in Slmod's dostring +function UTILS.DoString( s ) + local f, err = loadstring( s ) + if f then + return true, f() + else + return false, err + end +end +--- **Core** - BASE forms **the basis of the MOOSE framework**. Each class within the MOOSE framework derives from BASE. +-- +-- ![Banner Image](..\Presentations\BASE\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#BASE} class +-- +-- All classes within the MOOSE framework are derived from the @{#BASE} class. +-- +-- BASE provides facilities for : +-- +-- * The construction and inheritance of MOOSE classes. +-- * The class naming and numbering system. +-- * The class hierarchy search system. +-- * The tracing of information or objects during mission execution for debuggin purposes. +-- * The subscription to DCS events for event handling in MOOSE objects. +-- +-- Note: The BASE class is an abstract class and is not meant to be used directly. +-- +-- ## 1.1) BASE constructor +-- +-- Any class derived from BASE, will use the @{Base#BASE.New} constructor embedded in the @{Base#BASE.Inherit} method. +-- See an example at the @{Base#BASE.New} method how this is done. +-- +-- ## 1.2) Trace information for debugging +-- +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- These trace methods are inherited by each MOOSE class interiting BASE, soeach object created from derived class from BASE can use the tracing methods to trace its execution. +-- +-- Any type of information can be passed to these tracing methods. See the following examples: +-- +-- self:E( "Hello" ) +-- +-- Result in the word "Hello" in the dcs.log. +-- +-- local Array = { 1, nil, "h", { "a","b" }, "x" } +-- self:E( Array ) +-- +-- Results with the text [1]=1,[3]="h",[4]={[1]="a",[2]="b"},[5]="x"} in the dcs.log. +-- +-- local Object1 = "Object1" +-- local Object2 = 3 +-- local Object3 = { Object 1, Object 2 } +-- self:E( { Object1, Object2, Object3 } ) +-- +-- Results with the text [1]={[1]="Object",[2]=3,[3]={[1]="Object",[2]=3}} in the dcs.log. +-- +-- local SpawnObject = SPAWN:New( "Plane" ) +-- local GroupObject = GROUP:FindByName( "Group" ) +-- self:E( { Spawn = SpawnObject, Group = GroupObject } ) +-- +-- Results with the text [1]={Spawn={....),Group={...}} in the dcs.log. +-- +-- Below a more detailed explanation of the different method types for tracing. +-- +-- ### 1.2.1) Tracing methods categories +-- +-- There are basically 3 types of tracing methods available: +-- +-- * @{#BASE.F}: Used to trace the entrance of a function and its given parameters. An F is indicated at column 44 in the DCS.log file. +-- * @{#BASE.T}: Used to trace further logic within a function giving optional variables or parameters. A T is indicated at column 44 in the DCS.log file. +-- * @{#BASE.E}: Used to always trace information giving optional variables or parameters. An E is indicated at column 44 in the DCS.log file. +-- +-- ### 1.2.2) 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. +-- +-- ### 1.2.3) Trace activation. +-- +-- Tracing can be activated in several ways: +-- +-- * Switch tracing on or off through the @{#BASE.TraceOnOff}() method. +-- * Activate all tracing through the @{#BASE.TraceAll}() method. +-- * Activate only the tracing of a certain class (name) through the @{#BASE.TraceClass}() method. +-- * Activate only the tracing of a certain method of a certain class through the @{#BASE.TraceClassMethod}() method. +-- * Activate only the tracing of a certain level through the @{#BASE.TraceLevel}() method. +-- +-- ### 1.2.4) Check if tracing is on. +-- +-- The method @{#BASE.IsTrace}() will validate if tracing is activated or not. +-- +-- ## 1.3 DCS simulator Event Handling +-- +-- The BASE class provides methods to catch DCS Events. These are events that are triggered from within the DCS simulator, +-- and handled through lua scripting. MOOSE provides an encapsulation to handle these events more efficiently. +-- +-- ### 1.3.1 Subscribe / Unsubscribe to DCS Events +-- +-- At first, the mission designer will need to **Subscribe** to a specific DCS event for the class. +-- So, when the DCS event occurs, the class will be notified of that event. +-- There are two methods which you use to subscribe to or unsubscribe from an event. +-- +-- * @{#BASE.HandleEvent}(): Subscribe to a DCS Event. +-- * @{#BASE.UnHandleEvent}(): Unsubscribe from a DCS Event. +-- +-- ### 1.3.2 Event Handling of DCS Events +-- +-- Once the class is subscribed to the event, an **Event Handling** method on the object or class needs to be written that will be called +-- when the DCS event occurs. The Event Handling method receives an @{Event#EVENTDATA} structure, which contains a lot of information +-- about the event that occurred. +-- +-- Find below an example of the prototype how to write an event handling function for two units: +-- +-- local Tank1 = UNIT:FindByName( "Tank A" ) +-- local Tank2 = UNIT:FindByName( "Tank B" ) +-- +-- -- Here we subscribe to the Dead events. So, if one of these tanks dies, the Tank1 or Tank2 objects will be notified. +-- Tank1:HandleEvent( EVENTS.Dead ) +-- Tank2:HandleEvent( EVENTS.Dead ) +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- self:SmokeGreen() +-- end +-- +-- --- This function is an Event Handling function that will be called when Tank2 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank2:OnEventDead( EventData ) +-- +-- self:SmokeBlue() +-- end +-- +-- +-- +-- See the @{Event} module for more information about event handling. +-- +-- ## 1.4) Class identification methods +-- +-- BASE provides methods to get more information of each object: +-- +-- * @{#BASE.GetClassID}(): Gets the ID (number) of the object. Each object created is assigned a number, that is incremented by one. +-- * @{#BASE.GetClassName}(): Gets the name of the object, which is the name of the class the object was instantiated from. +-- * @{#BASE.GetClassNameAndID}(): Gets the name and ID of the object. +-- +-- ## 1.5) All objects derived from BASE can have "States" +-- +-- A mechanism is in place in MOOSE, that allows to let the objects administer **states**. +-- States are essentially properties of objects, which are identified by a **Key** and a **Value**. +-- +-- The method @{#BASE.SetState}() can be used to set a Value with a reference Key to the object. +-- To **read or retrieve** a state Value based on a Key, use the @{#BASE.GetState} method. +-- +-- These two methods provide a very handy way to keep state at long lasting processes. +-- Values can be stored within the objects, and later retrieved or changed when needed. +-- There is one other important thing to note, the @{#BASE.SetState}() and @{#BASE.GetState} methods +-- receive as the **first parameter the object for which the state needs to be set**. +-- Thus, if the state is to be set for the same object as the object for which the method is used, then provide the same +-- object name to the method. +-- +-- ## 1.10) Inheritance +-- +-- The following methods are available to implement inheritance +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.GetParent}: Returns the parent object from the object it is handling, or nil if there is no parent object. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * None. +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Base + + + +local _TraceOnOff = true +local _TraceLevel = 1 +local _TraceAll = false +local _TraceClass = {} +local _TraceClassMethod = {} + +local _ClassID = 0 + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +-- @field ClassNameAndID The name of the class concatenated with the ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + _Private = {}, + Events = {}, + States = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- BASE constructor. +-- +-- This is an example how to use the BASE:New() constructor in a new class definition when inheriting from BASE. +-- +-- function EVENT:New() +-- local self = BASE:Inherit( self, BASE:New() ) -- #EVENT +-- return self +-- end +-- +-- @param #BASE self +-- @return #BASE +function BASE:New() + local self = routines.utils.deepCopy( self ) -- Create a new self instance + local MetaTable = {} + setmetatable( self, MetaTable ) + self.__index = self + _ClassID = _ClassID + 1 + self.ClassID = _ClassID + + + return self +end + +function BASE:_Destructor() + --self:E("_Destructor") + + --self:EventRemoveAll() +end + + +-- THIS IS WHY WE NEED LUA 5.2 ... +function BASE:_SetDestructor() + + -- TODO: Okay, this is really technical... + -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak... + -- Therefore, I am parking this logic until I've properly discussed all this with the community. + + local proxy = newproxy(true) + local proxyMeta = getmetatable(proxy) + + proxyMeta.__gc = function () + env.info("In __gc for " .. self:GetClassNameAndID() ) + if self._Destructor then + self:_Destructor() + end + end + + -- keep the userdata from newproxy reachable until the object + -- table is about to be garbage-collected - then the __gc hook + -- will be invoked and the destructor called + rawset( self, '__proxy', proxy ) + +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 ) + --local Parent = Parent + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + + --Child:_SetDestructor() + end + --self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- Note that the Parent class must be passed to call the parent class method. +-- +-- self:GetParent(self):ParentMethod() +-- +-- +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:GetParent( 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.ClassName, self.ClassID ) +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 + +do -- Event Handling + + --- Returns the event dispatcher + -- @param #BASE self + -- @return Core.Event#EVENT + function BASE:EventDispatcher() + + return _EVENTDISPATCHER + end + + + --- Get the Class @{Event} processing Priority. + -- The Event processing Priority is a number from 1 to 10, + -- reflecting the order of the classes subscribed to the Event to be processed. + -- @param #BASE self + -- @return #number The @{Event} processing Priority. + function BASE:GetEventPriority() + return self._Private.EventPriority or 5 + end + + --- Set the Class @{Event} processing Priority. + -- The Event processing Priority is a number from 1 to 10, + -- reflecting the order of the classes subscribed to the Event to be processed. + -- @param #BASE self + -- @param #number EventPriority The @{Event} processing Priority. + -- @return self + function BASE:SetEventPriority( EventPriority ) + self._Private.EventPriority = EventPriority + end + + --- Remove all subscribed events + -- @param #BASE self + -- @return #BASE + function BASE:EventRemoveAll() + + self:EventDispatcher():RemoveAll( self ) + + return self + end + + --- Subscribe to a DCS Event. + -- @param #BASE self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the unit. + -- @return #BASE + function BASE:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventGeneric( EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #BASE self + -- @param Core.Event#EVENTS Event + -- @return #BASE + function BASE:UnHandleEvent( Event ) + + self:EventDispatcher():Remove( self, Event ) + + return self + end + + -- Event handling function prototypes + + --- Occurs whenever any unit in a mission fires a weapon. But not any machine gun or autocannon based weapon, those are handled by EVENT.ShootingStart. + -- @function [parent=#BASE] OnEventShot + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs whenever an object is hit by a weapon. + -- initiator : The unit object the fired the weapon + -- weapon: Weapon object that hit the target + -- target: The Object that was hit. + -- @function [parent=#BASE] OnEventHit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft takes off from an airbase, farp, or ship. + -- initiator : The unit that tookoff + -- place: Object from where the AI took-off from. Can be an Airbase Object, FARP, or Ships + -- @function [parent=#BASE] OnEventTakeoff + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft lands at an airbase, farp or ship + -- initiator : The unit that has landed + -- place: Object that the unit landed on. Can be an Airbase Object, FARP, or Ships + -- @function [parent=#BASE] OnEventLand + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft crashes into the ground and is completely destroyed. + -- initiator : The unit that has crashed + -- @function [parent=#BASE] OnEventCrash + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a pilot ejects from an aircraft + -- initiator : The unit that has ejected + -- @function [parent=#BASE] OnEventEjection + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft connects with a tanker and begins taking on fuel. + -- initiator : The unit that is receiving fuel. + -- @function [parent=#BASE] OnEventRefueling + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an object is completely destroyed. + -- initiator : The unit that is was destroyed. + -- @function [parent=#BASE] OnEvent + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when the pilot of an aircraft is killed. Can occur either if the player is alive and crashes or if a weapon kills the pilot without completely destroying the plane. + -- initiator : The unit that the pilot has died in. + -- @function [parent=#BASE] OnEventPilotDead + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a ground unit captures either an airbase or a farp. + -- initiator : The unit that captured the base + -- place: The airbase that was captured, can be a FARP or Airbase. When calling place:getCoalition() the faction will already be the new owning faction. + -- @function [parent=#BASE] OnEventBaseCaptured + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a mission starts + -- @function [parent=#BASE] OnEventMissionStart + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a mission ends + -- @function [parent=#BASE] OnEventMissionEnd + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft is finished taking fuel. + -- initiator : The unit that was receiving fuel. + -- @function [parent=#BASE] OnEventRefuelingStop + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any object is spawned into the mission. + -- initiator : The unit that was spawned + -- @function [parent=#BASE] OnEventBirth + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any system fails on a human controlled aircraft. + -- initiator : The unit that had the failure + -- @function [parent=#BASE] OnEventHumanFailure + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft starts its engines. + -- initiator : The unit that is starting its engines. + -- @function [parent=#BASE] OnEventEngineStartup + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft shuts down its engines. + -- initiator : The unit that is stopping its engines. + -- @function [parent=#BASE] OnEventEngineShutdown + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any player assumes direct control of a unit. + -- initiator : The unit that is being taken control of. + -- @function [parent=#BASE] OnEventPlayerEnterUnit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any player relieves control of a unit to the AI. + -- initiator : The unit that the player left. + -- @function [parent=#BASE] OnEventPlayerLeaveUnit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any unit begins firing a weapon that has a high rate of fire. Most common with aircraft cannons (GAU-8), autocannons, and machine guns. + -- initiator : The unit that is doing the shooing. + -- target: The unit that is being targeted. + -- @function [parent=#BASE] OnEventShootingStart + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any unit stops firing its weapon. Event will always correspond with a shooting start event. + -- initiator : The unit that was doing the shooing. + -- @function [parent=#BASE] OnEventShootingEnd + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + +end + + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param Dcs.DCSTypes#Time EventTime The time stamp of the event. +-- @param Dcs.DCSWrapper.Object#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 Dcs.DCSTypes#Time EventTime The time stamp of the event. +-- @param Dcs.DCSWrapper.Object#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 Dcs.DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param Dcs.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 + +--- Set a state or property of the Object given a Key and a Value. +-- Note that if the Object is destroyed, nillified or garbage collected, then the Values and Keys will also be gone. +-- @param #BASE self +-- @param Object The object that will hold the Value set by the Key. +-- @param Key The key that is used as a reference of the value. Note that the key can be a #string, but it can also be any other type! +-- @param Value The value to is stored in the object. +-- @return The Value set. +-- @return #nil The Key was not found and thus the Value could not be retrieved. +function BASE:SetState( Object, Key, Value ) + + local ClassNameAndID = Object:GetClassNameAndID() + + self.States[ClassNameAndID] = self.States[ClassNameAndID] or {} + self.States[ClassNameAndID][Key] = Value + self:T2( { ClassNameAndID, Key, Value } ) + + return self.States[ClassNameAndID][Key] +end + + +--- Get a Value given a Key from the Object. +-- Note that if the Object is destroyed, nillified or garbage collected, then the Values and Keys will also be gone. +-- @param #BASE self +-- @param Object The object that holds the Value set by the Key. +-- @param Key The key that is used to retrieve the value. Note that the key can be a #string, but it can also be any other type! +-- @param Value The value to is stored in the Object. +-- @return The Value retrieved. +function BASE:GetState( Object, Key ) + + local ClassNameAndID = Object:GetClassNameAndID() + + if self.States[ClassNameAndID] then + local Value = self.States[ClassNameAndID][Key] or false + self:T2( { ClassNameAndID, Key, Value } ) + return Value + end + + return nil +end + +function BASE:ClearState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + self.States[ClassNameAndID][StateName] = nil + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace on or off +-- Note that when trace is off, no debug statement is performed, increasing performance! +-- When Moose is loaded statically, (as one file), tracing is switched off by default. +-- So tracing must be switched on manually in your mission if you are using Moose statically. +-- When moose is loading dynamically (for moose class development), tracing is switched on by default. +-- @param #BASE self +-- @param #boolean TraceOnOff Switch the tracing on or off. +-- @usage +-- -- Switch the tracing On +-- BASE:TraceOnOff( true ) +-- +-- -- Switch the tracing Off +-- BASE:TraceOnOff( false ) +function BASE:TraceOnOff( TraceOnOff ) + _TraceOnOff = TraceOnOff +end + + +--- Enquires if tracing is on (for the class). +-- @param #BASE self +-- @return #boolean +function BASE:IsTrace() + + if debug and ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + return true + else + return false + end +end + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Trace all methods in MOOSE +-- @param #BASE self +-- @param #boolean TraceAll true = trace all methods in MOOSE. +function BASE:TraceAll( TraceAll ) + + _TraceAll = TraceAll + + if _TraceAll then + self:E( "Tracing all methods in MOOSE " ) + else + self:E( "Switched off tracing all methods in MOOSE" ) + end +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. This function is private. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if debug and ( _TraceAll == true ) or ( _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 _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = 0 + if DebugInfoCurrent.currentline then + LineCurrent = DebugInfoCurrent.currentline + end + 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. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments ) + + if debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + end +end + +--- Trace a function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if debug and ( _TraceAll == true ) or ( _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 _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = 0 + if DebugInfoCurrent.currentline then + LineCurrent = DebugInfoCurrent.currentline + end + 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 1. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + if debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 ) + + if debug then + 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 + +end + + + +--- **Core** - SCHEDULER prepares and handles the **execution of functions over scheduled time (intervals)**. +-- +-- ![Banner Image](..\Presentations\SCHEDULER\Dia1.JPG) +-- +-- === +-- +-- # 1) @{Scheduler#SCHEDULER} class, extends @{Base#BASE} +-- +-- The @{Scheduler#SCHEDULER} class creates schedule. +-- +-- ## 1.1) SCHEDULER constructor +-- +-- The SCHEDULER class is quite easy to use, but note that the New constructor has variable parameters: +-- +-- * @{Scheduler#SCHEDULER.New}( nil ): Setup a new SCHEDULER object, which is persistently executed after garbage collection. +-- * @{Scheduler#SCHEDULER.New}( Object ): Setup a new SCHEDULER object, which is linked to the Object. When the Object is nillified or destroyed, the SCHEDULER object will also be destroyed and stopped after garbage collection. +-- * @{Scheduler#SCHEDULER.New}( nil, Function, FunctionArguments, Start, ... ): Setup a new persistent SCHEDULER object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- * @{Scheduler#SCHEDULER.New}( Object, Function, FunctionArguments, Start, ... ): Setup a new SCHEDULER object, linked to Object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- +-- ## 1.2) SCHEDULER timer stopping and (re-)starting. +-- +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{Scheduler#SCHEDULER.Start}(): (Re-)Start the schedules within the SCHEDULER object. If a CallID is provided to :Start(), only the schedule referenced by CallID will be (re-)started. +-- * @{Scheduler#SCHEDULER.Stop}(): Stop the schedules within the SCHEDULER object. If a CallID is provided to :Stop(), then only the schedule referenced by CallID will be stopped. +-- +-- ## 1.3) Create a new schedule +-- +-- With @{Scheduler#SCHEDULER.Schedule}() a new time event can be scheduled. This function is used by the :New() constructor when a new schedule is planned. +-- +-- === +-- +-- ### Contributions: +-- +-- * FlightControl : Concept & Testing +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Test Missions: +-- +-- * SCH - Scheduler +-- +-- === +-- +-- @module Scheduler + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @field #number ScheduleID the ID of the scheduler. +-- @extends Core.Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", + Schedules = {}, +} + +--- SCHEDULER constructor. +-- @param #SCHEDULER self +-- @param #table SchedulerObject 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 SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self. +-- @return #number The ScheduleID of the planned schedule. +function SCHEDULER:New( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) + + local ScheduleID = nil + + self.MasterObject = SchedulerObject + + if SchedulerFunction then + ScheduleID = self:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + end + + return self, ScheduleID +end + +--function SCHEDULER:_Destructor() +-- --self:E("_Destructor") +-- +-- _SCHEDULEDISPATCHER:RemoveSchedule( self.CallID ) +--end + +--- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. +-- @param #SCHEDULER self +-- @param #table SchedulerObject 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 SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. +-- @return #number The ScheduleID of the planned schedule. +function SCHEDULER:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) + self:T3( { SchedulerArguments } ) + + local ObjectName = "-" + if SchedulerObject and SchedulerObject.ClassName and SchedulerObject.ClassID then + ObjectName = SchedulerObject.ClassName .. SchedulerObject.ClassID + end + self:F3( { "Schedule :", ObjectName, tostring( SchedulerObject ), Start, Repeat, RandomizeFactor, Stop } ) + self.SchedulerObject = SchedulerObject + + local ScheduleID = _SCHEDULEDISPATCHER:AddSchedule( + self, + SchedulerFunction, + SchedulerArguments, + Start, + Repeat, + RandomizeFactor, + Stop + ) + + self.Schedules[#self.Schedules+1] = ScheduleID + + return ScheduleID +end + +--- (Re-)Starts the schedules or a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Start( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Start( self, ScheduleID ) +end + +--- Stops the schedules or a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Stop( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Stop( self, ScheduleID ) +end + +--- Removes a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Remove( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Remove( self, ScheduleID ) +end + +--- Clears all pending schedules. +-- @param #SCHEDULER self +function SCHEDULER:Clear() + self:F3( ) + + _SCHEDULEDISPATCHER:Clear( self ) +end + + + + + + + + + + + + + + +--- This module defines the SCHEDULEDISPATCHER class, which is used by a central object called _SCHEDULEDISPATCHER. +-- +-- === +-- +-- Takes care of the creation and dispatching of scheduled functions for SCHEDULER objects. +-- +-- This class is tricky and needs some thorought explanation. +-- SCHEDULE classes are used to schedule functions for objects, or as persistent objects. +-- The SCHEDULEDISPATCHER class ensures that: +-- +-- - Scheduled functions are planned according the SCHEDULER object parameters. +-- - Scheduled functions are repeated when requested, according the SCHEDULER object parameters. +-- - Scheduled functions are automatically removed when the schedule is finished, according the SCHEDULER object parameters. +-- +-- The SCHEDULEDISPATCHER class will manage SCHEDULER object in memory during garbage collection: +-- - When a SCHEDULER object is not attached to another object (that is, it's first :Schedule() parameter is nil), then the SCHEDULER +-- object is _persistent_ within memory. +-- - When a SCHEDULER object *is* attached to another object, then the SCHEDULER object is _not persistent_ within memory after a garbage collection! +-- The none persistency of SCHEDULERS attached to objects is required to allow SCHEDULER objects to be garbage collectged, when the parent object is also desroyed or nillified and garbage collected. +-- Even when there are pending timer scheduled functions to be executed for the SCHEDULER object, +-- these will not be executed anymore when the SCHEDULER object has been destroyed. +-- +-- The SCHEDULEDISPATCHER allows multiple scheduled functions to be planned and executed for one SCHEDULER object. +-- The SCHEDULER object therefore keeps a table of "CallID's", which are returned after each planning of a new scheduled function by the SCHEDULEDISPATCHER. +-- The SCHEDULER object plans new scheduled functions through the @{Scheduler#SCHEDULER.Schedule}() method. +-- The Schedule() method returns the CallID that is the reference ID for each planned schedule. +-- +-- === +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- +-- @module ScheduleDispatcher + +--- The SCHEDULEDISPATCHER structure +-- @type SCHEDULEDISPATCHER +SCHEDULEDISPATCHER = { + ClassName = "SCHEDULEDISPATCHER", + CallID = 0, +} + +function SCHEDULEDISPATCHER:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F3() + return self +end + +--- Add a Schedule to the ScheduleDispatcher. +-- The development of this method was really tidy. +-- It is constructed as such that a garbage collection is executed on the weak tables, when the Scheduler is nillified. +-- Nothing of this code should be modified without testing it thoroughly. +-- @param #SCHEDULEDISPATCHER self +-- @param Core.Scheduler#SCHEDULER Scheduler +function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop ) + self:F2( { Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop } ) + + self.CallID = self.CallID + 1 + + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.PersistentSchedulers = self.PersistentSchedulers or {} + + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.ObjectSchedulers = self.ObjectSchedulers or setmetatable( {}, { __mode = "v" } ) -- or {} + + if Scheduler.MasterObject then + self.ObjectSchedulers[self.CallID] = Scheduler + self:F3( { CallID = self.CallID, ObjectScheduler = tostring(self.ObjectSchedulers[self.CallID]), MasterObject = tostring(Scheduler.MasterObject) } ) + else + self.PersistentSchedulers[self.CallID] = Scheduler + self:F3( { CallID = self.CallID, PersistentScheduler = self.PersistentSchedulers[self.CallID] } ) + end + + self.Schedule = self.Schedule or setmetatable( {}, { __mode = "k" } ) + self.Schedule[Scheduler] = self.Schedule[Scheduler] or {} + self.Schedule[Scheduler][self.CallID] = {} + self.Schedule[Scheduler][self.CallID].Function = ScheduleFunction + self.Schedule[Scheduler][self.CallID].Arguments = ScheduleArguments + self.Schedule[Scheduler][self.CallID].StartTime = timer.getTime() + ( Start or 0 ) + self.Schedule[Scheduler][self.CallID].Start = Start + .1 + self.Schedule[Scheduler][self.CallID].Repeat = Repeat + self.Schedule[Scheduler][self.CallID].Randomize = Randomize + self.Schedule[Scheduler][self.CallID].Stop = Stop + + self:T3( self.Schedule[Scheduler][self.CallID] ) + + self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) + self:F2( CallID ) + + local ErrorHandler = function( errmsg ) + env.info( "Error in timer function: " .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + return errmsg + end + + local Scheduler = self.ObjectSchedulers[CallID] + if not Scheduler then + Scheduler = self.PersistentSchedulers[CallID] + end + + self:T3( { Scheduler = Scheduler } ) + + if Scheduler then + + local Schedule = self.Schedule[Scheduler][CallID] + + self:T3( { Schedule = Schedule } ) + + local ScheduleObject = Scheduler.SchedulerObject + --local ScheduleObjectName = Scheduler.SchedulerObject:GetNameAndClassID() + local ScheduleFunction = Schedule.Function + local ScheduleArguments = Schedule.Arguments + local Start = Schedule.Start + local Repeat = Schedule.Repeat or 0 + local Randomize = Schedule.Randomize or 0 + local Stop = Schedule.Stop or 0 + local ScheduleID = Schedule.ScheduleID + + local Status, Result + if ScheduleObject then + local function Timer() + return ScheduleFunction( ScheduleObject, unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + else + local function Timer() + return ScheduleFunction( unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + end + + local CurrentTime = timer.getTime() + local StartTime = CurrentTime + Start + + if Status and (( Result == nil ) or ( Result and Result ~= false ) ) then + if Repeat ~= 0 and ( Stop == 0 ) or ( Stop ~= 0 and CurrentTime <= StartTime + Stop ) then + local ScheduleTime = + CurrentTime + + Repeat + + math.random( + - ( Randomize * Repeat / 2 ), + ( Randomize * Repeat / 2 ) + ) + + 0.01 + self:T3( { Repeat = CallID, CurrentTime, ScheduleTime, ScheduleArguments } ) + return ScheduleTime -- returns the next time the function needs to be called. + else + self:Stop( Scheduler, CallID ) + end + else + self:Stop( Scheduler, CallID ) + end + else + self:E( "Scheduled obscolete call for CallID: " .. CallID ) + end + + return nil + end + + self:Start( Scheduler, self.CallID ) + + return self.CallID +end + +function SCHEDULEDISPATCHER:RemoveSchedule( Scheduler, CallID ) + self:F2( { Remove = CallID, Scheduler = Scheduler } ) + + if CallID then + self:Stop( Scheduler, CallID ) + self.Schedule[Scheduler][CallID] = nil + end +end + +function SCHEDULEDISPATCHER:Start( Scheduler, CallID ) + self:F2( { Start = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + -- Only start when there is no ScheduleID defined! + -- This prevents to "Start" the scheduler twice with the same CallID... + if not Schedule[CallID].ScheduleID then + Schedule[CallID].ScheduleID = timer.scheduleFunction( + Schedule[CallID].CallHandler, + CallID, + timer.getTime() + Schedule[CallID].Start + ) + end + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Start( Scheduler, CallID ) -- Recursive + end + end +end + +function SCHEDULEDISPATCHER:Stop( Scheduler, CallID ) + self:F2( { Stop = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + -- Only stop when there is a ScheduleID defined for the CallID. + -- So, when the scheduler was stopped before, do nothing. + if Schedule[CallID].ScheduleID then + timer.removeFunction( Schedule[CallID].ScheduleID ) + Schedule[CallID].ScheduleID = nil + end + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Stop( Scheduler, CallID ) -- Recursive + end + end +end + +function SCHEDULEDISPATCHER:Clear( Scheduler ) + self:F2( { Scheduler = Scheduler } ) + + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Stop( Scheduler, CallID ) -- Recursive + end +end + + + +--- **Core** - EVENT models DCS **event dispatching** using a **publish-subscribe** model. +-- +-- ![Banner Image](..\Presentations\EVENT\Dia1.JPG) +-- +-- === +-- +-- # 1) Event Handling Overview +-- +-- ![Objects](..\Presentations\EVENT\Dia2.JPG) +-- +-- Within a running mission, various DCS events occur. Units are dynamically created, crash, die, shoot stuff, get hit etc. +-- This module provides a mechanism to dispatch those events occuring within your running mission, to the different objects orchestrating your mission. +-- +-- ![Objects](..\Presentations\EVENT\Dia3.JPG) +-- +-- Objects can subscribe to different events. The Event dispatcher will publish the received DCS events to the subscribed MOOSE objects, in a specified order. +-- In this way, the subscribed MOOSE objects are kept in sync with your evolving running mission. +-- +-- ## 1.1) Event Dispatching +-- +-- ![Objects](..\Presentations\EVENT\Dia4.JPG) +-- +-- The _EVENTDISPATCHER object is automatically created within MOOSE, +-- and handles the dispatching of DCS Events occurring +-- in the simulator to the subscribed objects +-- in the correct processing order. +-- +-- ![Objects](..\Presentations\EVENT\Dia5.JPG) +-- +-- There are 5 levels of kind of objects that the _EVENTDISPATCHER services: +-- +-- * _DATABASE object: The core of the MOOSE objects. Any object that is created, deleted or updated, is done in this database. +-- * SET_ derived classes: Subsets of the _DATABASE object. These subsets are updated by the _EVENTDISPATCHER as the second priority. +-- * UNIT objects: UNIT objects can subscribe to DCS events. Each DCS event will be directly published to teh subscribed UNIT object. +-- * GROUP objects: GROUP objects can subscribe to DCS events. Each DCS event will be directly published to the subscribed GROUP object. +-- * Any other object: Various other objects can subscribe to DCS events. Each DCS event triggered will be published to each subscribed object. +-- +-- ![Objects](..\Presentations\EVENT\Dia6.JPG) +-- +-- For most DCS events, the above order of updating will be followed. +-- +-- ![Objects](..\Presentations\EVENT\Dia7.JPG) +-- +-- But for some DCS events, the publishing order is reversed. This is due to the fact that objects need to be **erased** instead of added. +-- +-- ## 1.2) Event Handling +-- +-- ![Objects](..\Presentations\EVENT\Dia8.JPG) +-- +-- The actual event subscribing and handling is not facilitated through the _EVENTDISPATCHER, but it is done through the @{BASE} class, @{UNIT} class and @{GROUP} class. +-- The _EVENTDISPATCHER is a component that is quietly working in the background of MOOSE. +-- +-- ![Objects](..\Presentations\EVENT\Dia9.JPG) +-- +-- The BASE class provides methods to catch DCS Events. These are events that are triggered from within the DCS simulator, +-- and handled through lua scripting. MOOSE provides an encapsulation to handle these events more efficiently. +-- +-- ### 1.2.1 Subscribe / Unsubscribe to DCS Events +-- +-- At first, the mission designer will need to **Subscribe** to a specific DCS event for the class. +-- So, when the DCS event occurs, the class will be notified of that event. +-- There are two functions which you use to subscribe to or unsubscribe from an event. +-- +-- * @{Base#BASE.HandleEvent}(): Subscribe to a DCS Event. +-- * @{Base#BASE.UnHandleEvent}(): Unsubscribe from a DCS Event. +-- +-- Note that for a UNIT, the event will be handled **for that UNIT only**! +-- Note that for a GROUP, the event will be handled **for all the UNITs in that GROUP only**! +-- +-- For all objects of other classes, the subscribed events will be handled for **all UNITs within the Mission**! +-- So if a UNIT within the mission has the subscribed event for that object, +-- then the object event handler will receive the event for that UNIT! +-- +-- ### 1.3.2 Event Handling of DCS Events +-- +-- Once the class is subscribed to the event, an **Event Handling** method on the object or class needs to be written that will be called +-- when the DCS event occurs. The Event Handling method receives an @{Event#EVENTDATA} structure, which contains a lot of information +-- about the event that occurred. +-- +-- Find below an example of the prototype how to write an event handling function for two units: +-- +-- local Tank1 = UNIT:FindByName( "Tank A" ) +-- local Tank2 = UNIT:FindByName( "Tank B" ) +-- +-- -- Here we subscribe to the Dead events. So, if one of these tanks dies, the Tank1 or Tank2 objects will be notified. +-- Tank1:HandleEvent( EVENTS.Dead ) +-- Tank2:HandleEvent( EVENTS.Dead ) +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- self:SmokeGreen() +-- end +-- +-- --- This function is an Event Handling function that will be called when Tank2 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank2:OnEventDead( EventData ) +-- +-- self:SmokeBlue() +-- end +-- +-- ### 1.3.3 Event Handling methods that are automatically called upon subscribed DCS events +-- +-- ![Objects](..\Presentations\EVENT\Dia10.JPG) +-- +-- The following list outlines which EVENTS item in the structure corresponds to which Event Handling method. +-- Always ensure that your event handling methods align with the events being subscribed to, or nothing will be executed. +-- +-- # 2) EVENTS type +-- +-- The EVENTS structure contains names for all the different DCS events that objects can subscribe to using the +-- @{Base#BASE.HandleEvent}() method. +-- +-- # 3) EVENTDATA type +-- +-- The @{Event#EVENTDATA} structure contains all the fields that are populated with event information before +-- an Event Handler method is being called by the event dispatcher. +-- The Event Handler received the EVENTDATA object as a parameter, and can be used to investigate further the different events. +-- There are basically 4 main categories of information stored in the EVENTDATA structure: +-- +-- * Initiator Unit data: Several fields documenting the initiator unit related to the event. +-- * Target Unit data: Several fields documenting the target unit related to the event. +-- * Weapon data: Certain events populate weapon information. +-- * Place data: Certain events populate place information. +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- EventData is an EVENTDATA structure. +-- -- We use the EventData.IniUnit to smoke the tank Green. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- EventData.IniUnit:SmokeGreen() +-- end +-- +-- +-- Find below an overview which events populate which information categories: +-- +-- ![Objects](..\Presentations\EVENT\Dia14.JPG) +-- +-- **IMPORTANT NOTE:** Some events can involve not just UNIT objects, but also STATIC objects!!! +-- In that case the initiator or target unit fields will refer to a STATIC object! +-- In case a STATIC object is involved, the documentation indicates which fields will and won't not be populated. +-- The fields **IniObjectCategory** and **TgtObjectCategory** contain the indicator which **kind of object is involved** in the event. +-- You can use the enumerator **Object.Category.UNIT** and **Object.Category.STATIC** to check on IniObjectCategory and TgtObjectCategory. +-- Example code snippet: +-- +-- if Event.IniObjectCategory == Object.Category.UNIT then +-- ... +-- end +-- if Event.IniObjectCategory == Object.Category.STATIC then +-- ... +-- end +-- +-- When a static object is involved in the event, the Group and Player fields won't be populated. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- * 2017-03-07: Added the correct event dispatching in case the event is subscribed by a GROUP. +-- +-- * 2017-02-07: Did a complete revision of the Event Handing API and underlying mechanisms. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- ### Authors: +-- +-- * [**FlightControl**](https://forums.eagle.ru/member.php?u=89536): Design & Programming & documentation. +-- +-- @module Event + + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +-- @extends Core.Base#BASE +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +--- The different types of events supported by MOOSE. +-- Use this structure to subscribe to events using the @{Base#BASE.HandleEvent}() method. +-- @type EVENTS +EVENTS = { + Shot = world.event.S_EVENT_SHOT, + Hit = world.event.S_EVENT_HIT, + Takeoff = world.event.S_EVENT_TAKEOFF, + Land = world.event.S_EVENT_LAND, + Crash = world.event.S_EVENT_CRASH, + Ejection = world.event.S_EVENT_EJECTION, + Refueling = world.event.S_EVENT_REFUELING, + Dead = world.event.S_EVENT_DEAD, + PilotDead = world.event.S_EVENT_PILOT_DEAD, + BaseCaptured = world.event.S_EVENT_BASE_CAPTURED, + MissionStart = world.event.S_EVENT_MISSION_START, + MissionEnd = world.event.S_EVENT_MISSION_END, + TookControl = world.event.S_EVENT_TOOK_CONTROL, + RefuelingStop = world.event.S_EVENT_REFUELING_STOP, + Birth = world.event.S_EVENT_BIRTH, + HumanFailure = world.event.S_EVENT_HUMAN_FAILURE, + EngineStartup = world.event.S_EVENT_ENGINE_STARTUP, + EngineShutdown = world.event.S_EVENT_ENGINE_SHUTDOWN, + PlayerEnterUnit = world.event.S_EVENT_PLAYER_ENTER_UNIT, + PlayerLeaveUnit = world.event.S_EVENT_PLAYER_LEAVE_UNIT, + PlayerComment = world.event.S_EVENT_PLAYER_COMMENT, + ShootingStart = world.event.S_EVENT_SHOOTING_START, + ShootingEnd = world.event.S_EVENT_SHOOTING_END, +} + +--- The Event structure +-- Note that at the beginning of each field description, there is an indication which field will be populated depending on the object type involved in the Event: +-- +-- * A (Object.Category.)UNIT : A UNIT object type is involved in the Event. +-- * A (Object.Category.)STATIC : A STATIC object type is involved in the Event.µ +-- +-- @type EVENTDATA +-- @field #number id The identifier of the event. +-- +-- @field Dcs.DCSUnit#Unit initiator (UNIT/STATIC/SCENERY) The initiating @{Dcs.DCSUnit#Unit} or @{Dcs.DCSStaticObject#StaticObject}. +-- @field Dcs.DCSObject#Object.Category IniObjectCategory (UNIT/STATIC/SCENERY) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ). +-- @field Dcs.DCSUnit#Unit IniDCSUnit (UNIT/STATIC) The initiating @{DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field #string IniDCSUnitName (UNIT/STATIC) The initiating Unit name. +-- @field Wrapper.Unit#UNIT IniUnit (UNIT/STATIC) The initiating MOOSE wrapper @{Unit#UNIT} of the initiator Unit object. +-- @field #string IniUnitName (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName). +-- @field Dcs.DCSGroup#Group IniDCSGroup (UNIT) The initiating {DCSGroup#Group}. +-- @field #string IniDCSGroupName (UNIT) The initiating Group name. +-- @field Wrapper.Group#GROUP IniGroup (UNIT) The initiating MOOSE wrapper @{Group#GROUP} of the initiator Group object. +-- @field #string IniGroupName UNIT) The initiating GROUP name (same as IniDCSGroupName). +-- @field #string IniPlayerName (UNIT) The name of the initiating player in case the Unit is a client or player slot. +-- @field Dcs.DCScoalition#coalition.side IniCoalition (UNIT) The coalition of the initiator. +-- @field Dcs.DCSUnit#Unit.Category IniCategory (UNIT) The category of the initiator. +-- @field #string IniTypeName (UNIT) The type name of the initiator. +-- +-- @field Dcs.DCSUnit#Unit target (UNIT/STATIC) The target @{Dcs.DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field Dcs.DCSObject#Object.Category TgtObjectCategory (UNIT/STATIC) The target object category ( Object.Category.UNIT or Object.Category.STATIC ). +-- @field Dcs.DCSUnit#Unit TgtDCSUnit (UNIT/STATIC) The target @{DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field #string TgtDCSUnitName (UNIT/STATIC) The target Unit name. +-- @field Wrapper.Unit#UNIT TgtUnit (UNIT/STATIC) The target MOOSE wrapper @{Unit#UNIT} of the target Unit object. +-- @field #string TgtUnitName (UNIT/STATIC) The target UNIT name (same as TgtDCSUnitName). +-- @field Dcs.DCSGroup#Group TgtDCSGroup (UNIT) The target {DCSGroup#Group}. +-- @field #string TgtDCSGroupName (UNIT) The target Group name. +-- @field Wrapper.Group#GROUP TgtGroup (UNIT) The target MOOSE wrapper @{Group#GROUP} of the target Group object. +-- @field #string TgtGroupName (UNIT) The target GROUP name (same as TgtDCSGroupName). +-- @field #string TgtPlayerName (UNIT) The name of the target player in case the Unit is a client or player slot. +-- @field Dcs.DCScoalition#coalition.side TgtCoalition (UNIT) The coalition of the target. +-- @field Dcs.DCSUnit#Unit.Category TgtCategory (UNIT) The category of the target. +-- @field #string TgtTypeName (UNIT) The type name of the target. +-- +-- @field weapon The weapon used during the event. +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + + +local _EVENTMETA = { + [world.event.S_EVENT_SHOT] = { + Order = 1, + Event = "OnEventShot", + Text = "S_EVENT_SHOT" + }, + [world.event.S_EVENT_HIT] = { + Order = 1, + Event = "OnEventHit", + Text = "S_EVENT_HIT" + }, + [world.event.S_EVENT_TAKEOFF] = { + Order = 1, + Event = "OnEventTakeoff", + Text = "S_EVENT_TAKEOFF" + }, + [world.event.S_EVENT_LAND] = { + Order = 1, + Event = "OnEventLand", + Text = "S_EVENT_LAND" + }, + [world.event.S_EVENT_CRASH] = { + Order = -1, + Event = "OnEventCrash", + Text = "S_EVENT_CRASH" + }, + [world.event.S_EVENT_EJECTION] = { + Order = 1, + Event = "OnEventEjection", + Text = "S_EVENT_EJECTION" + }, + [world.event.S_EVENT_REFUELING] = { + Order = 1, + Event = "OnEventRefueling", + Text = "S_EVENT_REFUELING" + }, + [world.event.S_EVENT_DEAD] = { + Order = -1, + Event = "OnEventDead", + Text = "S_EVENT_DEAD" + }, + [world.event.S_EVENT_PILOT_DEAD] = { + Order = 1, + Event = "OnEventPilotDead", + Text = "S_EVENT_PILOT_DEAD" + }, + [world.event.S_EVENT_BASE_CAPTURED] = { + Order = 1, + Event = "OnEventBaseCaptured", + Text = "S_EVENT_BASE_CAPTURED" + }, + [world.event.S_EVENT_MISSION_START] = { + Order = 1, + Event = "OnEventMissionStart", + Text = "S_EVENT_MISSION_START" + }, + [world.event.S_EVENT_MISSION_END] = { + Order = 1, + Event = "OnEventMissionEnd", + Text = "S_EVENT_MISSION_END" + }, + [world.event.S_EVENT_TOOK_CONTROL] = { + Order = 1, + Event = "OnEventTookControl", + Text = "S_EVENT_TOOK_CONTROL" + }, + [world.event.S_EVENT_REFUELING_STOP] = { + Order = 1, + Event = "OnEventRefuelingStop", + Text = "S_EVENT_REFUELING_STOP" + }, + [world.event.S_EVENT_BIRTH] = { + Order = 1, + Event = "OnEventBirth", + Text = "S_EVENT_BIRTH" + }, + [world.event.S_EVENT_HUMAN_FAILURE] = { + Order = 1, + Event = "OnEventHumanFailure", + Text = "S_EVENT_HUMAN_FAILURE" + }, + [world.event.S_EVENT_ENGINE_STARTUP] = { + Order = 1, + Event = "OnEventEngineStartup", + Text = "S_EVENT_ENGINE_STARTUP" + }, + [world.event.S_EVENT_ENGINE_SHUTDOWN] = { + Order = 1, + Event = "OnEventEngineShutdown", + Text = "S_EVENT_ENGINE_SHUTDOWN" + }, + [world.event.S_EVENT_PLAYER_ENTER_UNIT] = { + Order = 1, + Event = "OnEventPlayerEnterUnit", + Text = "S_EVENT_PLAYER_ENTER_UNIT" + }, + [world.event.S_EVENT_PLAYER_LEAVE_UNIT] = { + Order = -1, + Event = "OnEventPlayerLeaveUnit", + Text = "S_EVENT_PLAYER_LEAVE_UNIT" + }, + [world.event.S_EVENT_PLAYER_COMMENT] = { + Order = 1, + Event = "OnEventPlayerComment", + Text = "S_EVENT_PLAYER_COMMENT" + }, + [world.event.S_EVENT_SHOOTING_START] = { + Order = 1, + Event = "OnEventShootingStart", + Text = "S_EVENT_SHOOTING_START" + }, + [world.event.S_EVENT_SHOOTING_END] = { + Order = 1, + Event = "OnEventShootingEnd", + Text = "S_EVENT_SHOOTING_END" + }, +} + + +--- 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 = _EVENTMETA[EventID].Text + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param Dcs.DCSWorld#world.event EventID +-- @param Core.Base#BASE EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTMETA[EventID].Text, EventClass } ) + + if not self.Events[EventID] then + -- Create a WEAK table to ensure that the garbage collector is cleaning the event links when the object usage is cleaned. + self.Events[EventID] = setmetatable( {}, { __mode = "k" } ) + end + + -- Each event has a subtable of EventClasses, ordered by EventPriority. + local EventPriority = EventClass:GetEventPriority() + if not self.Events[EventID][EventPriority] then + self.Events[EventID][EventPriority] = setmetatable( {}, { __mode = "k" } ) + end + + if not self.Events[EventID][EventPriority][EventClass] then + self.Events[EventID][EventPriority][EventClass] = setmetatable( {}, { __mode = "v" } ) + end + return self.Events[EventID][EventPriority][EventClass] +end + +--- Removes an Events entry +-- @param #EVENT self +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:Remove( EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + self.Events[EventID][EventPriority][EventClass] = nil +end + +--- Removes an Events entry for a UNIT. +-- @param #EVENT self +-- @param #string UnitName The name of the UNIT. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:RemoveForUnit( UnitName, EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + local Event = self.Events[EventID][EventPriority][EventClass] + Event.EventUnit[UnitName] = nil +end + +--- Removes an Events entry for a GROUP. +-- @param #EVENT self +-- @param #string GroupName The name of the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:RemoveForGroup( GroupName, EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + local Event = self.Events[EventID][EventPriority][EventClass] + Event.EventGroup[GroupName] = nil +end + +--- Clears all event subscriptions for a @{Base#BASE} derived object. +-- @param #EVENT self +-- @param Core.Base#BASE EventObject +function EVENT:RemoveAll( EventObject ) + self:F3( { EventObject:GetClassNameAndID() } ) + + local EventClass = EventObject:GetClassNameAndID() + local EventPriority = EventClass:GetEventPriority() + for EventID, EventData in pairs( self.Events ) do + self.Events[EventID][EventPriority][EventClass] = nil + end +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 EventClass The instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EventID ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + self:OnEventForUnit( EventUnit.name, EventFunction, EventClass, EventID ) + 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 Core.Base#BASE EventClass The self instance of the class for which the event is captured. When the event happens, the event process will be called in this class provided. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventClass, EventID ) + self:F2( { EventID } ) + + local EventData = self:Init( EventID, EventClass ) + EventData.EventFunction = EventFunction + EventData.EventClass = EventClass + + return self +end + + +--- Set a new listener for an S_EVENT_X event for a UNIT. +-- @param #EVENT self +-- @param #string UnitName The name of the UNIT. +-- @param #function EventFunction The function to be called when the event occurs for the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( UnitName, EventFunction, EventClass, EventID ) + self:F2( UnitName ) + + local EventData = self:Init( EventID, EventClass ) + if not EventData.EventUnit then + EventData.EventUnit = {} + end + EventData.EventUnit[UnitName] = {} + EventData.EventUnit[UnitName].EventFunction = EventFunction + EventData.EventUnit[UnitName].EventClass = EventClass + return self +end + +--- Set a new listener for an S_EVENT_X event for a GROUP. +-- @param #EVENT self +-- @param #string GroupName The name of the GROUP. +-- @param #function EventFunction The function to be called when the event occurs for the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForGroup( GroupName, EventFunction, EventClass, EventID ) + self:F2( GroupName ) + + local Event = self:Init( EventID, EventClass ) + if not Event.EventGroup then + Event.EventGroup = {} + end + Event.EventGroup[GroupName] = {} + Event.EventGroup[GroupName].EventFunction = EventFunction + Event.EventGroup[GroupName].EventClass = EventClass + return self +end + +do -- OnBirth + + --- Create an OnBirth event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Birth ) + + return self + end + +end + +do -- OnCrash + + --- Create an OnCrash event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Crash ) + + return self + end + +end + +do -- OnDead + + --- Create an OnDead event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Dead ) + + return self + end + +end + + +do -- OnLand + --- Create an OnLand 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Land ) + + return self + end + +end + +do -- OnTakeOff + --- Create an OnTakeOff 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Takeoff ) + + return self + end + +end + +do -- OnEngineShutDown + + --- 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.EngineShutdown ) + + return self + end + +end + + +--- @param #EVENT self +-- @param #EVENTDATA Event +function EVENT:onEvent( Event ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self and self.Events and self.Events[Event.id] then + + + if Event.initiator then + + Event.IniObjectCategory = Event.initiator:getCategory() + + if Event.IniObjectCategory == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniUnit = UNIT:FindByName( Event.IniDCSUnitName ) + if not Event.IniUnit then + -- Unit can be a CLIENT. Most likely this will be the case ... + Event.IniUnit = CLIENT:FindByName( Event.IniDCSUnitName, '', true ) + end + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) + if Event.IniGroup then + Event.IniGroupName = Event.IniDCSGroupName + end + end + Event.IniPlayerName = Event.IniDCSUnit:getPlayerName() + Event.IniCoalition = Event.IniDCSUnit:getCoalition() + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + Event.IniCategory = Event.IniDCSUnit:getDesc().category + end + + if Event.IniObjectCategory == Object.Category.STATIC then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniUnit = STATIC:FindByName( Event.IniDCSUnitName, false ) + Event.IniCoalition = Event.IniDCSUnit:getCoalition() + Event.IniCategory = Event.IniDCSUnit:getDesc().category + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + end + + if Event.IniObjectCategory == Object.Category.SCENERY then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniUnit = SCENERY:Register( Event.IniDCSUnitName, Event.initiator ) + Event.IniCategory = Event.IniDCSUnit:getDesc().category + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + end + end + + if Event.target then + + Event.TgtObjectCategory = Event.target:getCategory() + + if Event.TgtObjectCategory == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = UNIT:FindByName( Event.TgtDCSUnitName ) + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) + if Event.TgtGroup then + Event.TgtGroupName = Event.TgtDCSGroupName + end + end + Event.TgtPlayerName = Event.TgtDCSUnit:getPlayerName() + Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + + if Event.TgtObjectCategory == Object.Category.STATIC then + Event.TgtDCSUnit = Event.target + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = STATIC:FindByName( Event.TgtDCSUnitName ) + Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + + if Event.TgtObjectCategory == Object.Category.SCENERY then + Event.TgtDCSUnit = Event.target + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = SCENERY:Register( Event.TgtDCSUnitName, Event.target ) + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + end + + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + Event.WeaponUNIT = CLIENT:Find( Event.Weapon, '', true ) -- Sometimes, the weapon is a player unit! + Event.WeaponPlayerName = Event.WeaponUNIT and Event.Weapon:getPlayerName() + Event.WeaponCoalition = Event.WeaponUNIT and Event.Weapon:getCoalition() + Event.WeaponCategory = Event.WeaponUNIT and Event.Weapon:getDesc().category + Event.WeaponTypeName = Event.WeaponUNIT and Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + + local PriorityOrder = _EVENTMETA[Event.id].Order + local PriorityBegin = PriorityOrder == -1 and 5 or 1 + local PriorityEnd = PriorityOrder == -1 and 1 or 5 + + if Event.IniObjectCategory ~= 3 then + self:E( { _EVENTMETA[Event.id].Text, Event, Event.IniDCSUnitName, Event.TgtDCSUnitName, PriorityOrder } ) + end + + for EventPriority = PriorityBegin, PriorityEnd, PriorityOrder do + + if self.Events[Event.id][EventPriority] then + + -- Okay, we got the event from DCS. Now loop the SORTED self.EventSorted[] table for the received Event.id, and for each EventData registered, check if a function needs to be called. + for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do + + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) + Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) + + -- If the EventData is for a UNIT, the call directly the EventClass EventFunction for that UNIT. + if ( Event.IniDCSUnitName and EventData.EventUnit and EventData.EventUnit[Event.IniDCSUnitName] ) or + ( Event.TgtDCSUnitName and EventData.EventUnit and EventData.EventUnit[Event.TgtDCSUnitName] ) then + + if EventData.EventUnit[Event.IniDCSUnitName] then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventUnit[Event.IniDCSUnitName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for UNIT ", EventClass:GetClassNameAndID(), ", Unit ", Event.IniUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventUnit[Event.IniDCSUnitName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + if EventData.EventUnit[Event.TgtDCSUnitName] then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventUnit[Event.TgtDCSUnitName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for UNIT ", EventClass:GetClassNameAndID(), ", Unit ", Event.TgtUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventUnit[Event.TgtDCSUnitName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + else + + -- If the EventData is for a GROUP, the call directly the EventClass EventFunction for the UNIT in that GROUP. + if ( Event.IniDCSUnitName and Event.IniDCSGroupName and Event.IniGroupName and EventData.EventGroup and EventData.EventGroup[Event.IniGroupName] ) or + ( Event.TgtDCSUnitName and Event.TgtDCSGroupName and Event.TgtGroupName and EventData.EventGroup and EventData.EventGroup[Event.TgtGroupName] ) then + + if EventData.EventGroup[Event.IniGroupName] then + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventGroup[Event.IniGroupName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for GROUP ", EventClass:GetClassNameAndID(), ", Unit ", Event.IniUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventGroup[Event.IniGroupName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for GROUP ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + if EventData.EventGroup[Event.TgtGroupName] then + if EventData.EventGroup[Event.TgtGroupName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for GROUP ", EventClass:GetClassNameAndID(), ", Unit ", Event.TgtUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventGroup[Event.TgtGroupName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for GROUP ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + else + + -- If the EventData is not bound to a specific unit, then call the EventClass EventFunction. + -- Note that here the EventFunction will need to implement and determine the logic for the relevant source- or target unit, or weapon. + if (Event.IniDCSUnit or Event.WeaponUNIT) and not EventData.EventUnit then + + if EventClass == EventData.EventClass then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventFunction then + + -- There is an EventFunction defined, so call the EventFunction. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + local Result, Value = xpcall( + function() + return EventData.EventFunction( EventClass, Event ) + end, ErrorHandler ) + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + local Result, Value = EventFunction( EventClass, Event ) + return Result, Value + end, ErrorHandler ) + end + end + end + end + end + end + end + end + end + else + self:E( { _EVENTMETA[Event.id].Text, Event } ) + end + + Event = nil +end + +--- The EVENTHANDLER structure +-- @type EVENTHANDLER +-- @extends Core.Base#BASE +EVENTHANDLER = { + ClassName = "EVENTHANDLER", + ClassID = 0, +} + +--- The EVENTHANDLER constructor +-- @param #EVENTHANDLER self +-- @return #EVENTHANDLER +function EVENTHANDLER:New() + self = BASE:Inherit( self, BASE:New() ) -- #EVENTHANDLER + return self +end +--- **Core** -- MENU_ classes model the definition of **hierarchical menu structures** and **commands for players** within a mission. +-- +-- === +-- +-- DCS Menus can be managed using the MENU classes. +-- The advantage of using MENU classes is that it hides the complexity of dealing with menu management in more advanced scanerios where you need to +-- set menus and later remove them, and later set them again. You'll find while using use normal DCS scripting functions, that setting and removing +-- menus is not a easy feat if you have complex menu hierarchies defined. +-- Using the MOOSE menu classes, the removal and refreshing of menus are nicely being handled within these classes, and becomes much more easy. +-- On top, MOOSE implements **variable parameter** passing for command menus. +-- +-- There are basically two different MENU class types that you need to use: +-- +-- ### To manage **main menus**, the classes begin with **MENU_**: +-- +-- * @{Menu#MENU_MISSION}: Manages main menus for whole mission file. +-- * @{Menu#MENU_COALITION}: Manages main menus for whole coalition. +-- * @{Menu#MENU_GROUP}: Manages main menus for GROUPs. +-- * @{Menu#MENU_CLIENT}: Manages main menus for CLIENTs. This manages menus for units with the skill level "Client". +-- +-- ### To manage **command menus**, which are menus that allow the player to issue **functions**, the classes begin with **MENU_COMMAND_**: +-- +-- * @{Menu#MENU_MISSION_COMMAND}: Manages command menus for whole mission file. +-- * @{Menu#MENU_COALITION_COMMAND}: Manages command menus for whole coalition. +-- * @{Menu#MENU_GROUP_COMMAND}: Manages command menus for GROUPs. +-- * @{Menu#MENU_CLIENT_COMMAND}: Manages command menus for CLIENTs. This manages menus for units with the skill level "Client". +-- +-- === +-- +-- The above menus classes **are derived** from 2 main **abstract** classes defined within the MOOSE framework (so don't use these): +-- +-- 1) MENU_ BASE abstract base classes (don't use them) +-- ==================================================== +-- The underlying base menu classes are **NOT** to be used within your missions. +-- These are simply abstract base classes defining a couple of fields that are used by the +-- derived MENU_ classes to manage menus. +-- +-- 1.1) @{#MENU_BASE} class, extends @{Base#BASE} +-- -------------------------------------------------- +-- The @{#MENU_BASE} class defines the main MENU class where other MENU classes are derived from. +-- +-- 1.2) @{#MENU_COMMAND_BASE} class, extends @{Base#BASE} +-- ---------------------------------------------------------- +-- The @{#MENU_COMMAND_BASE} class defines the main MENU class where other MENU COMMAND_ classes are derived from, in order to set commands. +-- +-- === +-- +-- **The next menus define the MENU classes that you can use within your missions.** +-- +-- 2) MENU MISSION classes +-- ====================== +-- The underlying classes manage the menus for a complete mission file. +-- +-- 2.1) @{#MENU_MISSION} class, extends @{Menu#MENU_BASE} +-- --------------------------------------------------------- +-- The @{Menu#MENU_MISSION} class manages the main menus for a complete mission. +-- You can add menus with the @{#MENU_MISSION.New} method, which constructs a MENU_MISSION object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_MISSION.Remove}. +-- +-- 2.2) @{#MENU_MISSION_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------- +-- The @{Menu#MENU_MISSION_COMMAND} class manages the command menus for a complete mission, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_MISSION_COMMAND.New} method, which constructs a MENU_MISSION_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_MISSION_COMMAND.Remove}. +-- +-- === +-- +-- 3) MENU COALITION classes +-- ========================= +-- The underlying classes manage the menus for whole coalitions. +-- +-- 3.1) @{#MENU_COALITION} class, extends @{Menu#MENU_BASE} +-- ------------------------------------------------------------ +-- The @{Menu#MENU_COALITION} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_COALITION.New} method, which constructs a MENU_COALITION object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_COALITION.Remove}. +-- +-- 3.2) @{Menu#MENU_COALITION_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ---------------------------------------------------------------------------- +-- The @{Menu#MENU_COALITION_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_COALITION_COMMAND.New} method, which constructs a MENU_COALITION_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_COALITION_COMMAND.Remove}. +-- +-- === +-- +-- 4) MENU GROUP classes +-- ===================== +-- The underlying classes manage the menus for groups. Note that groups can be inactive, alive or can be destroyed. +-- +-- 4.1) @{Menu#MENU_GROUP} class, extends @{Menu#MENU_BASE} +-- -------------------------------------------------------- +-- The @{Menu#MENU_GROUP} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_GROUP.New} method, which constructs a MENU_GROUP object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_GROUP.Remove}. +-- +-- 4.2) @{Menu#MENU_GROUP_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------ +-- The @{Menu#MENU_GROUP_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_GROUP_COMMAND.New} method, which constructs a MENU_GROUP_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_GROUP_COMMAND.Remove}. +-- +-- === +-- +-- 5) MENU CLIENT classes +-- ====================== +-- The underlying classes manage the menus for units with skill level client or player. +-- +-- 5.1) @{Menu#MENU_CLIENT} class, extends @{Menu#MENU_BASE} +-- --------------------------------------------------------- +-- The @{Menu#MENU_CLIENT} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_CLIENT.New} method, which constructs a MENU_CLIENT object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_CLIENT.Remove}. +-- +-- 5.2) @{Menu#MENU_CLIENT_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------- +-- The @{Menu#MENU_CLIENT_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_CLIENT_COMMAND.New} method, which constructs a MENU_CLIENT_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_CLIENT_COMMAND.Remove}. +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- +-- @module Menu + + +do -- MENU_BASE + + --- The MENU_BASE class + -- @type MENU_BASE + -- @extends Base#BASE + MENU_BASE = { + ClassName = "MENU_BASE", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil + } + + --- Consructor + -- @param #MENU_BASE + -- @return #MENU_BASE + function MENU_BASE:New( MenuText, ParentMenu ) + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, BASE:New() ) + + self.MenuPath = nil + self.MenuText = MenuText + self.MenuParentPath = MenuParentPath + self.Menus = {} + self.MenuCount = 0 + self.MenuRemoveParent = false + self.MenuTime = timer.getTime() + + return self + end + + --- Gets a @{Menu} from a parent @{Menu} + -- @param #MENU_BASE self + -- @param #string MenuText The text of the child menu. + -- @return #MENU_BASE + function MENU_BASE:GetMenu( MenuText ) + self:F( { self.Menus, MenuText } ) + return self.Menus[MenuText] + end + + --- Sets a @{Menu} to remove automatically the parent menu when the menu removed is the last child menu of that parent @{Menu}. + -- @param #MENU_BASE self + -- @param #boolean RemoveParent If true, the parent menu is automatically removed when this menu is the last child menu of that parent @{Menu}. + -- @return #MENU_BASE + function MENU_BASE:SetRemoveParent( RemoveParent ) + self:F( { RemoveParent } ) + self.MenuRemoveParent = RemoveParent + return self + end + + + --- Sets a time stamp for later prevention of menu removal. + -- @param #MENU_BASE self + -- @param MenuTime + -- @return #MENU_BASE + function MENU_BASE:SetTime( MenuTime ) + self.MenuTime = MenuTime + return self + end + +end + +do -- MENU_COMMAND_BASE + + --- The MENU_COMMAND_BASE class + -- @type MENU_COMMAND_BASE + -- @field #function MenuCallHandler + -- @extends Core.Menu#MENU_BASE + MENU_COMMAND_BASE = { + ClassName = "MENU_COMMAND_BASE", + CommandMenuFunction = nil, + CommandMenuArgument = nil, + MenuCallHandler = nil, + } + + --- Constructor + -- @param #MENU_COMMAND_BASE + -- @return #MENU_COMMAND_BASE + function MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArguments ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self.CommandMenuFunction = CommandMenuFunction + self.MenuCallHandler = function( CommandMenuArguments ) + self.CommandMenuFunction( unpack( CommandMenuArguments ) ) + end + + return self + end + +end + + +do -- MENU_MISSION + + --- The MENU_MISSION class + -- @type MENU_MISSION + -- @extends Core.Menu#MENU_BASE + MENU_MISSION = { + ClassName = "MENU_MISSION" + } + + --- MENU_MISSION constructor. Creates a new MENU_MISSION object and creates the menu for a complete mission file. + -- @param #MENU_MISSION self + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. This parameter can be ignored if you want the menu to be located at the perent menu of DCS world (under F10 other). + -- @return #MENU_MISSION + function MENU_MISSION:New( MenuText, ParentMenu ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self:F( { MenuText, ParentMenu } ) + + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuText } ) + + self.MenuPath = missionCommands.addSubMenu( MenuText, self.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_MISSION. Note that the main menu is kept! + -- @param #MENU_MISSION self + -- @return #MENU_MISSION + function MENU_MISSION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + + end + + --- Removes the main menu and the sub menus recursively of this MENU_MISSION. + -- @param #MENU_MISSION self + -- @return #nil + function MENU_MISSION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItem( self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + + return nil + end + +end + +do -- MENU_MISSION_COMMAND + + --- The MENU_MISSION_COMMAND class + -- @type MENU_MISSION_COMMAND + -- @extends Core.Menu#MENU_COMMAND_BASE + MENU_MISSION_COMMAND = { + ClassName = "MENU_MISSION_COMMAND" + } + + --- MENU_MISSION constructor. Creates a new radio command item for a complete mission file, which can invoke a function with parameters. + -- @param #MENU_MISSION_COMMAND self + -- @param #string MenuText The text for the menu. + -- @param Menu#MENU_MISSION ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @param CommandMenuArgument An argument for the function. There can only be ONE argument given. So multiple arguments must be wrapped into a table. See the below example how to do this. + -- @return #MENU_MISSION_COMMAND self + function MENU_MISSION_COMMAND:New( MenuText, ParentMenu, CommandMenuFunction, ... ) + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuText, CommandMenuFunction, arg } ) + + + self.MenuPath = missionCommands.addCommand( MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + ParentMenu.Menus[self.MenuPath] = self + + return self + end + + --- Removes a radio command item for a coalition + -- @param #MENU_MISSION_COMMAND self + -- @return #nil + function MENU_MISSION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItem( self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + return nil + end + +end + + + +do -- MENU_COALITION + + --- The MENU_COALITION class + -- @type MENU_COALITION + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the planes within the red coalition. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- + -- local Plane1 = CLIENT:FindByName( "Plane 1" ) + -- local Plane2 = CLIENT:FindByName( "Plane 2" ) + -- + -- + -- -- This would create a menu for the red coalition under the main DCS "Others" menu. + -- local MenuCoalitionRed = MENU_COALITION:New( coalition.side.RED, "Manage Menus" ) + -- + -- + -- local function ShowStatus( StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- Plane1:Message( StatusText, 15 ) + -- Plane2:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus -- Menu#MENU_COALITION + -- local MenuStatusShow -- Menu#MENU_COALITION_COMMAND + -- + -- local function RemoveStatusMenu() + -- MenuStatus:Remove() + -- end + -- + -- local function AddStatusMenu() + -- + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus = MENU_COALITION:New( coalition.side.RED, "Status for Planes" ) + -- MenuStatusShow = MENU_COALITION_COMMAND:New( coalition.side.RED, "Show Status", MenuStatus, ShowStatus, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- local MenuAdd = MENU_COALITION_COMMAND:New( coalition.side.RED, "Add Status Menu", MenuCoalitionRed, AddStatusMenu ) + -- local MenuRemove = MENU_COALITION_COMMAND:New( coalition.side.RED, "Remove Status Menu", MenuCoalitionRed, RemoveStatusMenu ) + MENU_COALITION = { + ClassName = "MENU_COALITION" + } + + --- MENU_COALITION constructor. Creates a new MENU_COALITION object and creates the menu for a complete coalition. + -- @param #MENU_COALITION self + -- @param Dcs.DCSCoalition#coalition.side Coalition The coalition owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. This parameter can be ignored if you want the menu to be located at the perent menu of DCS world (under F10 other). + -- @return #MENU_COALITION self + function MENU_COALITION:New( Coalition, MenuText, ParentMenu ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self:F( { Coalition, MenuText, ParentMenu } ) + + self.Coalition = Coalition + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( Coalition, MenuText, self.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. Note that the main menu is kept! + -- @param #MENU_COALITION self + -- @return #MENU_COALITION + function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + + end + + --- Removes the main menu and the sub menus recursively of this MENU_COALITION. + -- @param #MENU_COALITION self + -- @return #nil + function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.Coalition, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + + return nil + end + +end + +do -- MENU_COALITION_COMMAND + + --- The MENU_COALITION_COMMAND class + -- @type MENU_COALITION_COMMAND + -- @extends Core.Menu#MENU_COMMAND_BASE + MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" + } + + --- MENU_COALITION constructor. Creates a new radio command item for a coalition, which can invoke a function with parameters. + -- @param #MENU_COALITION_COMMAND self + -- @param Dcs.DCSCoalition#coalition.side Coalition The coalition owning the menu. + -- @param #string MenuText The text for the menu. + -- @param Menu#MENU_COALITION ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @param CommandMenuArgument An argument for the function. There can only be ONE argument given. So multiple arguments must be wrapped into a table. See the below example how to do this. + -- @return #MENU_COALITION_COMMAND + function MENU_COALITION_COMMAND:New( Coalition, MenuText, ParentMenu, CommandMenuFunction, ... ) + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + + self.MenuCoalition = Coalition + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuText, CommandMenuFunction, arg } ) + + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + ParentMenu.Menus[self.MenuPath] = self + + return self + end + + --- Removes a radio command item for a coalition + -- @param #MENU_COALITION_COMMAND self + -- @return #nil + function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + return nil + end + +end + +do -- MENU_CLIENT + + -- 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 = {} + + --- MENU_COALITION constructor. Creates a new radio command item for a coalition, which can invoke a function with parameters. + -- @type MENU_CLIENT + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the two clients of planes. + -- -- Each client will receive a different menu structure. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- -- And play with the Add and Remove menu options. + -- + -- -- Note that in multi player, this will only work after the DCS clients bug is solved. + -- + -- local function ShowStatus( PlaneClient, StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- PlaneClient:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus = {} + -- + -- local function RemoveStatusMenu( MenuClient ) + -- local MenuClientName = MenuClient:GetName() + -- MenuStatus[MenuClientName]:Remove() + -- end + -- + -- --- @param Wrapper.Client#CLIENT MenuClient + -- local function AddStatusMenu( MenuClient ) + -- local MenuClientName = MenuClient:GetName() + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus[MenuClientName] = MENU_CLIENT:New( MenuClient, "Status for Planes" ) + -- MENU_CLIENT_COMMAND:New( MenuClient, "Show Status", MenuStatus[MenuClientName], ShowStatus, MenuClient, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneClient = CLIENT:FindByName( "Plane 1" ) + -- if PlaneClient and PlaneClient:IsAlive() then + -- local MenuManage = MENU_CLIENT:New( PlaneClient, "Manage Menus" ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Add Status Menu Plane 1", MenuManage, AddStatusMenu, PlaneClient ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Remove Status Menu Plane 1", MenuManage, RemoveStatusMenu, PlaneClient ) + -- end + -- end, {}, 10, 10 ) + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneClient = CLIENT:FindByName( "Plane 2" ) + -- if PlaneClient and PlaneClient:IsAlive() then + -- local MenuManage = MENU_CLIENT:New( PlaneClient, "Manage Menus" ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Add Status Menu Plane 2", MenuManage, AddStatusMenu, PlaneClient ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Remove Status Menu Plane 2", MenuManage, RemoveStatusMenu, PlaneClient ) + -- end + -- end, {}, 10, 10 ) + MENU_CLIENT = { + ClassName = "MENU_CLIENT" + } + + --- MENU_CLIENT constructor. Creates a new radio menu item for a client. + -- @param #MENU_CLIENT self + -- @param Wrapper.Client#CLIENT Client 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( Client, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, MenuParentPath ) ) + self:F( { Client, MenuText, ParentMenu } ) + + self.MenuClient = Client + self.MenuClientGroupID = Client: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( { Client: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( { Client: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 #nil + 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 Core.Menu#MENU_COMMAND + MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" + } + + --- MENU_CLIENT_COMMAND constructor. Creates a new radio command item for a client, which can invoke a function with parameters. + -- @param #MENU_CLIENT_COMMAND self + -- @param Wrapper.Client#CLIENT Client The Client owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #MENU_BASE ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @return Menu#MENU_CLIENT_COMMAND self + function MENU_CLIENT_COMMAND:New( Client, MenuText, ParentMenu, CommandMenuFunction, ... ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, MenuParentPath, CommandMenuFunction, arg ) ) -- Menu#MENU_CLIENT_COMMAND + + self.MenuClient = Client + self.MenuClientGroupID = Client: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( { Client:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, arg } ) + + 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, self.MenuCallHandler, arg ) + MenuPath[MenuPathID] = self.MenuPath + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + + return self + end + + --- Removes a menu structure for a client. + -- @param #MENU_CLIENT_COMMAND self + -- @return #nil + 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 +end + +--- MENU_GROUP + +do + -- This local variable is used to cache the menus registered under groups. + -- Menus don't dissapear when groups for players 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 _MENUGROUPS = {} + + --- The MENU_GROUP class + -- @type MENU_GROUP + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the two groups of planes. + -- -- Each group will receive a different menu structure. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- -- And play with the Add and Remove menu options. + -- + -- -- Note that in multi player, this will only work after the DCS groups bug is solved. + -- + -- local function ShowStatus( PlaneGroup, StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- PlaneGroup:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus = {} + -- + -- local function RemoveStatusMenu( MenuGroup ) + -- local MenuGroupName = MenuGroup:GetName() + -- MenuStatus[MenuGroupName]:Remove() + -- end + -- + -- --- @param Wrapper.Group#GROUP MenuGroup + -- local function AddStatusMenu( MenuGroup ) + -- local MenuGroupName = MenuGroup:GetName() + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus[MenuGroupName] = MENU_GROUP:New( MenuGroup, "Status for Planes" ) + -- MENU_GROUP_COMMAND:New( MenuGroup, "Show Status", MenuStatus[MenuGroupName], ShowStatus, MenuGroup, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneGroup = GROUP:FindByName( "Plane 1" ) + -- if PlaneGroup and PlaneGroup:IsAlive() then + -- local MenuManage = MENU_GROUP:New( PlaneGroup, "Manage Menus" ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Add Status Menu Plane 1", MenuManage, AddStatusMenu, PlaneGroup ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Remove Status Menu Plane 1", MenuManage, RemoveStatusMenu, PlaneGroup ) + -- end + -- end, {}, 10, 10 ) + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneGroup = GROUP:FindByName( "Plane 2" ) + -- if PlaneGroup and PlaneGroup:IsAlive() then + -- local MenuManage = MENU_GROUP:New( PlaneGroup, "Manage Menus" ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Add Status Menu Plane 2", MenuManage, AddStatusMenu, PlaneGroup ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Remove Status Menu Plane 2", MenuManage, RemoveStatusMenu, PlaneGroup ) + -- end + -- end, {}, 10, 10 ) + -- + MENU_GROUP = { + ClassName = "MENU_GROUP" + } + + --- MENU_GROUP constructor. Creates a new radio menu item for a group. + -- @param #MENU_GROUP self + -- @param Wrapper.Group#GROUP MenuGroup The Group owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. + -- @return #MENU_GROUP self + function MENU_GROUP:New( MenuGroup, MenuText, ParentMenu ) + + -- Determine if the menu was not already created and already visible at the group. + -- If it is visible, then return the cached self, otherwise, create self and cache it. + + MenuGroup._Menus = MenuGroup._Menus or {} + local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText + if MenuGroup._Menus[Path] then + self = MenuGroup._Menus[Path] + else + self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + MenuGroup._Menus[Path] = self + + self.MenuGroup = MenuGroup + self.Path = Path + self.MenuGroupID = MenuGroup:GetID() + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { "Adding Menu ", MenuText, self.MenuParentPath } ) + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuGroupID, MenuText, self.MenuParentPath ) + + if self.ParentMenu and self.ParentMenu.Menus then + self.ParentMenu.Menus[MenuText] = self + self:F( { self.ParentMenu.Menus, MenuText } ) + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 + end + end + + --self:F( { MenuGroup:GetName(), MenuText, ParentMenu.MenuPath } ) + + return self + end + + --- Removes the sub menus recursively of this MENU_GROUP. + -- @param #MENU_GROUP self + -- @param MenuTime + -- @return #MENU_GROUP self + function MENU_GROUP:RemoveSubMenus( MenuTime ) + self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) + + self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) + for MenuText, Menu in pairs( self.Menus ) do + Menu:Remove( MenuTime ) + end + + end + + + --- Removes the main menu and sub menus recursively of this MENU_GROUP. + -- @param #MENU_GROUP self + -- @param MenuTime + -- @return #nil + function MENU_GROUP:Remove( MenuTime ) + self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + + self:RemoveSubMenus( MenuTime ) + + if not MenuTime or self.MenuTime ~= MenuTime then + if self.MenuGroup._Menus[self.Path] then + self = self.MenuGroup._Menus[self.Path] + + missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuText] = nil + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 + if self.ParentMenu.MenuCount == 0 then + if self.MenuRemoveParent == true then + self:T( "Removing Parent Menu " ) + self.ParentMenu:Remove() + end + end + end + self:T( { "Removing Group Menu:", self.MenuGroup:GetName(), self.MenuGroup._Menus[self.Path].Path } ) + self.MenuGroup._Menus[self.Path] = nil + self = nil + end + end + + return nil + end + + + --- The MENU_GROUP_COMMAND class + -- @type MENU_GROUP_COMMAND + -- @extends Core.Menu#MENU_BASE + MENU_GROUP_COMMAND = { + ClassName = "MENU_GROUP_COMMAND" + } + + --- Creates a new radio command item for a group + -- @param #MENU_GROUP_COMMAND self + -- @param Wrapper.Group#GROUP MenuGroup The Group 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_GROUP_COMMAND + function MENU_GROUP_COMMAND:New( MenuGroup, MenuText, ParentMenu, CommandMenuFunction, ... ) + + MenuGroup._Menus = MenuGroup._Menus or {} + local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText + if MenuGroup._Menus[Path] then + self = MenuGroup._Menus[Path] + self:T( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) + else + self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + MenuGroup._Menus[Path] = self + + self.Path = Path + self.MenuGroup = MenuGroup + self.MenuGroupID = MenuGroup:GetID() + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { "Adding Group Command Menu:", MenuGroup:GetName(), MenuText, self.MenuParentPath } ) + self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + if self.ParentMenu and self.ParentMenu.Menus then + self.ParentMenu.Menus[MenuText] = self + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 + self:F( { ParentMenu.Menus, MenuText } ) + end + end + + return self + end + + --- Removes a menu structure for a group. + -- @param #MENU_GROUP_COMMAND self + -- @param MenuTime + -- @return #nil + function MENU_GROUP_COMMAND:Remove( MenuTime ) + self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + + if not MenuTime or self.MenuTime ~= MenuTime then + if self.MenuGroup._Menus[self.Path] then + self = self.MenuGroup._Menus[self.Path] + + missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) + self:T( { "Removing Group Command Menu:", self.MenuGroup:GetName(), self.MenuText, self.Path, self.MenuGroup._Menus[self.Path].Path } ) + + self.ParentMenu.Menus[self.MenuText] = nil + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 + if self.ParentMenu.MenuCount == 0 then + if self.MenuRemoveParent == true then + self:T( "Removing Parent Menu " ) + self.ParentMenu:Remove() + end + end + + self.MenuGroup._Menus[self.Path] = nil + self = nil + end + end + + return nil + end + +end + +--- **Core** - ZONE classes define **zones** within your mission of **various forms**, with **various capabilities**. +-- +-- ![Banner Image](..\Presentations\ZONE\Dia1.JPG) +-- +-- === +-- +-- 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 defines by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_GROUP}: The ZONE_GROUP class defines by a zone around a @{Group#GROUP} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defines by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- # 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- +-- This class is an abstract BASE class for derived classes, and is not meant to be instantiated. +-- +-- ## 1.1) Each zone has a name: +-- +-- * @{#ZONE_BASE.GetName}(): Returns the name of the zone. +-- +-- ## 1.2) Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsVec2InZone}(): Returns if a Vec2 is within the zone. +-- * @{#ZONE_BASE.IsVec3InZone}(): Returns if a Vec3 is within the zone. +-- +-- ## 1.3) A zone has a probability factor that can be set to randomize a selection between zones: +-- +-- * @{#ZONE_BASE.SetRandomizeProbability}(): Set the randomization probability of a zone to be selected, taking a value between 0 and 1 ( 0 = 0%, 1 = 100% ) +-- * @{#ZONE_BASE.GetRandomizeProbability}(): Get the randomization probability of a zone to be selected, passing a value between 0 and 1 ( 0 = 0%, 1 = 100% ) +-- * @{#ZONE_BASE.GetZoneMaybe}(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate. +-- +-- ## 1.4) A zone manages Vectors: +-- +-- * @{#ZONE_BASE.GetVec2}(): Returns the @{DCSTypes#Vec2} coordinate of the zone. +-- * @{#ZONE_BASE.GetRandomVec2}(): Define a random @{DCSTypes#Vec2} within the zone. +-- +-- ## 1.5) A zone has a bounding square: +-- +-- * @{#ZONE_BASE.GetBoundingSquare}(): Get the outer most bounding square of the zone. +-- +-- ## 1.6) A zone can be marked: +-- +-- * @{#ZONE_BASE.SmokeZone}(): Smokes the zone boundaries in a color. +-- * @{#ZONE_BASE.FlareZone}(): Flares the zone boundaries in a color. +-- +-- === +-- +-- # 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- This class implements the inherited functions from Core.Zone#ZONE_BASE taking into account the own zone format and properties. +-- +-- ## 2.1) @{Zone#ZONE_RADIUS} constructor +-- +-- * @{#ZONE_RADIUS.New}(): Constructor. +-- +-- ## 2.2) Manage the radius of the zone +-- +-- * @{#ZONE_RADIUS.SetRadius}(): Sets the radius of the zone. +-- * @{#ZONE_RADIUS.GetRadius}(): Returns the radius of the zone. +-- +-- ## 2.3) Manage the location of the zone +-- +-- * @{#ZONE_RADIUS.SetVec2}(): Sets the @{DCSTypes#Vec2} of the zone. +-- * @{#ZONE_RADIUS.GetVec2}(): Returns the @{DCSTypes#Vec2} of the zone. +-- * @{#ZONE_RADIUS.GetVec3}(): Returns the @{DCSTypes#Vec3} of the zone, taking an additional height parameter. +-- +-- ## 2.4) Zone point randomization +-- +-- Various functions exist to find random points within the zone. +-- +-- * @{#ZONE_RADIUS.GetRandomVec2}(): Gets a random 2D point in the zone. +-- * @{#ZONE_RADIUS.GetRandomPointVec2}(): Gets a @{Point#POINT_VEC2} object representing a random 2D point in the zone. +-- * @{#ZONE_RADIUS.GetRandomPointVec3}(): Gets a @{Point#POINT_VEC3} object representing a random 3D point in the zone. Note that the height of the point is at landheight. +-- +-- === +-- +-- # 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- This class implements the inherited functions from {Core.Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 5) @{Zone#ZONE_GROUP} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE_GROUP class defines by a zone around a @{Group#GROUP} with a radius. The current leader of the group defines the center of the zone. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 6) @{Zone#ZONE_POLYGON_BASE} class, extends @{Zone#ZONE_BASE} +-- +-- The ZONE_POLYGON_BASE class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- This class is an abstract BASE class for derived classes, and is not meant to be instantiated. +-- +-- ## 6.1) Zone point randomization +-- +-- Various functions exist to find random points within the zone. +-- +-- * @{#ZONE_POLYGON_BASE.GetRandomVec2}(): Gets a random 2D point in the zone. +-- * @{#ZONE_POLYGON_BASE.GetRandomPointVec2}(): Return a @{Point#POINT_VEC2} object representing a random 2D point within the zone. +-- * @{#ZONE_POLYGON_BASE.GetRandomPointVec3}(): Return a @{Point#POINT_VEC3} object representing a random 3D point at landheight within the zone. +-- +-- +-- === +-- +-- # 7) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_POLYGON_BASE} +-- +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- ==== +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-02-28: ZONE\_BASE:**IsVec2InZone()** replaces ZONE\_BASE:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_BASE:**IsVec3InZone()** replaces ZONE\_BASE:_IsPointVec3InZone()_. +-- 2017-02-28: ZONE\_RADIUS:**IsVec2InZone()** replaces ZONE\_RADIUS:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_RADIUS:**IsVec3InZone()** replaces ZONE\_RADIUS:_IsPointVec3InZone()_. +-- 2017-02-28: ZONE\_POLYGON:**IsVec2InZone()** replaces ZONE\_POLYGON:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_POLYGON:**IsVec3InZone()** replaces ZONE\_POLYGON:_IsPointVec3InZone()_. +-- +-- 2017-02-18: ZONE\_POLYGON_BASE:**GetRandomPointVec2()** added. +-- +-- 2017-02-18: ZONE\_POLYGON_BASE:**GetRandomPointVec3()** added. +-- +-- 2017-02-18: ZONE\_RADIUS:**GetRandomPointVec3( inner, outer )** added. +-- +-- 2017-02-18: ZONE\_RADIUS:**GetRandomPointVec2( inner, outer )** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetName()** added. +-- +-- 2016-08-15: ZONE\_BASE:**SetZoneProbability( ZoneProbability )** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetZoneProbability()** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetZoneMaybe()** added. +-- +-- === +-- +-- @module Zone + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @field #string ZoneName Name of the zone. +-- @field #number ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +-- @extends Core.Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + ZoneName = "", + ZoneProbability = 1, + } + + +--- The ZONE_BASE.BoundingSquare +-- @type ZONE_BASE.BoundingSquare +-- @field Dcs.DCSTypes#Distance x1 The lower x coordinate (left down) +-- @field Dcs.DCSTypes#Distance y1 The lower y coordinate (left down) +-- @field Dcs.DCSTypes#Distance x2 The higher x coordinate (right up) +-- @field Dcs.DCSTypes#Distance y2 The higher y coordinate (right up) + + +--- 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 the name of the zone. +-- @param #ZONE_BASE self +-- @return #string The name of the zone. +function ZONE_BASE:GetName() + self:F2() + + return self.ZoneName +end +--- Returns if a location is within the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Vec3 Vec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsVec3InZone( Vec3 ) + self:F2( Vec3 ) + + local InZone = self:IsVec2InZone( { x = Vec3.x, y = Vec3.z } ) + + return InZone +end + +--- Returns the @{DCSTypes#Vec2} coordinate of the zone. +-- @param #ZONE_BASE self +-- @return #nil. +function ZONE_BASE:GetVec2() + self:F2( self.ZoneName ) + + return nil +end + +--- Returns a @{Point#POINT_VEC2} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Core.Point#POINT_VEC2 The PointVec2 of the zone. +function ZONE_BASE:GetPointVec2() + self:F2( self.ZoneName ) + + local Vec2 = self:GetVec2() + + local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) + + self:T2( { PointVec2 } ) + + return PointVec2 +end + + +--- Returns the @{DCSTypes#Vec3} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The Vec3 of the zone. +function ZONE_BASE:GetVec3( Height ) + self:F2( self.ZoneName ) + + Height = Height or 0 + + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + +--- Returns a @{Point#POINT_VEC3} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Core.Point#POINT_VEC3 The PointVec3 of the zone. +function ZONE_BASE:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local Vec3 = self:GetVec3( Height ) + + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Define a random @{DCSTypes#Vec2} within the zone. +-- @param #ZONE_BASE self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coordinates. +function ZONE_BASE:GetRandomVec2() + return nil +end + +--- Define a random @{Point#POINT_VEC2} within the zone. +-- @param #ZONE_BASE self +-- @return Core.Point#POINT_VEC2 The PointVec2 coordinates. +function ZONE_BASE:GetRandomPointVec2() + return nil +end + +--- Define a random @{Point#POINT_VEC3} within the zone. +-- @param #ZONE_BASE self +-- @return Core.Point#POINT_VEC3 The PointVec3 coordinates. +function ZONE_BASE:GetRandomPointVec3() + return nil +end + +--- Get the bounding square the zone. +-- @param #ZONE_BASE self +-- @return #nil The bounding square. +function ZONE_BASE:GetBoundingSquare() + --return { x1 = 0, y1 = 0, x2 = 0, y2 = 0 } + return nil +end + +--- Bound the zone boundaries with a tires. +-- @param #ZONE_BASE self +function ZONE_BASE:BoundZone() + self:F2() + +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + +--- Set the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @param ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +function ZONE_BASE:SetZoneProbability( ZoneProbability ) + self:F2( ZoneProbability ) + + self.ZoneProbability = ZoneProbability or 1 + return self +end + +--- Get the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @return #number A value between 0 and 1. 0 = 0% and 1 = 100% probability. +function ZONE_BASE:GetZoneProbability() + self:F2() + + return self.ZoneProbability +end + +--- Get the zone taking into account the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @return #ZONE_BASE The zone is selected taking into account the randomization probability factor. +-- @return #nil The zone is not selected taking into account the randomization probability factor. +function ZONE_BASE:GetZoneMaybe() + self:F2() + + local Randomization = math.random() + if Randomization <= self.ZoneProbability then + return self + else + return nil + end +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field Dcs.DCSTypes#Vec2 Vec2 The current location of the zone. +-- @field Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @extends Core.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 Dcs.DCSTypes#Vec2 Vec2 The location of the zone. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, Vec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) -- #ZONE_RADIUS + self:F( { ZoneName, Vec2, Radius } ) + + self.Radius = Radius + self.Vec2 = Vec2 + + return self +end + +--- Bounds the zone with tires. +-- @param #ZONE_RADIUS self +-- @param #number Points (optional) The amount of points in the circle. +-- @param #boolean UnBound If true the tyres will be destroyed. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:BoundZone( Points, CountryID, UnBound ) + + local Point = {} + local Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius() + + local CountryName = _DATABASE.COUNTRY_NAME[CountryID] + + local Tire = { + ["country"] = CountryName, + ["category"] = "Fortifications", + ["canCargo"] = false, + ["shape_name"] = "H-tyre_B_WF", + ["type"] = "Black_Tyre_WF", + --["unitId"] = Angle + 10000, + ["y"] = Point.y, + ["x"] = Point.x, + ["name"] = string.format( "%s-Tire #%0d", self:GetName(), Angle ), + ["heading"] = 0, + } -- end of ["group"] + + local Group = coalition.addStaticObject( CountryID, Tire ) + if UnBound and UnBound == true then + Group:destroy() + end + end + + return self +end + + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param Utilities.Utils#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 Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.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 Utilities.Utils#FLARECOLOR FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param Dcs.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 Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.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 Dcs.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 Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return Dcs.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 @{DCSTypes#Vec2} of the zone. +-- @param #ZONE_RADIUS self +-- @return Dcs.DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetVec2() + self:F2( self.ZoneName ) + + self:T2( { self.Vec2 } ) + + return self.Vec2 +end + +--- Sets the @{DCSTypes#Vec2} of the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec2 Vec2 The new location of the zone. +-- @return Dcs.DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetVec2( Vec2 ) + self:F2( self.ZoneName ) + + self.Vec2 = Vec2 + + self:T2( { self.Vec2 } ) + + return self.Vec2 +end + +--- Returns the @{DCSTypes#Vec3} of the ZONE_RADIUS. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetVec3( Height ) + self:F2( { self.ZoneName, Height } ) + + Height = Height or 0 + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + local ZoneVec2 = self:GetVec2() + + if ZoneVec2 then + if (( Vec2.x - ZoneVec2.x )^2 + ( Vec2.y - ZoneVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec3 Vec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsVec3InZone( Vec3 ) + self:F2( Vec3 ) + + local InZone = self:IsVec2InZone( { x = Vec3.x, y = Vec3.z } ) + + return InZone +end + +--- Returns a random Vec2 location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Dcs.DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomVec2( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local Point = {} + local Vec2 = self:GetVec2() + local _inner = inner or 0 + local _outer = outer or self:GetRadius() + + local angle = math.random() * math.pi * 2; + Point.x = Vec2.x + math.cos( angle ) * math.random(_inner, _outer); + Point.y = Vec2.y + math.sin( angle ) * math.random(_inner, _outer); + + self:T( { Point } ) + + return Point +end + +--- Returns a @{Point#POINT_VEC2} object reflecting a random 2D location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Core.Point#POINT_VEC2 The @{Point#POINT_VEC2} object reflecting the random 3D location within the zone. +function ZONE_RADIUS:GetRandomPointVec2( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local PointVec2 = POINT_VEC2:NewFromVec2( self:GetRandomVec2() ) + + self:T3( { PointVec2 } ) + + return PointVec2 +end + +--- Returns a @{Point#POINT_VEC3} object reflecting a random 3D location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Core.Point#POINT_VEC3 The @{Point#POINT_VEC3} object reflecting the random 3D location within the zone. +function ZONE_RADIUS:GetRandomPointVec3( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local PointVec3 = POINT_VEC3:NewFromVec2( self:GetRandomVec2() ) + + self:T3( { PointVec3 } ) + + return PointVec3 +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 Core.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 Wrapper.Unit#UNIT ZoneUNIT +-- @extends Core.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 Wrapper.Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param Dcs.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:GetVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + self.LastVec2 = ZoneUNIT:GetVec2() + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetVec2() + self:F( self.ZoneName ) + + local ZoneVec2 = self.ZoneUNIT:GetVec2() + if ZoneVec2 then + self.LastVec2 = ZoneVec2 + return ZoneVec2 + else + return self.LastVec2 + end + + self:T( { ZoneVec2 } ) + + return nil +end + +--- Returns a random location within the zone. +-- @param #ZONE_UNIT self +-- @return Dcs.DCSTypes#Vec2 The random location within the zone. +function ZONE_UNIT:GetRandomVec2() + self:F( self.ZoneName ) + + local RandomVec2 = {} + local Vec2 = self.ZoneUNIT:GetVec2() + + if not Vec2 then + Vec2 = self.LastVec2 + end + + local angle = math.random() * math.pi*2; + RandomVec2.x = Vec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + RandomVec2.y = Vec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { RandomVec2 } ) + + return RandomVec2 +end + +--- Returns the @{DCSTypes#Vec3} of the ZONE_UNIT. +-- @param #ZONE_UNIT self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The point of the zone. +function ZONE_UNIT:GetVec3( Height ) + self:F2( self.ZoneName ) + + Height = Height or 0 + + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + +--- The ZONE_GROUP class defined by a zone around a @{Group}, taking the average center point of all the units within the Group, with a radius. +-- @type ZONE_GROUP +-- @field Wrapper.Group#GROUP ZoneGROUP +-- @extends Core.Zone#ZONE_RADIUS +ZONE_GROUP = { + ClassName="ZONE_GROUP", + } + +--- Constructor to create a ZONE_GROUP instance, taking the zone name, a zone @{Group#GROUP} and a radius. +-- @param #ZONE_GROUP self +-- @param #string ZoneName Name of the zone. +-- @param Wrapper.Group#GROUP ZoneGROUP The @{Group} as the center of the zone. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_GROUP self +function ZONE_GROUP:New( ZoneName, ZoneGROUP, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneGROUP:GetVec2(), Radius ) ) + self:F( { ZoneName, ZoneGROUP:GetVec2(), Radius } ) + + self.ZoneGROUP = ZoneGROUP + + return self +end + + +--- Returns the current location of the @{Group}. +-- @param #ZONE_GROUP self +-- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Group} location. +function ZONE_GROUP:GetVec2() + self:F( self.ZoneName ) + + local ZoneVec2 = self.ZoneGROUP:GetVec2() + + self:T( { ZoneVec2 } ) + + return ZoneVec2 +end + +--- Returns a random location within the zone of the @{Group}. +-- @param #ZONE_GROUP self +-- @return Dcs.DCSTypes#Vec2 The random location of the zone based on the @{Group} location. +function ZONE_GROUP:GetRandomVec2() + self:F( self.ZoneName ) + + local Point = {} + local Vec2 = self.ZoneGROUP:GetVec2() + + local angle = math.random() * math.pi*2; + Point.x = Vec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = Vec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +-- Polygons + +--- The ZONE_POLYGON_BASE class defined by an array of @{DCSTypes#Vec2}, forming a polygon. +-- @type ZONE_POLYGON_BASE +-- @field #ZONE_POLYGON_BASE.ListVec2 Polygon The polygon defined by an array of @{DCSTypes#Vec2}. +-- @extends Core.Zone#ZONE_BASE +ZONE_POLYGON_BASE = { + ClassName="ZONE_POLYGON_BASE", + } + +--- A points array. +-- @type ZONE_POLYGON_BASE.ListVec2 +-- @list + +--- Constructor to create a ZONE_POLYGON_BASE instance, taking the zone name and an array of @{DCSTypes#Vec2}, forming a polygon. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected. +-- @param #ZONE_POLYGON_BASE self +-- @param #string ZoneName Name of the zone. +-- @param #ZONE_POLYGON_BASE.ListVec2 PointsArray An array of @{DCSTypes#Vec2}, forming a polygon.. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:New( ZoneName, PointsArray ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointsArray } ) + + local i = 0 + + self.Polygon = {} + + for i = 1, #PointsArray do + self.Polygon[i] = {} + self.Polygon[i].x = PointsArray[i].x + self.Polygon[i].y = PointsArray[i].y + end + + return self +end + +--- Flush polygon coordinates as a table in DCS.log. +-- @param #ZONE_POLYGON_BASE self +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:Flush() + self:F2() + + self:E( { Polygon = self.ZoneName, Coordinates = self.Polygon } ) + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON_BASE self +-- @param #boolean UnBound If true, the tyres will be destroyed. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:BoundZone( UnBound ) + + 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 ) + local Tire = { + ["country"] = "USA", + ["category"] = "Fortifications", + ["canCargo"] = false, + ["shape_name"] = "H-tyre_B_WF", + ["type"] = "Black_Tyre_WF", + ["y"] = PointY, + ["x"] = PointX, + ["name"] = string.format( "%s-Tire #%0d", self:GetName(), ((i - 1) * Segments) + Segment ), + ["heading"] = 0, + } -- end of ["group"] + + local Group = coalition.addStaticObject( country.id.USA, Tire ) + if UnBound and UnBound == true then + Group:destroy() + end + + end + j = i + i = i + 1 + end + + return self +end + + + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON_BASE self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE: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. +-- Source learned and taken from: https://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html +-- @param #ZONE_POLYGON_BASE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON_BASE:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + local Next + local Prev + local InPolygon = false + + Next = 1 + Prev = #self.Polygon + + while Next <= #self.Polygon do + self:T( { Next, Prev, self.Polygon[Next], self.Polygon[Prev] } ) + if ( ( ( self.Polygon[Next].y > Vec2.y ) ~= ( self.Polygon[Prev].y > Vec2.y ) ) and + ( Vec2.x < ( self.Polygon[Prev].x - self.Polygon[Next].x ) * ( Vec2.y - self.Polygon[Next].y ) / ( self.Polygon[Prev].y - self.Polygon[Next].y ) + self.Polygon[Next].x ) + ) then + InPolygon = not InPolygon + end + self:T2( { InPolygon = InPolygon } ) + Prev = Next + Next = Next + 1 + end + + self:T( { InPolygon = InPolygon } ) + return InPolygon +end + +--- Define a random @{DCSTypes#Vec2} within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coordinate. +function ZONE_POLYGON_BASE:GetRandomVec2() + self:F2() + + --- It is a bit tricky to find a random point within a polygon. Right now i am doing it the dirty and inefficient way... + local Vec2Found = false + local Vec2 + local BS = self:GetBoundingSquare() + + self:T2( BS ) + + while Vec2Found == false do + Vec2 = { x = math.random( BS.x1, BS.x2 ), y = math.random( BS.y1, BS.y2 ) } + self:T2( Vec2 ) + if self:IsVec2InZone( Vec2 ) then + Vec2Found = true + end + end + + self:T2( Vec2 ) + + return Vec2 +end + +--- Return a @{Point#POINT_VEC2} object representing a random 2D point at landheight within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return @{Point#POINT_VEC2} +function ZONE_POLYGON_BASE:GetRandomPointVec2() + self:F2() + + local PointVec2 = POINT_VEC2:NewFromVec2( self:GetRandomVec2() ) + + self:T2( PointVec2 ) + + return PointVec2 +end + +--- Return a @{Point#POINT_VEC3} object representing a random 3D point at landheight within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return @{Point#POINT_VEC3} +function ZONE_POLYGON_BASE:GetRandomPointVec3() + self:F2() + + local PointVec3 = POINT_VEC3:NewFromVec2( self:GetRandomVec2() ) + + self:T2( PointVec3 ) + + return PointVec3 +end + + +--- Get the bounding square the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return #ZONE_POLYGON_BASE.BoundingSquare The bounding square. +function ZONE_POLYGON_BASE:GetBoundingSquare() + + local x1 = self.Polygon[1].x + local y1 = self.Polygon[1].y + local x2 = self.Polygon[1].x + local y2 = self.Polygon[1].y + + for i = 2, #self.Polygon do + self:T2( { self.Polygon[i], x1, y1, x2, y2 } ) + x1 = ( x1 > self.Polygon[i].x ) and self.Polygon[i].x or x1 + x2 = ( x2 < self.Polygon[i].x ) and self.Polygon[i].x or x2 + y1 = ( y1 > self.Polygon[i].y ) and self.Polygon[i].y or y1 + y2 = ( y2 < self.Polygon[i].y ) and self.Polygon[i].y or y2 + + end + + return { x1 = x1, y1 = y1, x2 = x2, y2 = y2 } +end + + + + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Core.Zone#ZONE_POLYGON_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 Wrapper.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 GroupPoints = ZoneGroup:GetTaskRoute() + + local self = BASE:Inherit( self, ZONE_POLYGON_BASE:New( ZoneName, GroupPoints ) ) + self:F( { ZoneName, ZoneGroup, self.Polygon } ) + + return self +end + +--- This module contains the DATABASE class, managing the database of mission objects. +-- +-- ==== +-- +-- 1) @{#DATABASE} class, extends @{Base#BASE} +-- =================================================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * CLIENTS +-- * AIRPORTS +-- * PLAYERSJOINED +-- * PLAYERS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Group 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. +-- +-- 1.1) 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 alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerJoined}: Calls a function for each joined 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 + +--- DATABASE class +-- @type DATABASE +-- @extends Core.Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSJOINED = {}, + CLIENTS = {}, + AIRBASES = {}, + COUNTRY_ID = {}, + COUNTRY_NAME = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + ["plane"] = Unit.Category.AIRPLANE, + ["helicopter"] = Unit.Category.HELICOPTER, + ["vehicle"] = Unit.Category.GROUND_UNIT, + ["ship"] = Unit.Category.SHIP, + ["static"] = Unit.Category.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() ) + + self:SetEventPriority( 1 ) + + self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + + -- Follow alive players and clients + self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterClients() + self:_RegisterStatics() + self:_RegisterPlayers() + self:_RegisterAirbases() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Wrapper.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( DCSUnitName ) + + if not self.UNITS[DCSUnitName] then + local UnitRegister = UNIT:Register( DCSUnitName ) + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) + end + + return self.UNITS[DCSUnitName] +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + --self.UNITS[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStaticName ) + + if not self.STATICS[DCSStaticName] then + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) + end +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + --self.STATICS[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Wrapper.Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + +--- Adds a Airbase based on the Airbase Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddAirbase( DCSAirbaseName ) + + if not self.AIRBASES[DCSAirbaseName] then + self.AIRBASES[DCSAirbaseName] = AIRBASE:Register( DCSAirbaseName ) + end +end + + +--- Deletes a Airbase from the DATABASE based on the Airbase Name. +-- @param #DATABASE self +function DATABASE:DeleteAirbase( DCSAirbaseName ) + + --self.AIRBASES[DCSAirbaseName] = nil +end + +--- Finds a AIRBASE based on the AirbaseName. +-- @param #DATABASE self +-- @param #string AirbaseName +-- @return Wrapper.Airbase#AIRBASE The found AIRBASE. +function DATABASE:FindAirbase( AirbaseName ) + + local AirbaseFound = self.AIRBASES[AirbaseName] + return AirbaseFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Wrapper.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 ) + + if not self.CLIENTS[ClientName] then + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + end + + return self.CLIENTS[ClientName] +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Wrapper.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( GroupName ) + + if not self.GROUPS[GroupName] then + self:E( { "Add GROUP:", GroupName } ) + self.GROUPS[GroupName] = GROUP:Register( GroupName ) + end + + return self.GROUPS[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] = self:FindUnit( UnitName ) + self.PLAYERSJOINED[PlayerName] = PlayerName + 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.PLAYERS[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:F( SpawnTemplate.name ) + + self:T( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.CoalitionID + local SpawnCountryID = SpawnTemplate.CountryID + local SpawnCategoryID = SpawnTemplate.CategoryID + + -- Nullify + SpawnTemplate.CoalitionID = nil + SpawnTemplate.CountryID = nil + SpawnTemplate.CategoryID = nil + + self:_RegisterTemplate( SpawnTemplate, SpawnCoalitionID, SpawnCategoryID, SpawnCountryID ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.CoalitionID = SpawnCoalitionID + SpawnTemplate.CountryID = SpawnCountryID + SpawnTemplate.CategoryID = SpawnCategoryID + + local SpawnGroup = self:AddGroup( 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, CoalitionID, CategoryID, CountryID ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + local TraceTable = {} + + 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 + + GroupTemplate.CategoryID = CategoryID + GroupTemplate.CoalitionID = CoalitionID + GroupTemplate.CountryID = CountryID + + 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.Templates.Groups[GroupTemplateName].CategoryID = CategoryID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CountryID = CountryID + + + TraceTable[#TraceTable+1] = "Group" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].GroupName + + TraceTable[#TraceTable+1] = "Coalition" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CoalitionID + TraceTable[#TraceTable+1] = "Category" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CategoryID + TraceTable[#TraceTable+1] = "Country" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CountryID + + TraceTable[#TraceTable+1] = "Units" + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + UnitTemplate.name = env.getValueDictByKey(UnitTemplate.name) + + self.Templates.Units[UnitTemplate.name] = {} + self.Templates.Units[UnitTemplate.name].UnitName = UnitTemplate.name + self.Templates.Units[UnitTemplate.name].Template = UnitTemplate + self.Templates.Units[UnitTemplate.name].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplate.name].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplate.name].GroupId = GroupTemplate.groupId + self.Templates.Units[UnitTemplate.name].CategoryID = CategoryID + self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplate.name].CountryID = CountryID + + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplate.name] = UnitTemplate + self.Templates.ClientsByName[UnitTemplate.name].CategoryID = CategoryID + self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplate.name].CountryID = CountryID + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + + TraceTable[#TraceTable+1] = self.Templates.Units[UnitTemplate.name].UnitName + end + + self:E( TraceTable ) +end + +function DATABASE:GetGroupTemplate( GroupName ) + local GroupTemplate = self.Templates.Groups[GroupName].Template + GroupTemplate.SpawnCoalitionID = self.Templates.Groups[GroupName].CoalitionID + GroupTemplate.SpawnCategoryID = self.Templates.Groups[GroupName].CategoryID + GroupTemplate.SpawnCountryID = self.Templates.Groups[GroupName].CountryID + return GroupTemplate +end + +function DATABASE:GetGroupNameFromUnitName( UnitName ) + return self.Templates.Units[UnitName].GroupName +end + +function DATABASE:GetGroupTemplateFromUnitName( UnitName ) + return self.Templates.Units[UnitName].GroupTemplate +end + +function DATABASE:GetCoalitionFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CoalitionID +end + +function DATABASE:GetCategoryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CategoryID +end + +function DATABASE:GetCountryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CountryID +end + +--- Airbase + +function DATABASE:GetCoalitionFromAirbase( AirbaseName ) + return self.AIRBASES[AirbaseName]:GetCoalition() +end + +function DATABASE:GetCategoryFromAirbase( AirbaseName ) + return self.AIRBASES[AirbaseName]:GetCategory() +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:", DCSGroupName } ) + self:AddGroup( DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnitName } ) + self:AddUnit( DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + return self +end + +--- Private method that registers all Units of skill Client or Player within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterClients() + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Register Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +--- @param #DATABASE self +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:", DCSStaticName } ) + self:AddStatic( DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + +--- @param #DATABASE self +function DATABASE:_RegisterAirbases() + + local CoalitionsData = { AirbasesRed = coalition.getAirbases( coalition.side.RED ), AirbasesBlue = coalition.getAirbases( coalition.side.BLUE ), AirbasesNeutral = coalition.getAirbases( coalition.side.NEUTRAL ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSAirbaseId, DCSAirbase in pairs( CoalitionData ) do + + local DCSAirbaseName = DCSAirbase:getName() + + self:E( { "Register Airbase:", DCSAirbaseName } ) + self:AddAirbase( DCSAirbaseName ) + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if Event.IniObjectCategory == 3 then + self:AddStatic( Event.IniDCSUnitName ) + else + if Event.IniObjectCategory == 1 then + self:AddUnit( Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroupName ) + end + end + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if Event.IniObjectCategory == 3 then + if self.STATICS[Event.IniDCSUnitName] then + self:DeleteStatic( Event.IniDCSUnitName ) + end + else + if Event.IniObjectCategory == 1 then + if self.UNITS[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + end + end + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniUnit then + if Event.IniObjectCategory == 1 then + self:AddUnit( Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroupName ) + local PlayerName = Event.IniUnit:GetPlayerName() + if not self.PLAYERS[PlayerName] then + self:AddPlayer( Event.IniUnitName, PlayerName ) + end + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniUnit then + if Event.IniObjectCategory == 1 then + local PlayerName = Event.IniUnit:GetPlayerName() + if self.PLAYERS[PlayerName] then + self:DeletePlayer( PlayerName ) + end + 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, FinalizeFunction, 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 % 100 == 0 then +-- coroutine.yield( false ) +-- end + end + return true + end + +-- local co = coroutine.create( CoRoutine ) + local co = CoRoutine + + local function Schedule() + +-- local status, res = coroutine.resume( co ) + local status, res = co() + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + if FinalizeFunction then + FinalizeFunction( unpack( arg ) ) + 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 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, FinalizeFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, FinalizeFunction, 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 **ALIVE** 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 player who has joined the mission, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is was a player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerJoined( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSJOINED ) + + 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 + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for CoalitionName, coa_data in pairs(env.mission.coalition) do + + if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + local CoalitionSide = coalition.side[string.upper(CoalitionName)] + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[CoalitionName] = {} + 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[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 + self.Navpoints[CoalitionName][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.upper(cntry_data.name) + local CountryID = cntry_data.id + + self.COUNTRY_ID[CountryName] = CountryID + self.COUNTRY_NAME[CountryID] = CountryName + + --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 CategoryName = 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, + CoalitionSide, + _DATABASECategory[string.lower(CategoryName)], + CountryID + ) + 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 + + + + +--- **Core** - SET_ classes define **collections** of objects to perform **bulk actions** and logically **group** objects. +-- +-- ![Banner Image](..\Presentations\SET\Dia1.JPG) +-- +-- === +-- +-- SET_ classes group objects of the same type into a collection, which is either: +-- +-- * Manually managed using the **:Add...()** or **:Remove...()** methods. The initial SET can be filtered with the **@{#SET_BASE.FilterOnce}()** method +-- * Dynamically updated when new objects are created or objects are destroyed using the **@{#SET_BASE.FilterStart}()** method. +-- +-- Various types of SET_ classes are available: +-- +-- * @{#SET_UNIT}: Defines a colleciton of @{Unit}s filtered by filter criteria. +-- * @{#SET_GROUP}: Defines a collection of @{Group}s filtered by filter criteria. +-- * @{#SET_CLIENT}: Defines a collection of @{Client}s filterd by filter criteria. +-- * @{#SET_AIRBASE}: Defines a collection of @{Airbase}s filtered by filter criteria. +-- +-- These classes are derived from @{#SET_BASE}, which contains the main methods to manage SETs. +-- +-- A multitude of other methods are available in SET_ classes that allow to: +-- +-- * Validate the presence of objects in the SET. +-- * Trigger events when objects in the SET change a zone presence. +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Contributions: +-- +-- +-- @module Set + + +--- # 1) SET_BASE class, extends @{Base#BASE} +-- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. +-- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. +-- In this way, large loops can be done while not blocking the simulator main processing loop. +-- The default **"yield interval"** is after 10 objects processed. +-- The default **"time interval"** is after 0.001 seconds. +-- +-- ## 1.1) Add or remove objects from the SET +-- +-- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. +-- +-- ## 1.2) Define the SET iterator **"yield interval"** and the **"time interval"** +-- +-- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. +-- You can set the **"yield interval"**, and the **"time interval"**. (See above). +-- +-- @type SET_BASE +-- @field #table Filter +-- @field #table Set +-- @field #table List +-- @field Core.Scheduler#SCHEDULER CallScheduler +-- @extends Core.Base#BASE +SET_BASE = { + ClassName = "SET_BASE", + Filter = {}, + Set = {}, + List = {}, + Index = {}, +} + +--- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_BASE self +-- @return #SET_BASE +-- @usage +-- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = SET_BASE:New() +function SET_BASE:New( Database ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) -- Core.Set#SET_BASE + + self.Database = Database + + self.YieldInterval = 10 + self.TimeInterval = 0.001 + + self.Set = {} + + self.List = {} + self.List.__index = self.List + self.List = setmetatable( { Count = 0 }, self.List ) + + self.Index = {} + + self.CallScheduler = SCHEDULER:New( self ) + + self:SetEventPriority( 2 ) + + return self +end + +--- Finds an @{Base#BASE} object based on the object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Core.Base#BASE The Object found. +function SET_BASE:_Find( ObjectName ) + + local ObjectFound = self.Set[ObjectName] + return ObjectFound +end + + +--- Gets the Set. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:GetSet() + self:F2() + + return self.Set +end + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using a given ObjectName as the index. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @param Core.Base#BASE Object +-- @return Core.Base#BASE The added BASE Object. +function SET_BASE:Add( ObjectName, Object ) + self:F2( ObjectName ) + + local t = { _ = Object } + + if self.List.last then + self.List.last._next = t + t._prev = self.List.last + self.List.last = t + else + -- this is the first node + self.List.first = t + self.List.last = t + end + + self.List.Count = self.List.Count + 1 + + self.Set[ObjectName] = t._ + + table.insert( self.Index, ObjectName ) + +end + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. +-- @param #SET_BASE self +-- @param Wrapper.Object#OBJECT Object +-- @return Core.Base#BASE The added BASE Object. +function SET_BASE:AddObject( Object ) + self:F2( Object.ObjectName ) + + self:T( Object.UnitName ) + self:T( Object.ObjectName ) + self:Add( Object.ObjectName, Object ) + +end + + + +--- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +function SET_BASE:Remove( ObjectName ) + self:F( ObjectName ) + + local t = self.Set[ObjectName] + + self:E( { ObjectName, t } ) + + if t then + if t._next then + if t._prev then + t._next._prev = t._prev + t._prev._next = t._next + else + -- this was the first node + t._next._prev = nil + self.List._first = t._next + end + elseif t._prev then + -- this was the last node + t._prev._next = nil + self.List._last = t._prev + else + -- this was the only node + self.List._first = nil + self.List._last = nil + end + + t._next = nil + t._prev = nil + self.List.Count = self.List.Count - 1 + + for Index, Key in ipairs( self.Index ) do + if Key == ObjectName then + table.remove( self.Index, Index ) + break + end + end + + self.Set[ObjectName] = nil + + end + +end + +--- Gets a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Core.Base#BASE +function SET_BASE:Get( ObjectName ) + self:F( ObjectName ) + + local t = self.Set[ObjectName] + + self:T3( { ObjectName, t } ) + + return t + +end + +--- Gets the first object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetFirst() + self:F() + + local ObjectName = self.Index[1] + local FirstObject = self.Set[ObjectName] + self:T3( { FirstObject } ) + return FirstObject +end + +--- Gets the last object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetLast() + self:F() + + local ObjectName = self.Index[#self.Index] + local LastObject = self.Set[ObjectName] + self:T3( { LastObject } ) + return LastObject +end + +--- Gets a random object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetRandom() + self:F() + + local RandomItem = self.Set[self.Index[math.random(#self.Index)]] + + self:T3( { RandomItem } ) + + return RandomItem +end + + +--- Retrieves the amount of objects in the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return #number Count +function SET_BASE:Count() + + return #self.Index or 0 +end + + + +--- Copies the Filter criteria from a given Set (for rebuilding a new Set based on an existing Set). +-- @param #SET_BASE self +-- @param #SET_BASE BaseSet +-- @return #SET_BASE +function SET_BASE:SetDatabase( BaseSet ) + + -- Copy the filter criteria of the BaseSet + local OtherFilter = routines.utils.deepCopy( BaseSet.Filter ) + self.Filter = OtherFilter + + -- Now base the new Set on the BaseSet + self.Database = BaseSet:GetSet() + return self +end + + + +--- Define the SET iterator **"yield interval"** and the **"time interval"**. +-- @param #SET_BASE self +-- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. +-- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. +-- @return #SET_BASE self +function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) + + self.YieldInterval = YieldInterval + self.TimeInterval = TimeInterval + + return self +end + + +--- Filters for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:FilterOnce() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + end + end + + return self +end + +--- Starts the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:_FilterStart() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:E( { "Adding Object:", ObjectName } ) + self:Add( ObjectName, Object ) + end + end + + self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + + -- Follow alive players and clients + self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) + + + return self +end + +--- Stops the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:FilterStop() + + self:UnHandleEvent( EVENTS.Birth ) + self:UnHandleEvent( EVENTS.Dead ) + self:UnHandleEvent( EVENTS.Crash ) + + return self +end + +--- Iterate the SET_BASE while identifying the nearest object from a @{Point#POINT_VEC2}. +-- @param #SET_BASE self +-- @param Core.Point#POINT_VEC2 PointVec2 A @{Point#POINT_VEC2} object from where to evaluate the closest object in the set. +-- @return Core.Base#BASE The closest object. +function SET_BASE:FindNearestObjectFromPointVec2( PointVec2 ) + self:F2( PointVec2 ) + + local NearestObject = nil + local ClosestDistance = nil + + for ObjectID, ObjectData in pairs( self.Set ) do + if NearestObject == nil then + NearestObject = ObjectData + ClosestDistance = PointVec2:DistanceFromVec2( ObjectData:GetVec2() ) + else + local Distance = PointVec2:DistanceFromVec2( ObjectData:GetVec2() ) + if Distance < ClosestDistance then + NearestObject = ObjectData + ClosestDistance = Distance + end + end + end + + return NearestObject +end + + + +----- Private method that registers all alive players in the mission. +---- @param #SET_BASE self +---- @return #SET_BASE self +--function SET_BASE:_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() +-- if not self.PlayersAlive[UnitName] then +-- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) +-- self.PlayersAlive[UnitName] = UnitData:getPlayerName() +-- end +-- end +-- end +-- end +-- +-- return self +--end + +--- Events + +--- Handles the OnBirth event for the Set. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnBirth( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if Object and self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnDeadOrCrash( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:FindInDatabase( Event ) + if ObjectName and Object ~= nil then + self:Remove( ObjectName ) + end + end +end + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnPlayerEnterUnit( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnPlayerLeaveUnit( Event ) + self:F3( { Event } ) + + local ObjectName = Event.IniDCSUnit + if Event.IniDCSUnit then + if Event.IniDCSGroup then + local GroupUnits = Event.IniDCSGroup:getUnits() + local PlayerCount = 0 + for _, DCSUnit in pairs( GroupUnits ) do + if DCSUnit ~= Event.IniDCSUnit then + if DCSUnit:getPlayer() ~= nil then + PlayerCount = PlayerCount + 1 + end + end + end + self:E(PlayerCount) + if PlayerCount == 0 then + self:Remove( Event.IniDCSGroupName ) + end + end + end +end + +-- Iterators + +--- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. +-- @param #SET_BASE self +-- @param #function IteratorFunction The function that will be called. +-- @return #SET_BASE self +function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) + self:F3( arg ) + + Set = Set or self:GetSet() + arg = arg or {} + + local function CoRoutine() + local Count = 0 + for ObjectID, ObjectData in pairs( Set ) do + local Object = ObjectData + self:T3( Object ) + if Function then + if Function( unpack( FunctionArguments ), Object ) == true then + IteratorFunction( Object, unpack( arg ) ) + end + else + IteratorFunction( Object, unpack( arg ) ) + end + Count = Count + 1 +-- if Count % self.YieldInterval == 0 then +-- coroutine.yield( false ) +-- end + end + return true + end + +-- local co = coroutine.create( CoRoutine ) + local co = CoRoutine + + local function Schedule() + +-- local status, res = coroutine.resume( co ) + local status, res = co() + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + --self.CallScheduler:Schedule( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + Schedule() + + return self +end + + +----- Iterate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) +-- +-- return self +--end +-- +----- Iterate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachPlayer( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachClient( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- Decides whether to include the Object +-- @param #SET_BASE self +-- @param #table Object +-- @return #SET_BASE self +function SET_BASE:IsIncludeObject( Object ) + self:F3( Object ) + + return true +end + +--- Flushes the current SET_BASE contents in the log ... (for debugging reasons). +-- @param #SET_BASE self +-- @return #string A string with the names of the objects. +function SET_BASE:Flush() + self:F3() + + local ObjectNames = "" + for ObjectName, Object in pairs( self.Set ) do + ObjectNames = ObjectNames .. ObjectName .. ", " + end + self:E( { "Objects in Set:", ObjectNames } ) + + return ObjectNames +end + +-- SET_GROUP + +--- # 2) SET_GROUP class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Starting with certain prefix strings. +-- +-- ## 2.1) SET_GROUP constructor +-- +-- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: +-- +-- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. +-- +-- ## 2.2) Add or Remove GROUP(s) from SET_GROUP +-- +-- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. +-- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. +-- +-- ## 2.3) SET_GROUP filter criteria +-- +-- You can set filter criteria to define the set of groups within the SET_GROUP. +-- Filter criteria are defined by: +-- +-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). +-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). +-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). +-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: +-- +-- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. +-- +-- ## 2.4) SET_GROUP iterators +-- +-- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. +-- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_GROUP: +-- +-- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- @type SET_GROUP +-- @extends Core.Set#SET_BASE +SET_GROUP = { + ClassName = "SET_GROUP", + Filter = { + Coalitions = nil, + Categories = nil, + Countries = nil, + GroupPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Group.Category.AIRPLANE, + helicopter = Group.Category.HELICOPTER, + ground = Group.Category.GROUND_UNIT, + ship = Group.Category.SHIP, + structure = Group.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_GROUP self +-- @return #SET_GROUP +-- @usage +-- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. +-- DBObject = SET_GROUP:New() +function SET_GROUP:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) + + return self +end + +--- Add GROUP(s) to SET_GROUP. +-- @param Core.Set#SET_GROUP self +-- @param #string AddGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:AddGroupsByName( AddGroupNames ) + + local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } + + for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do + self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) + end + + return self +end + +--- Remove GROUP(s) from SET_GROUP. +-- @param Core.Set#SET_GROUP self +-- @param Wrapper.Group#GROUP RemoveGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) + + local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } + + for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do + self:Remove( RemoveGroupName.GroupName ) + end + + return self +end + + + + +--- Finds a Group based on the Group Name. +-- @param #SET_GROUP self +-- @param #string GroupName +-- @return Wrapper.Group#GROUP The found Group. +function SET_GROUP:FindGroup( GroupName ) + + local GroupFound = self.Set[GroupName] + return GroupFound +end + + + +--- Builds a set of groups of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_GROUP self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_GROUP self +function SET_GROUP:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of groups out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_GROUP self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_GROUP self +function SET_GROUP:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Builds a set of groups of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_GROUP self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_GROUP self +function SET_GROUP:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of groups of defined GROUP prefixes. +-- All the groups starting with the given prefixes will be included within the set. +-- @param #SET_GROUP self +-- @param #string Prefixes The prefix of which the group name starts with. +-- @return #SET_GROUP self +function SET_GROUP:FilterPrefixes( Prefixes ) + if not self.Filter.GroupPrefixes then + self.Filter.GroupPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.GroupPrefixes[Prefix] = Prefix + end + return self +end + + +--- Starts the filtering. +-- @param #SET_GROUP self +-- @return #SET_GROUP self +function SET_GROUP:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_GROUP self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:AddInDatabase( Event ) + self:F3( { Event } ) + + if Event.IniObjectCategory == 1 then + if not self.Database[Event.IniDCSGroupName] then + self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) + self:T3( self.Database[Event.IniDCSGroupName] ) + end + end + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_GROUP self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #SET_GROUP self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsPartlyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + +----- Iterate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_GROUP self +-- @param Wrapper.Group#GROUP MooseGroup +-- @return #SET_GROUP self +function SET_GROUP:IsIncludeObject( MooseGroup ) + self:F2( MooseGroup ) + local MooseGroupInclude = true + + if self.Filter.Coalitions then + local MooseGroupCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then + MooseGroupCoalition = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition + end + + if self.Filter.Categories then + local MooseGroupCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then + MooseGroupCategory = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCategory + end + + if self.Filter.Countries then + local MooseGroupCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) + if country.id[CountryName] == MooseGroup:GetCountry() then + MooseGroupCountry = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCountry + end + + if self.Filter.GroupPrefixes then + local MooseGroupPrefix = false + for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do + self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) + if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then + MooseGroupPrefix = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix + end + + self:T2( MooseGroupInclude ) + return MooseGroupInclude +end + +--- # 3) SET_UNIT class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the SET_UNIT class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Unit types +-- * Starting with certain prefix strings. +-- +-- ## 3.1) SET_UNIT constructor +-- +-- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: +-- +-- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. +-- +-- ## 3.2) Add or Remove UNIT(s) from SET_UNIT +-- +-- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. +-- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. +-- +-- ## 3.3) SET_UNIT filter criteria +-- +-- You can set filter criteria to define the set of units within the SET_UNIT. +-- Filter criteria are defined by: +-- +-- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). +-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). +-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). +-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). +-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: +-- +-- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. +-- +-- ## 3.4) SET_UNIT iterators +-- +-- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. +-- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_UNIT: +-- +-- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- Planned iterators methods in development are (so these are not yet available): +-- +-- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. +-- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- +-- ## 3.5 ) SET_UNIT atomic methods +-- +-- Various methods exist for a SET_UNIT to perform actions or calculations and retrieve results from the SET_UNIT: +-- +-- * @{#SET_UNIT.GetTypeNames}(): Retrieve the type names of the @{Unit}s in the SET, delimited by a comma. +-- +-- +-- @type SET_UNIT +-- @extends Core.Set#SET_BASE +SET_UNIT = { + ClassName = "SET_UNIT", + Units = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + UnitPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_UNIT self +-- @return #SET_UNIT +-- @usage +-- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. +-- DBObject = SET_UNIT:New() +function SET_UNIT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) + + return self +end + +--- Add UNIT(s) to SET_UNIT. +-- @param #SET_UNIT self +-- @param #string AddUnit A single UNIT. +-- @return #SET_UNIT self +function SET_UNIT:AddUnit( AddUnit ) + self:F2( AddUnit:GetName() ) + + self:Add( AddUnit:GetName(), AddUnit ) + + return self +end + + +--- Add UNIT(s) to SET_UNIT. +-- @param #SET_UNIT self +-- @param #string AddUnitNames A single name or an array of UNIT names. +-- @return #SET_UNIT self +function SET_UNIT:AddUnitsByName( AddUnitNames ) + + local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } + + self:T( AddUnitNamesArray ) + for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do + self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) + end + + return self +end + +--- Remove UNIT(s) from SET_UNIT. +-- @param Core.Set#SET_UNIT self +-- @param Wrapper.Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) + + local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } + + for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do + self:Remove( RemoveUnitName ) + end + + return self +end + + +--- Finds a Unit based on the Unit Name. +-- @param #SET_UNIT self +-- @param #string UnitName +-- @return Wrapper.Unit#UNIT The found Unit. +function SET_UNIT:FindUnit( UnitName ) + + local UnitFound = self.Set[UnitName] + return UnitFound +end + + + +--- Builds a set of units of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_UNIT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_UNIT self +function SET_UNIT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of units out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_UNIT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_UNIT self +function SET_UNIT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of units of defined unit types. +-- Possible current types are those types known within DCS world. +-- @param #SET_UNIT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of units of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_UNIT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of units of defined unit prefixes. +-- All the units starting with the given prefixes will be included within the set. +-- @param #SET_UNIT self +-- @param #string Prefixes The prefix of which the unit name starts with. +-- @return #SET_UNIT self +function SET_UNIT:FilterPrefixes( Prefixes ) + if not self.Filter.UnitPrefixes then + self.Filter.UnitPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.UnitPrefixes[Prefix] = Prefix + end + return self +end + +--- Builds a set of units having a radar of give types. +-- All the units having a radar of a given type will be included within the set. +-- @param #SET_UNIT self +-- @param #table RadarTypes The radar types. +-- @return #SET_UNIT self +function SET_UNIT:FilterHasRadar( RadarTypes ) + + self.Filter.RadarTypes = self.Filter.RadarTypes or {} + if type( RadarTypes ) ~= "table" then + RadarTypes = { RadarTypes } + end + for RadarTypeID, RadarType in pairs( RadarTypes ) do + self.Filter.RadarTypes[RadarType] = RadarType + end + return self +end + +--- Builds a set of SEADable units. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterHasSEAD() + + self.Filter.SEAD = true + return self +end + + + +--- Starts the filtering. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_UNIT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:AddInDatabase( Event ) + self:F3( { Event } ) + + if Event.IniObjectCategory == 1 then + if not self.Database[Event.IniDCSUnitName] then + self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) + self:T3( self.Database[Event.IniDCSUnitName] ) + end + end + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_UNIT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:FindInDatabase( Event ) + self:E( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + + + return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] +end + +--- Iterate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #SET_UNIT self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Returns map of unit types. +-- @param #SET_UNIT self +-- @return #map<#string,#number> A map of the unit types found. The key is the UnitTypeName and the value is the amount of unit types found. +function SET_UNIT:GetUnitTypes() + self:F2() + + local MT = {} -- Message Text + local UnitTypes = {} + + for UnitID, UnitData in pairs( self:GetSet() ) do + local TextUnit = UnitData -- Wrapper.Unit#UNIT + if TextUnit:IsAlive() then + local UnitType = TextUnit:GetTypeName() + + if not UnitTypes[UnitType] then + UnitTypes[UnitType] = 1 + else + UnitTypes[UnitType] = UnitTypes[UnitType] + 1 + end + end + end + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return UnitTypes +end + + +--- Returns a comma separated string of the unit types with a count in the @{Set}. +-- @param #SET_UNIT self +-- @return #string The unit types string +function SET_UNIT:GetUnitTypesText() + self:F2() + + local MT = {} -- Message Text + local UnitTypes = self:GetUnitTypes() + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return table.concat( MT, ", " ) +end + +--- Returns map of unit threat levels. +-- @param #SET_UNIT self +-- @return #table. +function SET_UNIT:GetUnitThreatLevels() + self:F2() + + local UnitThreatLevels = {} + + for UnitID, UnitData in pairs( self:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + if ThreatUnit:IsAlive() then + local UnitThreatLevel, UnitThreatLevelText = ThreatUnit:GetThreatLevel() + local ThreatUnitName = ThreatUnit:GetName() + + UnitThreatLevels[UnitThreatLevel] = UnitThreatLevels[UnitThreatLevel] or {} + UnitThreatLevels[UnitThreatLevel].UnitThreatLevelText = UnitThreatLevelText + UnitThreatLevels[UnitThreatLevel].Units = UnitThreatLevels[UnitThreatLevel].Units or {} + UnitThreatLevels[UnitThreatLevel].Units[ThreatUnitName] = ThreatUnit + end + end + + return UnitThreatLevels +end + +--- Calculate the maxium A2G threat level of the SET_UNIT. +-- @param #SET_UNIT self +function SET_UNIT:CalculateThreatLevelA2G() + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( self:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + return MaxThreatLevelA2G + +end + + +--- Returns if the @{Set} has targets having a radar (of a given type). +-- @param #SET_UNIT self +-- @param Dcs.DCSWrapper.Unit#Unit.RadarType RadarType +-- @return #number The amount of radars in the Set with the given type +function SET_UNIT:HasRadar( RadarType ) + self:F2( RadarType ) + + local RadarCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitSensorTest = UnitData -- Wrapper.Unit#UNIT + local HasSensors + if RadarType then + HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR, RadarType ) + else + HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR ) + end + self:T3(HasSensors) + if HasSensors then + RadarCount = RadarCount + 1 + end + end + + return RadarCount +end + +--- Returns if the @{Set} has targets that can be SEADed. +-- @param #SET_UNIT self +-- @return #number The amount of SEADable units in the Set +function SET_UNIT:HasSEAD() + self:F2() + + local SEADCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitSEAD = UnitData -- Wrapper.Unit#UNIT + if UnitSEAD:IsAlive() then + local UnitSEADAttributes = UnitSEAD:GetDesc().attributes + + local HasSEAD = UnitSEAD:HasSEAD() + + self:T3(HasSEAD) + if HasSEAD then + SEADCount = SEADCount + 1 + end + end + end + + return SEADCount +end + +--- Returns if the @{Set} has ground targets. +-- @param #SET_UNIT self +-- @return #number The amount of ground targets in the Set. +function SET_UNIT:HasGroundUnits() + self:F2() + + local GroundUnitCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitTest = UnitData -- Wrapper.Unit#UNIT + if UnitTest:IsGround() then + GroundUnitCount = GroundUnitCount + 1 + end + end + + return GroundUnitCount +end + +--- Returns if the @{Set} has friendly ground units. +-- @param #SET_UNIT self +-- @return #number The amount of ground targets in the Set. +function SET_UNIT:HasFriendlyUnits( FriendlyCoalition ) + self:F2() + + local FriendlyUnitCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitTest = UnitData -- Wrapper.Unit#UNIT + if UnitTest:IsFriendly( FriendlyCoalition ) then + FriendlyUnitCount = FriendlyUnitCount + 1 + end + end + + return FriendlyUnitCount +end + + + +----- Iterate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_UNIT self +-- @param Wrapper.Unit#UNIT MUnit +-- @return #SET_UNIT self +function SET_UNIT:IsIncludeObject( MUnit ) + self:F2( MUnit ) + local MUnitInclude = true + + if self.Filter.Coalitions then + local MUnitCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then + MUnitCoalition = true + end + end + MUnitInclude = MUnitInclude and MUnitCoalition + end + + if self.Filter.Categories then + local MUnitCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then + MUnitCategory = true + end + end + MUnitInclude = MUnitInclude and MUnitCategory + end + + if self.Filter.Types then + local MUnitType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) + if TypeName == MUnit:GetTypeName() then + MUnitType = true + end + end + MUnitInclude = MUnitInclude and MUnitType + end + + if self.Filter.Countries then + local MUnitCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) + if country.id[CountryName] == MUnit:GetCountry() then + MUnitCountry = true + end + end + MUnitInclude = MUnitInclude and MUnitCountry + end + + if self.Filter.UnitPrefixes then + local MUnitPrefix = false + for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do + self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) + if string.find( MUnit:GetName(), UnitPrefix, 1 ) then + MUnitPrefix = true + end + end + MUnitInclude = MUnitInclude and MUnitPrefix + end + + if self.Filter.RadarTypes then + local MUnitRadar = false + for RadarTypeID, RadarType in pairs( self.Filter.RadarTypes ) do + self:T3( { "Radar:", RadarType } ) + if MUnit:HasSensors( Unit.SensorType.RADAR, RadarType ) == true then + if MUnit:GetRadar() == true then -- This call is necessary to evaluate the SEAD capability. + self:T3( "RADAR Found" ) + end + MUnitRadar = true + end + end + MUnitInclude = MUnitInclude and MUnitRadar + end + + if self.Filter.SEAD then + local MUnitSEAD = false + if MUnit:HasSEAD() == true then + self:T3( "SEAD Found" ) + MUnitSEAD = true + end + MUnitInclude = MUnitInclude and MUnitSEAD + end + + self:T2( MUnitInclude ) + return MUnitInclude +end + + +--- Retrieve the type names of the @{Unit}s in the SET, delimited by an optional delimiter. +-- @param #SET_UNIT self +-- @param #string Delimiter (optional) The delimiter, which is default a comma. +-- @return #string The types of the @{Unit}s delimited. +function SET_UNIT:GetTypeNames( Delimiter ) + + Delimiter = Delimiter or ", " + local TypeReport = REPORT:New() + local Types = {} + + for UnitName, UnitData in pairs( self:GetSet() ) do + + local Unit = UnitData -- Wrapper.Unit#UNIT + local UnitTypeName = Unit:GetTypeName() + + if not Types[UnitTypeName] then + Types[UnitTypeName] = UnitTypeName + TypeReport:Add( UnitTypeName ) + end + end + + return TypeReport:Text( Delimiter ) +end + + +--- SET_CLIENT + +--- # 4) SET_CLIENT class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Client types +-- * Starting with certain prefix strings. +-- +-- ## 4.1) SET_CLIENT constructor +-- +-- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: +-- +-- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. +-- +-- ## 4.2) Add or Remove CLIENT(s) from SET_CLIENT +-- +-- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. +-- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. +-- +-- ## 4.3) SET_CLIENT filter criteria +-- +-- You can set filter criteria to define the set of clients within the SET_CLIENT. +-- Filter criteria are defined by: +-- +-- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). +-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). +-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). +-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). +-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: +-- +-- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. +-- +-- ## 4.4) SET_CLIENT iterators +-- +-- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. +-- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_CLIENT: +-- +-- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. +-- +-- @type SET_CLIENT +-- @extends Core.Set#SET_BASE +SET_CLIENT = { + ClassName = "SET_CLIENT", + Clients = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + ClientPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT +-- @usage +-- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. +-- DBObject = SET_CLIENT:New() +function SET_CLIENT:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) + + return self +end + +--- Add CLIENT(s) to SET_CLIENT. +-- @param Core.Set#SET_CLIENT self +-- @param #string AddClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:AddClientsByName( AddClientNames ) + + local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } + + for AddClientID, AddClientName in pairs( AddClientNamesArray ) do + self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + end + + return self +end + +--- Remove CLIENT(s) from SET_CLIENT. +-- @param Core.Set#SET_CLIENT self +-- @param Wrapper.Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) + + local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } + + for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do + self:Remove( RemoveClientName.ClientName ) + end + + return self +end + + +--- Finds a Client based on the Client Name. +-- @param #SET_CLIENT self +-- @param #string ClientName +-- @return Wrapper.Client#CLIENT The found Client. +function SET_CLIENT:FindClient( ClientName ) + + local ClientFound = self.Set[ClientName] + return ClientFound +end + + + +--- Builds a set of clients of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_CLIENT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of clients out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_CLIENT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of clients of defined client types. +-- Possible current types are those types known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of clients of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of clients of defined client prefixes. +-- All the clients starting with the given prefixes will be included within the set. +-- @param #SET_CLIENT self +-- @param #string Prefixes The prefix of which the client name starts with. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterPrefixes( Prefixes ) + if not self.Filter.ClientPrefixes then + self.Filter.ClientPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.ClientPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT self +function SET_CLIENT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_CLIENT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_CLIENT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Iterate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. +-- @param #SET_CLIENT self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- +-- @param #SET_CLIENT self +-- @param Wrapper.Client#CLIENT MClient +-- @return #SET_CLIENT self +function SET_CLIENT:IsIncludeObject( MClient ) + self:F2( MClient ) + + local MClientInclude = true + + if MClient then + local MClientName = MClient.UnitName + + if self.Filter.Coalitions then + local MClientCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then + MClientCoalition = true + end + end + self:T( { "Evaluated Coalition", MClientCoalition } ) + MClientInclude = MClientInclude and MClientCoalition + end + + if self.Filter.Categories then + local MClientCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then + MClientCategory = true + end + end + self:T( { "Evaluated Category", MClientCategory } ) + MClientInclude = MClientInclude and MClientCategory + end + + if self.Filter.Types then + local MClientType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) + if TypeName == MClient:GetTypeName() then + MClientType = true + end + end + self:T( { "Evaluated Type", MClientType } ) + MClientInclude = MClientInclude and MClientType + end + + if self.Filter.Countries then + local MClientCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + if country.id[CountryName] and country.id[CountryName] == ClientCountryID then + MClientCountry = true + end + end + self:T( { "Evaluated Country", MClientCountry } ) + MClientInclude = MClientInclude and MClientCountry + end + + if self.Filter.ClientPrefixes then + local MClientPrefix = false + for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do + self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) + if string.find( MClient.UnitName, ClientPrefix, 1 ) then + MClientPrefix = true + end + end + self:T( { "Evaluated Prefix", MClientPrefix } ) + MClientInclude = MClientInclude and MClientPrefix + end + end + + self:T2( MClientInclude ) + return MClientInclude +end + +--- SET_AIRBASE + +--- # 5) SET_AIRBASE class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_AIRBASE} class to build sets of airbases optionally belonging to certain: +-- +-- * Coalitions +-- +-- ## 5.1) SET_AIRBASE constructor +-- +-- Create a new SET_AIRBASE object with the @{#SET_AIRBASE.New} method: +-- +-- * @{#SET_AIRBASE.New}: Creates a new SET_AIRBASE object. +-- +-- ## 5.2) Add or Remove AIRBASEs from SET_AIRBASE +-- +-- AIRBASEs can be added and removed using the @{Set#SET_AIRBASE.AddAirbasesByName} and @{Set#SET_AIRBASE.RemoveAirbasesByName} respectively. +-- These methods take a single AIRBASE name or an array of AIRBASE names to be added or removed from SET_AIRBASE. +-- +-- ## 5.3) SET_AIRBASE filter criteria +-- +-- You can set filter criteria to define the set of clients within the SET_AIRBASE. +-- Filter criteria are defined by: +-- +-- * @{#SET_AIRBASE.FilterCoalitions}: Builds the SET_AIRBASE with the airbases belonging to the coalition(s). +-- +-- Once the filter criteria have been set for the SET_AIRBASE, you can start filtering using: +-- +-- * @{#SET_AIRBASE.FilterStart}: Starts the filtering of the airbases within the SET_AIRBASE. +-- +-- ## 5.4) SET_AIRBASE iterators +-- +-- Once the filters have been defined and the SET_AIRBASE has been built, you can iterate the SET_AIRBASE with the available iterator methods. +-- The iterator methods will walk the SET_AIRBASE set, and call for each airbase within the set a function that you provide. +-- The following iterator methods are currently available within the SET_AIRBASE: +-- +-- * @{#SET_AIRBASE.ForEachAirbase}: Calls a function for each airbase it finds within the SET_AIRBASE. +-- +-- @type SET_AIRBASE +-- @extends Core.Set#SET_BASE +SET_AIRBASE = { + ClassName = "SET_AIRBASE", + Airbases = {}, + Filter = { + Coalitions = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + airdrome = Airbase.Category.AIRDROME, + helipad = Airbase.Category.HELIPAD, + ship = Airbase.Category.SHIP, + }, + }, +} + + +--- Creates a new SET_AIRBASE object, building a set of airbases belonging to a coalitions and categories. +-- @param #SET_AIRBASE self +-- @return #SET_AIRBASE self +-- @usage +-- -- Define a new SET_AIRBASE Object. The DatabaseSet will contain a reference to all Airbases. +-- DatabaseSet = SET_AIRBASE:New() +function SET_AIRBASE:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.AIRBASES ) ) + + return self +end + +--- Add AIRBASEs to SET_AIRBASE. +-- @param Core.Set#SET_AIRBASE self +-- @param #string AddAirbaseNames A single name or an array of AIRBASE names. +-- @return self +function SET_AIRBASE:AddAirbasesByName( AddAirbaseNames ) + + local AddAirbaseNamesArray = ( type( AddAirbaseNames ) == "table" ) and AddAirbaseNames or { AddAirbaseNames } + + for AddAirbaseID, AddAirbaseName in pairs( AddAirbaseNamesArray ) do + self:Add( AddAirbaseName, AIRBASE:FindByName( AddAirbaseName ) ) + end + + return self +end + +--- Remove AIRBASEs from SET_AIRBASE. +-- @param Core.Set#SET_AIRBASE self +-- @param Wrapper.Airbase#AIRBASE RemoveAirbaseNames A single name or an array of AIRBASE names. +-- @return self +function SET_AIRBASE:RemoveAirbasesByName( RemoveAirbaseNames ) + + local RemoveAirbaseNamesArray = ( type( RemoveAirbaseNames ) == "table" ) and RemoveAirbaseNames or { RemoveAirbaseNames } + + for RemoveAirbaseID, RemoveAirbaseName in pairs( RemoveAirbaseNamesArray ) do + self:Remove( RemoveAirbaseName.AirbaseName ) + end + + return self +end + + +--- Finds a Airbase based on the Airbase Name. +-- @param #SET_AIRBASE self +-- @param #string AirbaseName +-- @return Wrapper.Airbase#AIRBASE The found Airbase. +function SET_AIRBASE:FindAirbase( AirbaseName ) + + local AirbaseFound = self.Set[AirbaseName] + return AirbaseFound +end + + + +--- Builds a set of airbases of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_AIRBASE self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of airbases out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_AIRBASE self +-- @param #string Categories Can take the following values: "airdrome", "helipad", "ship". +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Starts the filtering. +-- @param #SET_AIRBASE self +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_AIRBASE self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the AIRBASE +-- @return #table The AIRBASE +function SET_AIRBASE:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_AIRBASE self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the AIRBASE +-- @return #table The AIRBASE +function SET_AIRBASE:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Iterate the SET_AIRBASE and call an interator function for each AIRBASE, providing the AIRBASE and optional parameters. +-- @param #SET_AIRBASE self +-- @param #function IteratorFunction The function that will be called when there is an alive AIRBASE in the SET_AIRBASE. The function needs to accept a AIRBASE parameter. +-- @return #SET_AIRBASE self +function SET_AIRBASE:ForEachAirbase( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_AIRBASE while identifying the nearest @{Airbase#AIRBASE} from a @{Point#POINT_VEC2}. +-- @param #SET_AIRBASE self +-- @param Core.Point#POINT_VEC2 PointVec2 A @{Point#POINT_VEC2} object from where to evaluate the closest @{Airbase#AIRBASE}. +-- @return Wrapper.Airbase#AIRBASE The closest @{Airbase#AIRBASE}. +function SET_AIRBASE:FindNearestAirbaseFromPointVec2( PointVec2 ) + self:F2( PointVec2 ) + + local NearestAirbase = self:FindNearestObjectFromPointVec2( PointVec2 ) + return NearestAirbase +end + + + +--- +-- @param #SET_AIRBASE self +-- @param Wrapper.Airbase#AIRBASE MAirbase +-- @return #SET_AIRBASE self +function SET_AIRBASE:IsIncludeObject( MAirbase ) + self:F2( MAirbase ) + + local MAirbaseInclude = true + + if MAirbase then + local MAirbaseName = MAirbase:GetName() + + if self.Filter.Coalitions then + local MAirbaseCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local AirbaseCoalitionID = _DATABASE:GetCoalitionFromAirbase( MAirbaseName ) + self:T3( { "Coalition:", AirbaseCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == AirbaseCoalitionID then + MAirbaseCoalition = true + end + end + self:T( { "Evaluated Coalition", MAirbaseCoalition } ) + MAirbaseInclude = MAirbaseInclude and MAirbaseCoalition + end + + if self.Filter.Categories then + local MAirbaseCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local AirbaseCategoryID = _DATABASE:GetCategoryFromAirbase( MAirbaseName ) + self:T3( { "Category:", AirbaseCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == AirbaseCategoryID then + MAirbaseCategory = true + end + end + self:T( { "Evaluated Category", MAirbaseCategory } ) + MAirbaseInclude = MAirbaseInclude and MAirbaseCategory + end + end + + self:T2( MAirbaseInclude ) + return MAirbaseInclude +end +--- **Core** - **POINT\_VEC** classes define an **extensive API** to **manage 3D points** in the simulation space. +-- +-- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} +-- ================================================== +-- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. +-- +-- **Important Note:** Most of the functions in this section were taken from MIST, and reworked to OO concepts. +-- In order to keep the credibility of the the author, I want to emphasize that the of the MIST framework was created by Grimes, who you can find on the Eagle Dynamics Forums. +-- +-- ## 1.1) POINT_VEC3 constructor +-- +-- A new POINT_VEC3 instance can be created with: +-- +-- * @{Point#POINT_VEC3.New}(): a 3D point. +-- * @{Point#POINT_VEC3.NewFromVec3}(): a 3D point created from a @{DCSTypes#Vec3}. +-- +-- ## 1.2) Manupulate the X, Y, Z coordinates of the point +-- +-- A POINT_VEC3 class works in 3D space. It contains internally an X, Y, Z coordinate. +-- Methods exist to manupulate these coordinates. +-- +-- The current X, Y, Z axis can be retrieved with the methods @{#POINT_VEC3.GetX}(), @{#POINT_VEC3.GetY}(), @{#POINT_VEC3.GetZ}() respectively. +-- The methods @{#POINT_VEC3.SetX}(), @{#POINT_VEC3.SetY}(), @{#POINT_VEC3.SetZ}() change the respective axis with a new value. +-- The current axis values can be changed by using the methods @{#POINT_VEC3.AddX}(), @{#POINT_VEC3.AddY}(), @{#POINT_VEC3.AddZ}() +-- to add or substract a value from the current respective axis value. +-- Note that the Set and Add methods return the current POINT_VEC3 object, so these manipulation methods can be chained... For example: +-- +-- local Vec3 = PointVec3:AddX( 100 ):AddZ( 150 ):GetVec3() +-- +-- ## 1.3) Create waypoints for routes +-- +-- A POINT_VEC3 can prepare waypoints for Ground, Air and Naval groups to be embedded into a Route. +-- +-- +-- ## 1.5) Smoke, flare, explode, illuminate +-- +-- At the point a smoke, flare, explosion and illumination bomb can be triggered. Use the following methods: +-- +-- ### 1.5.1) Smoke +-- +-- * @{#POINT_VEC3.Smoke}(): To smoke the point in a certain color. +-- * @{#POINT_VEC3.SmokeBlue}(): To smoke the point in blue. +-- * @{#POINT_VEC3.SmokeRed}(): To smoke the point in red. +-- * @{#POINT_VEC3.SmokeOrange}(): To smoke the point in orange. +-- * @{#POINT_VEC3.SmokeWhite}(): To smoke the point in white. +-- * @{#POINT_VEC3.SmokeGreen}(): To smoke the point in green. +-- +-- ### 1.5.2) Flare +-- +-- * @{#POINT_VEC3.Flare}(): To flare the point in a certain color. +-- * @{#POINT_VEC3.FlareRed}(): To flare the point in red. +-- * @{#POINT_VEC3.FlareYellow}(): To flare the point in yellow. +-- * @{#POINT_VEC3.FlareWhite}(): To flare the point in white. +-- * @{#POINT_VEC3.FlareGreen}(): To flare the point in green. +-- +-- ### 1.5.3) Explode +-- +-- * @{#POINT_VEC3.Explosion}(): To explode the point with a certain intensity. +-- +-- ### 1.5.4) Illuminate +-- +-- * @{#POINT_VEC3.IlluminationBomb}(): To illuminate the 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_VEC2 instance can be created with: +-- +-- * @{Point#POINT_VEC2.New}(): a 2D point, taking an additional height parameter. +-- * @{Point#POINT_VEC2.NewFromVec2}(): a 2D point created from a @{DCSTypes#Vec2}. +-- +-- ## 1.2) Manupulate the X, Altitude, Y coordinates of the 2D point +-- +-- A POINT_VEC2 class works in 2D space, with an altitude setting. It contains internally an X, Altitude, Y coordinate. +-- Methods exist to manupulate these coordinates. +-- +-- The current X, Altitude, Y axis can be retrieved with the methods @{#POINT_VEC2.GetX}(), @{#POINT_VEC2.GetAlt}(), @{#POINT_VEC2.GetY}() respectively. +-- The methods @{#POINT_VEC2.SetX}(), @{#POINT_VEC2.SetAlt}(), @{#POINT_VEC2.SetY}() change the respective axis with a new value. +-- The current Lat(itude), Alt(itude), Lon(gitude) values can also be retrieved with the methods @{#POINT_VEC2.GetLat}(), @{#POINT_VEC2.GetAlt}(), @{#POINT_VEC2.GetLon}() respectively. +-- The current axis values can be changed by using the methods @{#POINT_VEC2.AddX}(), @{#POINT_VEC2.AddAlt}(), @{#POINT_VEC2.AddY}() +-- to add or substract a value from the current respective axis value. +-- Note that the Set and Add methods return the current POINT_VEC2 object, so these manipulation methods can be chained... For example: +-- +-- local Vec2 = PointVec2:AddX( 100 ):AddY( 2000 ):GetVec2() +-- +-- === +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-03: POINT\_VEC3:**Explosion( ExplosionIntensity )** added. +-- 2017-03-03: POINT\_VEC3:**IlluminationBomb()** added. +-- +-- 2017-02-18: POINT\_VEC3:**NewFromVec2( Vec2, LandHeightAdd )** added. +-- +-- 2016-08-12: POINT\_VEC3:**Translate( Distance, Angle )** added. +-- +-- 2016-08-06: Made PointVec3 and Vec3, PointVec2 and Vec2 terminology used in the code consistent. +-- +-- * Replaced method _Point_Vec3() to **Vec3**() where the code manages a Vec3. Replaced all references to the method. +-- * Replaced method _Point_Vec2() to **Vec2**() where the code manages a Vec2. Replaced all references to the method. +-- * Replaced method Random_Point_Vec3() to **RandomVec3**() where the code manages a Vec3. Replaced all references to the method. +-- . +-- === +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Contributions: +-- +-- @module Point + +--- The POINT_VEC3 class +-- @type POINT_VEC3 +-- @field #number x The x coordinate in 3D space. +-- @field #number y The y coordinate in 3D space. +-- @field #number z The z coordiante in 3D space. +-- @field Utilities.Utils#SMOKECOLOR SmokeColor +-- @field Utilities.Utils#FLARECOLOR FlareColor +-- @field #POINT_VEC3.RoutePointAltType RoutePointAltType +-- @field #POINT_VEC3.RoutePointType RoutePointType +-- @field #POINT_VEC3.RoutePointAction RoutePointAction +-- @extends Core.Base#BASE +POINT_VEC3 = { + ClassName = "POINT_VEC3", + Metric = true, + RoutePointAltType = { + BARO = "BARO", + }, + RoutePointType = { + TakeOffParking = "TakeOffParking", + TurningPoint = "Turning Point", + }, + RoutePointAction = { + FromParkingArea = "From Parking Area", + TurningPoint = "Turning Point", + }, +} + +--- The POINT_VEC2 class +-- @type POINT_VEC2 +-- @field Dcs.DCSTypes#Distance x The x coordinate in meters. +-- @field Dcs.DCSTypes#Distance y the y coordinate in meters. +-- @extends Core.Point#POINT_VEC3 +POINT_VEC2 = { + ClassName = "POINT_VEC2", +} + + +do -- POINT_VEC3 + +--- RoutePoint AltTypes +-- @type POINT_VEC3.RoutePointAltType +-- @field BARO "BARO" + +--- RoutePoint Types +-- @type POINT_VEC3.RoutePointType +-- @field TakeOffParking "TakeOffParking" +-- @field TurningPoint "Turning Point" + +--- RoutePoint Actions +-- @type POINT_VEC3.RoutePointAction +-- @field FromParkingArea "From Parking Area" +-- @field TurningPoint "Turning Point" + +-- Constructor. + +--- Create a new POINT_VEC3 object. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param Dcs.DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. +-- @param Dcs.DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:New( x, y, z ) + + local self = BASE:Inherit( self, BASE:New() ) + self.x = x + self.y = y + self.z = z + + return self +end + +--- Create a new POINT_VEC3 object from Vec2 coordinates. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 point. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:NewFromVec2( Vec2, LandHeightAdd ) + + local LandHeight = land.getHeight( Vec2 ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = self:New( Vec2.x, LandHeight, Vec2.y ) + + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC3 object from Vec3 coordinates. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec3 Vec3 The Vec3 point. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:NewFromVec3( Vec3 ) + + self = self:New( Vec3.x, Vec3.y, Vec3.z ) + self:F2( self ) + return self +end + + +--- Return the coordinates of the POINT_VEC3 in Vec3 format. +-- @param #POINT_VEC3 self +-- @return Dcs.DCSTypes#Vec3 The Vec3 coodinate. +function POINT_VEC3:GetVec3() + return { x = self.x, y = self.y, z = self.z } +end + +--- Return the coordinates of the POINT_VEC3 in Vec2 format. +-- @param #POINT_VEC3 self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coodinate. +function POINT_VEC3:GetVec2() + return { x = self.x, y = self.z } +end + + +--- Return the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The x coodinate. +function POINT_VEC3:GetX() + return self.x +end + +--- Return the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The y coodinate. +function POINT_VEC3:GetY() + return self.y +end + +--- Return the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The z coodinate. +function POINT_VEC3:GetZ() + return self.z +end + +--- Set the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetX( x ) + self.x = x + return self +end + +--- Set the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetY( y ) + self.y = y + return self +end + +--- Set the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number z The z coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetZ( z ) + self.z = z + return self +end + +--- Add to the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number x The x coordinate value to add to the current x coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddX( x ) + self.x = self.x + x + return self +end + +--- Add to the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number y The y coordinate value to add to the current y coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddY( y ) + self.y = self.y + y + return self +end + +--- Add to the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number z The z coordinate value to add to the current z coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddZ( z ) + self.z = self.z +z + return self +end + +--- Return a random Vec2 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return Dcs.DCSTypes#Vec2 Vec2 +function POINT_VEC3:GetRandomVec2InRadius( OuterRadius, InnerRadius ) + self:F2( { OuterRadius, InnerRadius } ) + + local Theta = 2 * math.pi * math.random() + local Radials = math.random() + math.random() + if Radials > 1 then + Radials = 2 - Radials + end + + local RadialMultiplier + if InnerRadius and InnerRadius <= OuterRadius then + RadialMultiplier = ( OuterRadius - InnerRadius ) * Radials + InnerRadius + else + RadialMultiplier = OuterRadius * Radials + end + + local RandomVec2 + if OuterRadius > 0 then + RandomVec2 = { x = math.cos( Theta ) * RadialMultiplier + self:GetX(), y = math.sin( Theta ) * RadialMultiplier + self:GetZ() } + else + RandomVec2 = { x = self:GetX(), y = self:GetZ() } + end + + return RandomVec2 +end + +--- Return a random POINT_VEC2 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return #POINT_VEC2 +function POINT_VEC3:GetRandomPointVec2InRadius( OuterRadius, InnerRadius ) + self:F2( { OuterRadius, InnerRadius } ) + + return POINT_VEC2:NewFromVec2( self:GetRandomVec2InRadius( OuterRadius, InnerRadius ) ) +end + +--- Return a random Vec3 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return Dcs.DCSTypes#Vec3 Vec3 +function POINT_VEC3:GetRandomVec3InRadius( OuterRadius, InnerRadius ) + + local RandomVec2 = self:GetRandomVec2InRadius( OuterRadius, InnerRadius ) + local y = self:GetY() + math.random( InnerRadius, OuterRadius ) + local RandomVec3 = { x = RandomVec2.x, y = y, z = RandomVec2.y } + + return RandomVec3 +end + +--- Return a random POINT_VEC3 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return #POINT_VEC3 +function POINT_VEC3:GetRandomPointVec3InRadius( OuterRadius, InnerRadius ) + + return POINT_VEC3:NewFromVec3( self:GetRandomVec3InRadius( OuterRadius, InnerRadius ) ) +end + + +--- Return a direction vector Vec3 from POINT_VEC3 to the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Vec3 DirectionVec3 The direction vector in Vec3 format. +function POINT_VEC3:GetDirectionVec3( TargetPointVec3 ) + return { x = TargetPointVec3:GetX() - self:GetX(), y = TargetPointVec3:GetY() - self:GetY(), z = TargetPointVec3:GetZ() - self:GetZ() } +end + +--- Get a correction in radians of the real magnetic north of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number CorrectionRadians The correction in radians. +function POINT_VEC3:GetNorthCorrectionRadians() + local TargetVec3 = self:GetVec3() + local lat, lon = coord.LOtoLL(TargetVec3) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2( north_posit.z - TargetVec3.z, north_posit.x - TargetVec3.x ) +end + + +--- Return a direction in radians from the POINT_VEC3 using a direction vector in Vec3 format. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec3 DirectionVec3 The direction vector in Vec3 format. +-- @return #number DirectionRadians The direction in radians. +function POINT_VEC3:GetDirectionRadians( DirectionVec3 ) + local DirectionRadians = math.atan2( DirectionVec3.z, DirectionVec3.x ) + --DirectionRadians = DirectionRadians + self:GetNorthCorrectionRadians() + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi -- put dir in range of 0 to 2*pi ( the full circle ) + end + return DirectionRadians +end + +--- Return the 2D distance in meters between the target POINT_VEC3 and the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Distance Distance The distance in meters. +function POINT_VEC3:Get2DDistance( TargetPointVec3 ) + local TargetVec3 = TargetPointVec3:GetVec3() + local SourceVec3 = self:GetVec3() + return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 +end + +--- Return the 3D distance in meters between the target POINT_VEC3 and the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Distance Distance The distance in meters. +function POINT_VEC3:Get3DDistance( TargetPointVec3 ) + local TargetVec3 = TargetPointVec3:GetVec3() + local SourceVec3 = self:GetVec3() + return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.y - SourceVec3.y ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 +end + +--- Provides a Bearing / Range string +-- @param #POINT_VEC3 self +-- @param #number AngleRadians The angle in randians +-- @param #number Distance The distance +-- @return #string The BR Text +function POINT_VEC3:ToStringBR( AngleRadians, Distance ) + + AngleRadians = UTILS.Round( UTILS.ToDegree( AngleRadians ), 0 ) + if self:IsMetric() then + Distance = UTILS.Round( Distance / 1000, 2 ) + else + Distance = UTILS.Round( UTILS.MetersToNM( Distance ), 2 ) + end + + local s = string.format( '%03d', AngleRadians ) .. ' for ' .. Distance + + s = s .. self:GetAltitudeText() -- When the POINT is a VEC2, there will be no altitude shown. + + return s +end + +--- Provides a Bearing / Range string +-- @param #POINT_VEC3 self +-- @param #number AngleRadians The angle in randians +-- @param #number Distance The distance +-- @return #string The BR Text +function POINT_VEC3:ToStringLL( acc, DMS ) + + acc = acc or 3 + local lat, lon = coord.LOtoLL( self:GetVec3() ) + return UTILS.tostringLL(lat, lon, acc, DMS) +end + +--- Return the altitude text of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #string Altitude text. +function POINT_VEC3:GetAltitudeText() + if self:IsMetric() then + return ' at ' .. UTILS.Round( self:GetY(), 0 ) + else + return ' at ' .. UTILS.Round( UTILS.MetersToFeet( self:GetY() ), 0 ) + end +end + +--- Return a BR string from a POINT_VEC3 to the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return #string The BR text. +function POINT_VEC3:GetBRText( TargetPointVec3 ) + local DirectionVec3 = self:GetDirectionVec3( TargetPointVec3 ) + local AngleRadians = self:GetDirectionRadians( DirectionVec3 ) + local Distance = self:Get2DDistance( TargetPointVec3 ) + return self:ToStringBR( AngleRadians, Distance ) +end + +--- Sets the POINT_VEC3 metric or NM. +-- @param #POINT_VEC3 self +-- @param #boolean Metric true means metric, false means NM. +function POINT_VEC3:SetMetric( Metric ) + self.Metric = Metric +end + +--- Gets if the POINT_VEC3 is metric or NM. +-- @param #POINT_VEC3 self +-- @return #boolean Metric true means metric, false means NM. +function POINT_VEC3:IsMetric() + return self.Metric +end + +--- Add a Distance in meters from the POINT_VEC3 horizontal plane, with the given angle, and calculate the new POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance Distance The Distance to be added in meters. +-- @param Dcs.DCSTypes#Angle Angle The Angle in degrees. +-- @return #POINT_VEC3 The new calculated POINT_VEC3. +function POINT_VEC3:Translate( Distance, Angle ) + local SX = self:GetX() + local SZ = self:GetZ() + local Radians = Angle / 180 * math.pi + local TX = Distance * math.cos( Radians ) + SX + local TZ = Distance * math.sin( Radians ) + SZ + + return POINT_VEC3:New( TX, self:GetY(), TZ ) +end + + + +--- Build an air type route point. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3.RoutePointAltType AltType The altitude type. +-- @param #POINT_VEC3.RoutePointType Type The route point type. +-- @param #POINT_VEC3.RoutePointAction Action The route point action. +-- @param Dcs.DCSTypes#Speed Speed Airspeed in km/h. +-- @param #boolean SpeedLocked true means the speed is locked. +-- @return #table The route point. +function POINT_VEC3:RoutePointAir( AltType, Type, Action, Speed, SpeedLocked ) + self:F2( { AltType, Type, Action, Speed, SpeedLocked } ) + + local RoutePoint = {} + RoutePoint.x = self.x + RoutePoint.y = self.z + RoutePoint.alt = self.y + RoutePoint.alt_type = AltType + + RoutePoint.type = Type + RoutePoint.action = Action + + RoutePoint.speed = Speed / 3.6 + RoutePoint.speed_locked = true + +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] + + + RoutePoint.task = {} + RoutePoint.task.id = "ComboTask" + RoutePoint.task.params = {} + RoutePoint.task.params.tasks = {} + + + return RoutePoint +end + +--- Build an ground type route point. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Speed Speed Speed in km/h. +-- @param #POINT_VEC3.RoutePointAction Formation The route point Formation. +-- @return #table The route point. +function POINT_VEC3:RoutePointGround( Speed, Formation ) + self:F2( { Formation, Speed } ) + + local RoutePoint = {} + RoutePoint.x = self.x + RoutePoint.y = self.z + + RoutePoint.action = Formation or "" + + + RoutePoint.speed = Speed / 3.6 + RoutePoint.speed_locked = true + +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] + + + RoutePoint.task = {} + RoutePoint.task.id = "ComboTask" + RoutePoint.task.params = {} + RoutePoint.task.params.tasks = {} + + + return RoutePoint +end + +--- Creates an explosion at the point of a certain intensity. +-- @param #POINT_VEC3 self +-- @param #number ExplosionIntensity +function POINT_VEC3:Explosion( ExplosionIntensity ) + self:F2( { ExplosionIntensity } ) + trigger.action.explosion( self:GetVec3(), ExplosionIntensity ) +end + +--- Creates an illumination bomb at the point. +-- @param #POINT_VEC3 self +function POINT_VEC3:IlluminationBomb() + self:F2() + trigger.action.illuminationBomb( self:GetVec3() ) +end + + +--- Smokes the point in a color. +-- @param #POINT_VEC3 self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor +function POINT_VEC3:Smoke( SmokeColor ) + self:F2( { SmokeColor } ) + trigger.action.smoke( self:GetVec3(), SmokeColor ) +end + +--- Smoke the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeGreen() + self:F2() + self:Smoke( SMOKECOLOR.Green ) +end + +--- Smoke the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeRed() + self:F2() + self:Smoke( SMOKECOLOR.Red ) +end + +--- Smoke the POINT_VEC3 White. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeWhite() + self:F2() + self:Smoke( SMOKECOLOR.White ) +end + +--- Smoke the POINT_VEC3 Orange. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeOrange() + self:F2() + self:Smoke( SMOKECOLOR.Orange ) +end + +--- Smoke the POINT_VEC3 Blue. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeBlue() + self:F2() + self:Smoke( SMOKECOLOR.Blue ) +end + +--- Flares the point in a color. +-- @param #POINT_VEC3 self +-- @param Utilities.Utils#FLARECOLOR FlareColor +-- @param Dcs.DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:Flare( FlareColor, Azimuth ) + self:F2( { FlareColor } ) + trigger.action.signalFlare( self:GetVec3(), FlareColor, Azimuth and Azimuth or 0 ) +end + +--- Flare the POINT_VEC3 White. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.White, Azimuth ) +end + +--- Flare the POINT_VEC3 Yellow. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.Yellow, Azimuth ) +end + +--- Flare the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.Green, Azimuth ) +end + +--- Flare the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:FlareRed( Azimuth ) + self:F2( Azimuth ) + self:Flare( FLARECOLOR.Red, Azimuth ) +end + +end + +do -- POINT_VEC2 + + + +--- POINT_VEC2 constructor. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param Dcs.DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. +-- @param Dcs.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 Core.Point#POINT_VEC2 +function POINT_VEC2:New( x, y, LandHeightAdd ) + + local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC2 object from Vec2 coordinates. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 point. +-- @return Core.Point#POINT_VEC2 self +function POINT_VEC2:NewFromVec2( Vec2, LandHeightAdd ) + + local LandHeight = land.getHeight( Vec2 ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = BASE:Inherit( self, POINT_VEC3:New( Vec2.x, LandHeight, Vec2.y ) ) + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC2 object from Vec3 coordinates. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec3 Vec3 The Vec3 point. +-- @return Core.Point#POINT_VEC2 self +function POINT_VEC2:NewFromVec3( Vec3 ) + + local self = BASE:Inherit( self, BASE:New() ) + local Vec2 = { x = Vec3.x, y = Vec3.z } + + local LandHeight = land.getHeight( Vec2 ) + + self = BASE:Inherit( self, POINT_VEC3:New( Vec2.x, LandHeight, Vec2.y ) ) + self:F2( self ) + + return self +end + +--- Return the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The x coodinate. +function POINT_VEC2:GetX() + return self.x +end + +--- Return the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The y coodinate. +function POINT_VEC2:GetY() + return self.z +end + +--- Return the altitude (height) of the land at the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The land altitude. +function POINT_VEC2:GetAlt() + return land.getHeight( { x = self.x, y = self.z } ) +end + +--- Return Return the Lat(itude) coordinate of the POINT_VEC2 (ie: (parent)POINT_VEC3.x). +-- @param #POINT_VEC2 self +-- @return #number The x coodinate. +function POINT_VEC2:GetLat() + return self.x +end + +--- Return the Lon(gitude) coordinate of the POINT_VEC2 (ie: (parent)POINT_VEC3.z). +-- @param #POINT_VEC2 self +-- @return #number The y coodinate. +function POINT_VEC2:GetLon() + return self.z +end + +--- Set the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetX( x ) + self.x = x + return self +end + +--- Set the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetY( y ) + self.z = y + return self +end + +--- Set the Lat(itude) coordinate of the POINT_VEC2 (ie: POINT_VEC3.x). +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetLat( x ) + self.x = x + return self +end + +--- Set the altitude of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number Altitude The land altitude. If nothing (nil) is given, then the current land altitude is set. +-- @return #POINT_VEC2 +function POINT_VEC2:SetAlt( Altitude ) + self.y = Altitude or land.getHeight( { x = self.x, y = self.z } ) + return self +end + +--- Set the Lon(gitude) coordinate of the POINT_VEC2 (ie: POINT_VEC3.z). +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetLon( z ) + self.z = z + return self +end + +--- Add to the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:AddX( x ) + self.x = self.x + x + return self +end + +--- Add to the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:AddY( y ) + self.z = self.z + y + return self +end + +--- Add to the current land height an altitude. +-- @param #POINT_VEC2 self +-- @param #number Altitude The Altitude to add. If nothing (nil) is given, then the current land altitude is set. +-- @return #POINT_VEC2 +function POINT_VEC2:AddAlt( Altitude ) + self.y = land.getHeight( { x = self.x, y = self.z } ) + Altitude or 0 + return self +end + + + +--- Calculate the distance from a reference @{#POINT_VEC2}. +-- @param #POINT_VEC2 self +-- @param #POINT_VEC2 PointVec2Reference The reference @{#POINT_VEC2}. +-- @return Dcs.DCSTypes#Distance The distance from the reference @{#POINT_VEC2} in meters. +function POINT_VEC2:DistanceFromPointVec2( PointVec2Reference ) + self:F2( PointVec2Reference ) + + local Distance = ( ( PointVec2Reference:GetX() - self:GetX() ) ^ 2 + ( PointVec2Reference:GetY() - self:GetY() ) ^2 ) ^0.5 + + self:T2( Distance ) + return Distance +end + +--- Calculate the distance from a reference @{DCSTypes#Vec2}. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec2 Vec2Reference The reference @{DCSTypes#Vec2}. +-- @return Dcs.DCSTypes#Distance The distance from the reference @{DCSTypes#Vec2} in meters. +function POINT_VEC2:DistanceFromVec2( Vec2Reference ) + self:F2( Vec2Reference ) + + local Distance = ( ( Vec2Reference.x - self:GetX() ) ^ 2 + ( Vec2Reference.y - self:GetY() ) ^2 ) ^0.5 + + self:T2( Distance ) + return Distance +end + + +--- Return no text for the altitude of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #string Empty string. +function POINT_VEC2:GetAltitudeText() + return '' +end + +--- Add a Distance in meters from the POINT_VEC2 orthonormal plane, with the given angle, and calculate the new POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Distance Distance The Distance to be added in meters. +-- @param Dcs.DCSTypes#Angle Angle The Angle in degrees. +-- @return #POINT_VEC2 The new calculated POINT_VEC2. +function POINT_VEC2:Translate( Distance, Angle ) + local SX = self:GetX() + local SY = self:GetY() + local Radians = Angle / 180 * math.pi + local TX = Distance * math.cos( Radians ) + SX + local TY = Distance * math.sin( Radians ) + SY + + return POINT_VEC2:New( TX, TY ) +end + +end + + +--- **Core** - MESSAGE class takes are of the **real-time notifications** and **messages to players** during a simulation. +-- +-- ![Banner Image](..\Presentations\MESSAGE\Dia1.JPG) +-- +-- === +-- +-- # 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- +-- Message System to display Messages to Clients, Coalitions or All. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages can contain a category which is indicating the category of the message. +-- +-- ## 1.1) MESSAGE construction +-- +-- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- ## 1.2) Send messages to an audience +-- +-- Messages are sent: +-- +-- * To a @{Client} using @{Message#MESSAGE.ToClient}(). +-- * To a @{Group} using @{Message#MESSAGE.ToGroup}() +-- * To a coalition using @{Message#MESSAGE.ToCoalition}(). +-- * To the red coalition using @{Message#MESSAGE.ToRed}(). +-- * To the blue coalition using @{Message#MESSAGE.ToBlue}(). +-- * To all Players using @{Message#MESSAGE.ToAll}(). +-- +-- ## 1.3) Send conditionally to an audience +-- +-- Messages can be sent conditionally to an audience (when a condition is true): +-- +-- * To all players using @{Message#MESSAGE.ToAllIf}(). +-- * To a coalition using @{Message#MESSAGE.ToCoalitionIf}(). +-- +-- +-- @module Message + +--- The MESSAGE class +-- @type MESSAGE +-- @extends Core.Base#BASE +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 #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". +-- @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!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageDuration, MessageCategory } ) + + -- When no MessageCategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + if MessageCategory:sub(-1) ~= "\n" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = MessageCategory:sub( 1, -2 ) .. ":\n" + end + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration or 5 + 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 Wrapper.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 a Group. +-- @param #MESSAGE self +-- @param Wrapper.Group#GROUP Group is the Group. +-- @return #MESSAGE +function MESSAGE:ToGroup( Group ) + self:F( Group.GroupName ) + + if Group then + + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( Group:GetID(), 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 a Coalition if the given Condition is true. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +function MESSAGE:ToCoalitionIf( CoalitionSide, Condition ) + self:F( CoalitionSide ) + + if Condition and Condition == true then + self:ToCoalition( CoalitionSide ) + 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 + + +--- Sends a MESSAGE to all players if the given Condition is true. +-- @param #MESSAGE self +-- @return #MESSAGE +function MESSAGE:ToAllIf( Condition ) + + if Condition and Condition == true then + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + end + + return self +end +--- **Core** - The **FSM** (**F**inite **S**tate **M**achine) class and derived **FSM\_** classes +-- are design patterns allowing efficient (long-lasting) processes and workflows. +-- +-- ![Banner Image](..\Presentations\FSM\Dia1.JPG) +-- +-- === +-- +-- A FSM can only be in one of a finite number of states. +-- The machine is in only one state at a time; the state it is in at any given time is called the **current state**. +-- It can change from one state to another when initiated by an **__internal__ or __external__ triggering event**, which is called a **transition**. +-- An **FSM implementation** is defined by **a list of its states**, **its initial state**, and **the triggering events** for **each possible transition**. +-- An FSM implementation is composed out of **two parts**, a set of **state transition rules**, and an implementation set of **state transition handlers**, implementing those transitions. +-- +-- The FSM class supports a **hierarchical implementation of a Finite State Machine**, +-- that is, it allows to **embed existing FSM implementations in a master FSM**. +-- FSM hierarchies allow for efficient FSM re-use, **not having to re-invent the wheel every time again** when designing complex processes. +-- +-- ![Workflow Example](..\Presentations\FSM\Dia2.JPG) +-- +-- The above diagram shows a graphical representation of a FSM implementation for a **Task**, which guides a Human towards a Zone, +-- orders him to destroy x targets and account the results. +-- Other examples of ready made FSM could be: +-- +-- * route a plane to a zone flown by a human +-- * detect targets by an AI and report to humans +-- * account for destroyed targets by human players +-- * handle AI infantry to deploy from or embark to a helicopter or airplane or vehicle +-- * let an AI patrol a zone +-- +-- The **MOOSE framework** uses extensively the FSM class and derived FSM\_ classes, +-- because **the goal of MOOSE is to simplify mission design complexity for mission building**. +-- By efficiently utilizing the FSM class and derived classes, MOOSE allows mission designers to quickly build processes. +-- **Ready made FSM-based implementations classes** exist within the MOOSE framework that **can easily be re-used, +-- and tailored** by mission designers through **the implementation of Transition Handlers**. +-- Each of these FSM implementation classes start either with: +-- +-- * an acronym **AI\_**, which indicates an FSM implementation directing **AI controlled** @{GROUP} and/or @{UNIT}. These AI\_ classes derive the @{#FSM_CONTROLLABLE} class. +-- * an acronym **TASK\_**, which indicates an FSM implementation executing a @{TASK} executed by Groups of players. These TASK\_ classes derive the @{#FSM_TASK} class. +-- * an acronym **ACT\_**, which indicates an Sub-FSM implementation, directing **Humans actions** that need to be done in a @{TASK}, seated in a @{CLIENT} (slot) or a @{UNIT} (CA join). These ACT\_ classes derive the @{#FSM_PROCESS} class. +-- +-- Detailed explanations and API specifics are further below clarified and FSM derived class specifics are described in those class documentation sections. +-- +-- ##__Dislaimer:__ +-- The FSM class development is based on a finite state machine implementation made by Conroy Kyle. +-- The state machine can be found on [github](https://github.com/kyleconroy/lua-state-machine) +-- I've reworked this development (taken the concept), and created a **hierarchical state machine** out of it, embedded within the DCS simulator. +-- Additionally, I've added extendability and created an API that allows seamless FSM implementation. +-- +-- === +-- +-- # 1) @{#FSM} class, extends @{Base#BASE} +-- +-- ![Transition Rules and Transition Handlers and Event Triggers](..\Presentations\FSM\Dia3.JPG) +-- +-- The FSM class is the base class of all FSM\_ derived classes. It implements the main functionality to define and execute Finite State Machines. +-- The derived FSM\_ classes extend the Finite State Machine functionality to run a workflow process for a specific purpose or component. +-- +-- Finite State Machines have **Transition Rules**, **Transition Handlers** and **Event Triggers**. +-- +-- The **Transition Rules** define the "Process Flow Boundaries", that is, +-- the path that can be followed hopping from state to state upon triggered events. +-- If an event is triggered, and there is no valid path found for that event, +-- an error will be raised and the FSM will stop functioning. +-- +-- The **Transition Handlers** are special methods that can be defined by the mission designer, following a defined syntax. +-- If the FSM object finds a method of such a handler, then the method will be called by the FSM, passing specific parameters. +-- The method can then define its own custom logic to implement the FSM workflow, and to conduct other actions. +-- +-- The **Event Triggers** are methods that are defined by the FSM, which the mission designer can use to implement the workflow. +-- Most of the time, these Event Triggers are used within the Transition Handler methods, so that a workflow is created running through the state machine. +-- +-- As explained above, a FSM supports **Linear State Transitions** and **Hierarchical State Transitions**, and both can be mixed to make a comprehensive FSM implementation. +-- The below documentation has a seperate chapter explaining both transition modes, taking into account the **Transition Rules**, **Transition Handlers** and **Event Triggers**. +-- +-- ## 1.1) FSM Linear Transitions +-- +-- Linear Transitions are Transition Rules allowing an FSM to transition from one or multiple possible **From** state(s) towards a **To** state upon a Triggered **Event**. +-- The Lineair transition rule evaluation will always be done from the **current state** of the FSM. +-- If no valid Transition Rule can be found in the FSM, the FSM will log an error and stop. +-- +-- ### 1.1.1) FSM Transition Rules +-- +-- The FSM has transition rules that it follows and validates, as it walks the process. +-- These rules define when an FSM can transition from a specific state towards an other specific state upon a triggered event. +-- +-- The method @{#FSM.AddTransition}() specifies a new possible Transition Rule for the FSM. +-- +-- The initial state can be defined using the method @{#FSM.SetStartState}(). The default start state of an FSM is "None". +-- +-- Find below an example of a Linear Transition Rule definition for an FSM. +-- +-- local Fsm3Switch = FSM:New() -- #FsmDemo +-- FsmSwitch:SetStartState( "Off" ) +-- FsmSwitch:AddTransition( "Off", "SwitchOn", "On" ) +-- FsmSwitch:AddTransition( "Off", "SwitchMiddle", "Middle" ) +-- FsmSwitch:AddTransition( "On", "SwitchOff", "Off" ) +-- FsmSwitch:AddTransition( "Middle", "SwitchOff", "Off" ) +-- +-- The above code snippet models a 3-way switch Linear Transition: +-- +-- * It can be switched **On** by triggering event **SwitchOn**. +-- * It can be switched to the **Middle** position, by triggering event **SwitchMiddle**. +-- * It can be switched **Off** by triggering event **SwitchOff**. +-- * Note that once the Switch is **On** or **Middle**, it can only be switched **Off**. +-- +-- ### Some additional comments: +-- +-- Note that Linear Transition Rules **can be declared in a few variations**: +-- +-- * The From states can be **a table of strings**, indicating that the transition rule will be valid **if the current state** of the FSM will be **one of the given From states**. +-- * The From state can be a **"*"**, indicating that **the transition rule will always be valid**, regardless of the current state of the FSM. +-- +-- The below code snippet shows how the two last lines can be rewritten and consensed. +-- +-- FsmSwitch:AddTransition( { "On", "Middle" }, "SwitchOff", "Off" ) +-- +-- ### 1.1.2) Transition Handling +-- +-- ![Transition Handlers](..\Presentations\FSM\Dia4.JPG) +-- +-- An FSM transitions in **4 moments** when an Event is being triggered and processed. +-- The mission designer can define for each moment specific logic within methods implementations following a defined API syntax. +-- These methods define the flow of the FSM process; because in those methods the FSM Internal Events will be triggered. +-- +-- * To handle **State** transition moments, create methods starting with OnLeave or OnEnter concatenated with the State name. +-- * To handle **Event** transition moments, create methods starting with OnBefore or OnAfter concatenated with the Event name. +-- +-- **The OnLeave and OnBefore transition methods may return false, which will cancel the transition!** +-- +-- Transition Handler methods need to follow the above specified naming convention, but are also passed parameters from the FSM. +-- These parameters are on the correct order: From, Event, To: +-- +-- * From = A string containing the From state. +-- * Event = A string containing the Event name that was triggered. +-- * To = A string containing the To state. +-- +-- On top, each of these methods can have a variable amount of parameters passed. See the example in section [1.1.3](#1.1.3\)-event-triggers). +-- +-- ### 1.1.3) Event Triggers +-- +-- ![Event Triggers](..\Presentations\FSM\Dia5.JPG) +-- +-- The FSM creates for each Event two **Event Trigger methods**. +-- There are two modes how Events can be triggered, which is **synchronous** and **asynchronous**: +-- +-- * The method **FSM:Event()** triggers an Event that will be processed **synchronously** or **immediately**. +-- * The method **FSM:__Event( __seconds__ )** triggers an Event that will be processed **asynchronously** over time, waiting __x seconds__. +-- +-- The destinction between these 2 Event Trigger methods are important to understand. An asynchronous call will "log" the Event Trigger to be executed at a later time. +-- Processing will just continue. Synchronous Event Trigger methods are useful to change states of the FSM immediately, but may have a larger processing impact. +-- +-- The following example provides a little demonstration on the difference between synchronous and asynchronous Event Triggering. +-- +-- function FSM:OnAfterEvent( From, Event, To, Amount ) +-- self:T( { Amount = Amount } ) +-- end +-- +-- local Amount = 1 +-- FSM:__Event( 5, Amount ) +-- +-- Amount = Amount + 1 +-- FSM:Event( Text, Amount ) +-- +-- In this example, the **:OnAfterEvent**() Transition Handler implementation will get called when **Event** is being triggered. +-- Before we go into more detail, let's look at the last 4 lines of the example. +-- The last line triggers synchronously the **Event**, and passes Amount as a parameter. +-- The 3rd last line of the example triggers asynchronously **Event**. +-- Event will be processed after 5 seconds, and Amount is given as a parameter. +-- +-- The output of this little code fragment will be: +-- +-- * Amount = 2 +-- * Amount = 2 +-- +-- Because ... When Event was asynchronously processed after 5 seconds, Amount was set to 2. So be careful when processing and passing values and objects in asynchronous processing! +-- +-- ### 1.1.4) Linear Transition Example +-- +-- This example is fully implemented in the MOOSE test mission on GITHUB: [FSM-100 - Transition Explanation](https://github.com/FlightControl-Master/MOOSE/blob/master/Moose%20Test%20Missions/FSM%20-%20Finite%20State%20Machine/FSM-100%20-%20Transition%20Explanation/FSM-100%20-%20Transition%20Explanation.lua) +-- +-- It models a unit standing still near Batumi, and flaring every 5 seconds while switching between a Green flare and a Red flare. +-- The purpose of this example is not to show how exciting flaring is, but it demonstrates how a Linear Transition FSM can be build. +-- Have a look at the source code. The source code is also further explained below in this section. +-- +-- The example creates a new FsmDemo object from class FSM. +-- It will set the start state of FsmDemo to state **Green**. +-- Two Linear Transition Rules are created, where upon the event **Switch**, +-- the FsmDemo will transition from state **Green** to **Red** and from **Red** back to **Green**. +-- +-- ![Transition Example](..\Presentations\FSM\Dia6.JPG) +-- +-- local FsmDemo = FSM:New() -- #FsmDemo +-- FsmDemo:SetStartState( "Green" ) +-- FsmDemo:AddTransition( "Green", "Switch", "Red" ) +-- FsmDemo:AddTransition( "Red", "Switch", "Green" ) +-- +-- In the above example, the FsmDemo could flare every 5 seconds a Green or a Red flare into the air. +-- The next code implements this through the event handling method **OnAfterSwitch**. +-- +-- ![Transition Flow](..\Presentations\FSM\Dia7.JPG) +-- +-- function FsmDemo:OnAfterSwitch( From, Event, To, FsmUnit ) +-- self:T( { From, Event, To, FsmUnit } ) +-- +-- if From == "Green" then +-- FsmUnit:Flare(FLARECOLOR.Green) +-- else +-- if From == "Red" then +-- FsmUnit:Flare(FLARECOLOR.Red) +-- end +-- end +-- self:__Switch( 5, FsmUnit ) -- Trigger the next Switch event to happen in 5 seconds. +-- end +-- +-- FsmDemo:__Switch( 5, FsmUnit ) -- Trigger the first Switch event to happen in 5 seconds. +-- +-- The OnAfterSwitch implements a loop. The last line of the code fragment triggers the Switch Event within 5 seconds. +-- Upon the event execution (after 5 seconds), the OnAfterSwitch method is called of FsmDemo (cfr. the double point notation!!! ":"). +-- The OnAfterSwitch method receives from the FSM the 3 transition parameter details ( From, Event, To ), +-- and one additional parameter that was given when the event was triggered, which is in this case the Unit that is used within OnSwitchAfter. +-- +-- function FsmDemo:OnAfterSwitch( From, Event, To, FsmUnit ) +-- +-- For debugging reasons the received parameters are traced within the DCS.log. +-- +-- self:T( { From, Event, To, FsmUnit } ) +-- +-- The method will check if the From state received is either "Green" or "Red" and will flare the respective color from the FsmUnit. +-- +-- if From == "Green" then +-- FsmUnit:Flare(FLARECOLOR.Green) +-- else +-- if From == "Red" then +-- FsmUnit:Flare(FLARECOLOR.Red) +-- end +-- end +-- +-- It is important that the Switch event is again triggered, otherwise, the FsmDemo would stop working after having the first Event being handled. +-- +-- FsmDemo:__Switch( 5, FsmUnit ) -- Trigger the next Switch event to happen in 5 seconds. +-- +-- The below code fragment extends the FsmDemo, demonstrating multiple **From states declared as a table**, adding a **Linear Transition Rule**. +-- The new event **Stop** will cancel the Switching process. +-- The transition for event Stop can be executed if the current state of the FSM is either "Red" or "Green". +-- +-- local FsmDemo = FSM:New() -- #FsmDemo +-- FsmDemo:SetStartState( "Green" ) +-- FsmDemo:AddTransition( "Green", "Switch", "Red" ) +-- FsmDemo:AddTransition( "Red", "Switch", "Green" ) +-- FsmDemo:AddTransition( { "Red", "Green" }, "Stop", "Stopped" ) +-- +-- The transition for event Stop can also be simplified, as any current state of the FSM is valid. +-- +-- FsmDemo:AddTransition( "*", "Stop", "Stopped" ) +-- +-- So... When FsmDemo:Stop() is being triggered, the state of FsmDemo will transition from Red or Green to Stopped. +-- And there is no transition handling method defined for that transition, thus, no new event is being triggered causing the FsmDemo process flow to halt. +-- +-- ## 1.5) FSM Hierarchical Transitions +-- +-- Hierarchical Transitions allow to re-use readily available and implemented FSMs. +-- This becomes in very useful for mission building, where mission designers build complex processes and workflows, +-- combining smaller FSMs to one single FSM. +-- +-- The FSM can embed **Sub-FSMs** that will execute and return **multiple possible Return (End) States**. +-- Depending upon **which state is returned**, the main FSM can continue the flow **triggering specific events**. +-- +-- The method @{#FSM.AddProcess}() adds a new Sub-FSM to the FSM. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- * 2016-12-18: Released. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * [**Pikey**](https://forums.eagle.ru/member.php?u=62835): Review of documentation & advice for improvements. +-- +-- ### Authors: +-- +-- * [**FlightControl**](https://forums.eagle.ru/member.php?u=89536): Design & Programming & documentation. +-- +-- @module Fsm + +do -- FSM + + --- FSM class + -- @type FSM + -- @extends Core.Base#BASE + FSM = { + ClassName = "FSM", + } + + --- Creates a new FSM object. + -- @param #FSM self + -- @return #FSM + function FSM:New( FsmT ) + + -- Inherits from BASE + self = BASE:Inherit( self, BASE:New() ) + + self.options = options or {} + self.options.subs = self.options.subs or {} + self.current = self.options.initial or 'none' + self.Events = {} + self.subs = {} + self.endstates = {} + + self.Scores = {} + + self._StartState = "none" + self._Transitions = {} + self._Processes = {} + self._EndStates = {} + self._Scores = {} + self._EventSchedules = {} + + self.CallScheduler = SCHEDULER:New( self ) + + + return self + end + + + --- Sets the start state of the FSM. + -- @param #FSM self + -- @param #string State A string defining the start state. + function FSM:SetStartState( State ) + + self._StartState = State + self.current = State + end + + + --- Returns the start state of the FSM. + -- @param #FSM self + -- @return #string A string containing the start state. + function FSM:GetStartState() + + return self._StartState or {} + end + + --- Add a new transition rule to the FSM. + -- A transition rule defines when and if the FSM can transition from a state towards another state upon a triggered event. + -- @param #FSM self + -- @param #table From Can contain a string indicating the From state or a table of strings containing multiple From states. + -- @param #string Event The Event name. + -- @param #string To The To state. + function FSM:AddTransition( From, Event, To ) + + local Transition = {} + Transition.From = From + Transition.Event = Event + Transition.To = To + + self:T( Transition ) + + self._Transitions[Transition] = Transition + self:_eventmap( self.Events, Transition ) + end + + + --- Returns a table of the transition rules defined within the FSM. + -- @return #table + function FSM:GetTransitions() + + return self._Transitions or {} + end + + --- Set the default @{Process} template with key ProcessName providing the ProcessClass and the process object when it is assigned to a @{Controllable} by the task. + -- @param #FSM self + -- @param #table From Can contain a string indicating the From state or a table of strings containing multiple From states. + -- @param #string Event The Event name. + -- @param Core.Fsm#FSM_PROCESS Process An sub-process FSM. + -- @param #table ReturnEvents A table indicating for which returned events of the SubFSM which Event must be triggered in the FSM. + -- @return Core.Fsm#FSM_PROCESS The SubFSM. + function FSM:AddProcess( From, Event, Process, ReturnEvents ) + self:T( { From, Event, Process, ReturnEvents } ) + + local Sub = {} + Sub.From = From + Sub.Event = Event + Sub.fsm = Process + Sub.StartEvent = "Start" + Sub.ReturnEvents = ReturnEvents + + self._Processes[Sub] = Sub + + self:_submap( self.subs, Sub, nil ) + + self:AddTransition( From, Event, From ) + + return Process + end + + + --- Returns a table of the SubFSM rules defined within the FSM. + -- @return #table + function FSM:GetProcesses() + + return self._Processes or {} + end + + function FSM:GetProcess( From, Event ) + + for ProcessID, Process in pairs( self:GetProcesses() ) do + if Process.From == From and Process.Event == Event then + return Process.fsm + end + end + + error( "Sub-Process from state " .. From .. " with event " .. Event .. " not found!" ) + end + + --- Adds an End state. + function FSM:AddEndState( State ) + + self._EndStates[State] = State + self.endstates[State] = State + end + + --- Returns the End states. + function FSM:GetEndStates() + + return self._EndStates or {} + end + + + --- Adds a score for the FSM to be achieved. + -- @param #FSM self + -- @param #string State is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). + -- @param #string ScoreText is a text describing the score that is given according the status. + -- @param #number Score is a number providing the score of the status. + -- @return #FSM self + function FSM:AddScore( State, ScoreText, Score ) + self:F( { State, ScoreText, Score } ) + + self._Scores[State] = self._Scores[State] or {} + self._Scores[State].ScoreText = ScoreText + self._Scores[State].Score = Score + + return self + end + + --- Adds a score for the FSM_PROCESS to be achieved. + -- @param #FSM self + -- @param #string From is the From State of the main process. + -- @param #string Event is the Event of the main process. + -- @param #string State is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). + -- @param #string ScoreText is a text describing the score that is given according the status. + -- @param #number Score is a number providing the score of the status. + -- @return #FSM self + function FSM:AddScoreProcess( From, Event, State, ScoreText, Score ) + self:F( { From, Event, State, ScoreText, Score } ) + + local Process = self:GetProcess( From, Event ) + + Process._Scores[State] = Process._Scores[State] or {} + Process._Scores[State].ScoreText = ScoreText + Process._Scores[State].Score = Score + + self:T( Process._Scores ) + + return Process + end + + --- Returns a table with the scores defined. + function FSM:GetScores() + + return self._Scores or {} + end + + --- Returns a table with the Subs defined. + function FSM:GetSubs() + + return self.options.subs + end + + + function FSM:LoadCallBacks( CallBackTable ) + + for name, callback in pairs( CallBackTable or {} ) do + self[name] = callback + end + + end + + function FSM:_eventmap( Events, EventStructure ) + + local Event = EventStructure.Event + local __Event = "__" .. EventStructure.Event + self[Event] = self[Event] or self:_create_transition(Event) + self[__Event] = self[__Event] or self:_delayed_transition(Event) + self:T( "Added methods: " .. Event .. ", " .. __Event ) + Events[Event] = self.Events[Event] or { map = {} } + self:_add_to_map( Events[Event].map, EventStructure ) + + end + + function FSM:_submap( subs, sub, name ) + self:F( { sub = sub, name = name } ) + subs[sub.From] = subs[sub.From] or {} + subs[sub.From][sub.Event] = subs[sub.From][sub.Event] or {} + + -- Make the reference table weak. + -- setmetatable( subs[sub.From][sub.Event], { __mode = "k" } ) + + subs[sub.From][sub.Event][sub] = {} + subs[sub.From][sub.Event][sub].fsm = sub.fsm + subs[sub.From][sub.Event][sub].StartEvent = sub.StartEvent + subs[sub.From][sub.Event][sub].ReturnEvents = sub.ReturnEvents or {} -- these events need to be given to find the correct continue event ... if none given, the processing will stop. + subs[sub.From][sub.Event][sub].name = name + subs[sub.From][sub.Event][sub].fsmparent = self + end + + + function FSM:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, unpack( params ) ) end, ErrorHandler ) + return Value + end + end + + function FSM._handler( self, EventName, ... ) + + local Can, to = self:can( EventName ) + + if to == "*" then + to = self.current + end + + if Can then + local from = self.current + local params = { from, EventName, to, ... } + + if self.Controllable then + self:T( "FSM Transition for " .. self.Controllable.ControllableName .. " :" .. self.current .. " --> " .. EventName .. " --> " .. to ) + else + self:T( "FSM Transition:" .. self.current .. " --> " .. EventName .. " --> " .. to ) + end + + if ( self:_call_handler("onbefore" .. EventName, params, EventName ) == false ) + or ( self:_call_handler("OnBefore" .. EventName, params, EventName ) == false ) + or ( self:_call_handler("onleave" .. from, params, EventName ) == false ) + or ( self:_call_handler("OnLeave" .. from, params, EventName ) == false ) then + self:T( "Cancel Transition" ) + return false + end + + self.current = to + + local execute = true + + local subtable = self:_gosub( from, EventName ) + for _, sub in pairs( subtable ) do + --if sub.nextevent then + -- self:F2( "nextevent = " .. sub.nextevent ) + -- self[sub.nextevent]( self ) + --end + self:T( "calling sub start event: " .. sub.StartEvent ) + sub.fsm.fsmparent = self + sub.fsm.ReturnEvents = sub.ReturnEvents + sub.fsm[sub.StartEvent]( sub.fsm ) + execute = false + end + + local fsmparent, Event = self:_isendstate( to ) + if fsmparent and Event then + self:F2( { "end state: ", fsmparent, Event } ) + self:_call_handler("onenter" .. to, params, EventName ) + self:_call_handler("OnEnter" .. to, params, EventName ) + self:_call_handler("onafter" .. EventName, params, EventName ) + self:_call_handler("OnAfter" .. EventName, params, EventName ) + self:_call_handler("onstatechange", params, EventName ) + fsmparent[Event]( fsmparent ) + execute = false + end + + if execute then + -- only execute the call if the From state is not equal to the To state! Otherwise this function should never execute! + --if from ~= to then + self:_call_handler("onenter" .. to, params, EventName ) + self:_call_handler("OnEnter" .. to, params, EventName ) + --end + + self:_call_handler("onafter" .. EventName, params, EventName ) + self:_call_handler("OnAfter" .. EventName, params, EventName ) + + self:_call_handler("onstatechange", params, EventName ) + end + else + self:T( "Cannot execute transition." ) + self:T( { From = self.current, Event = EventName, To = to, Can = Can } ) + end + + return nil + end + + function FSM:_delayed_transition( EventName ) + return function( self, DelaySeconds, ... ) + self:T2( "Delayed Event: " .. EventName ) + local CallID = 0 + if DelaySeconds ~= nil then + if DelaySeconds < 0 then -- Only call the event ONCE! + DelaySeconds = math.abs( DelaySeconds ) + if not self._EventSchedules[EventName] then + CallID = self.CallScheduler:Schedule( self, self._handler, { EventName, ... }, DelaySeconds or 1 ) + self._EventSchedules[EventName] = CallID + else + -- reschedule + end + else + CallID = self.CallScheduler:Schedule( self, self._handler, { EventName, ... }, DelaySeconds or 1 ) + end + else + error( "FSM: An asynchronous event trigger requires a DelaySeconds parameter!!! This can be positive or negative! Sorry, but will not process this." ) + end + self:T2( { CallID = CallID } ) + end + end + + function FSM:_create_transition( EventName ) + return function( self, ... ) return self._handler( self, EventName , ... ) end + end + + function FSM:_gosub( ParentFrom, ParentEvent ) + local fsmtable = {} + if self.subs[ParentFrom] and self.subs[ParentFrom][ParentEvent] then + self:T( { ParentFrom, ParentEvent, self.subs[ParentFrom], self.subs[ParentFrom][ParentEvent] } ) + return self.subs[ParentFrom][ParentEvent] + else + return {} + end + end + + function FSM:_isendstate( Current ) + local FSMParent = self.fsmparent + if FSMParent and self.endstates[Current] then + self:T( { state = Current, endstates = self.endstates, endstate = self.endstates[Current] } ) + FSMParent.current = Current + local ParentFrom = FSMParent.current + self:T( ParentFrom ) + self:T( self.ReturnEvents ) + local Event = self.ReturnEvents[Current] + self:T( { ParentFrom, Event, self.ReturnEvents } ) + if Event then + return FSMParent, Event + else + self:T( { "Could not find parent event name for state ", ParentFrom } ) + end + end + + return nil + end + + function FSM:_add_to_map( Map, Event ) + self:F3( { Map, Event } ) + if type(Event.From) == 'string' then + Map[Event.From] = Event.To + else + for _, From in ipairs(Event.From) do + Map[From] = Event.To + end + end + self:T3( { Map, Event } ) + end + + function FSM:GetState() + return self.current + end + + + function FSM:Is( State ) + return self.current == State + end + + function FSM:is(state) + return self.current == state + end + + function FSM:can(e) + local Event = self.Events[e] + self:F3( { self.current, Event } ) + local To = Event and Event.map[self.current] or Event.map['*'] + return To ~= nil, To + end + + function FSM:cannot(e) + return not self:can(e) + end + +end + +do -- FSM_CONTROLLABLE + + --- FSM_CONTROLLABLE class + -- @type FSM_CONTROLLABLE + -- @field Wrapper.Controllable#CONTROLLABLE Controllable + -- @extends Core.Fsm#FSM + FSM_CONTROLLABLE = { + ClassName = "FSM_CONTROLLABLE", + } + + --- Creates a new FSM_CONTROLLABLE object. + -- @param #FSM_CONTROLLABLE self + -- @param #table FSMT Finite State Machine Table + -- @param Wrapper.Controllable#CONTROLLABLE Controllable (optional) The CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @return #FSM_CONTROLLABLE + function FSM_CONTROLLABLE:New( FSMT, Controllable ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New( FSMT ) ) -- Core.Fsm#FSM_CONTROLLABLE + + if Controllable then + self:SetControllable( Controllable ) + end + + self:AddTransition( "*", "Stop", "Stopped" ) + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnBeforeStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnAfterStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] Stop + -- @param #FSM_CONTROLLABLE self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] __Stop + -- @param #FSM_CONTROLLABLE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#FSM_CONTROLLABLE] OnLeaveStopped + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#FSM_CONTROLLABLE] OnEnterStopped + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + return self + end + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnAfterStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function FSM_CONTROLLABLE:OnAfterStop(Controllable,From,Event,To) + + -- Clear all pending schedules + self.CallScheduler:Clear() + end + + --- Sets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE FSMControllable + -- @return #FSM_CONTROLLABLE + function FSM_CONTROLLABLE:SetControllable( FSMControllable ) + self:F( FSMControllable ) + self.Controllable = FSMControllable + end + + --- Gets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @param #FSM_CONTROLLABLE self + -- @return Wrapper.Controllable#CONTROLLABLE + function FSM_CONTROLLABLE:GetControllable() + return self.Controllable + end + + function FSM_CONTROLLABLE:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self[handler] then + self:F3( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, self.Controllable, unpack( params ) ) end, ErrorHandler ) + return Value + --return self[handler]( self, self.Controllable, unpack( params ) ) + end + end + +end + +do -- FSM_PROCESS + + --- FSM_PROCESS class + -- @type FSM_PROCESS + -- @field Tasking.Task#TASK Task + -- @extends Core.Fsm#FSM_CONTROLLABLE + FSM_PROCESS = { + ClassName = "FSM_PROCESS", + } + + --- Creates a new FSM_PROCESS object. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:New( Controllable, Task ) + + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- Core.Fsm#FSM_PROCESS + + self:F( Controllable, Task ) + + self:Assign( Controllable, Task ) + + return self + end + + function FSM_PROCESS:Init( FsmProcess ) + self:T( "No Initialisation" ) + end + + function FSM_PROCESS:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in FSM_PROCESS call handler:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self[handler] then + self:F3( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, self.Controllable, self.Task, unpack( params ) ) end, ErrorHandler ) + return Value + --return self[handler]( self, self.Controllable, unpack( params ) ) + end + end + + --- Creates a new FSM_PROCESS object based on this FSM_PROCESS. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:Copy( Controllable, Task ) + self:T( { self:GetClassNameAndID() } ) + + + local NewFsm = self:New( Controllable, Task ) -- Core.Fsm#FSM_PROCESS + + NewFsm:Assign( Controllable, Task ) + + -- Polymorphic call to initialize the new FSM_PROCESS based on self FSM_PROCESS + NewFsm:Init( self ) + + -- Set Start State + NewFsm:SetStartState( self:GetStartState() ) + + -- Copy Transitions + for TransitionID, Transition in pairs( self:GetTransitions() ) do + NewFsm:AddTransition( Transition.From, Transition.Event, Transition.To ) + end + + -- Copy Processes + for ProcessID, Process in pairs( self:GetProcesses() ) do + self:E( { Process} ) + local FsmProcess = NewFsm:AddProcess( Process.From, Process.Event, Process.fsm:Copy( Controllable, Task ), Process.ReturnEvents ) + end + + -- Copy End States + for EndStateID, EndState in pairs( self:GetEndStates() ) do + self:T( EndState ) + NewFsm:AddEndState( EndState ) + end + + -- Copy the score tables + for ScoreID, Score in pairs( self:GetScores() ) do + self:T( Score ) + NewFsm:AddScore( ScoreID, Score.ScoreText, Score.Score ) + end + + return NewFsm + end + + --- Removes an FSM_PROCESS object. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:Remove() + self:T( { self:GetClassNameAndID() } ) + + -- Copy Processes + for ProcessID, Process in pairs( self:GetProcesses() ) do + self:E( { Process} ) + Process.fsm:Remove() + Process.fsm = nil + end + + return self + end + + --- Sets the task of the process. + -- @param #FSM_PROCESS self + -- @param Tasking.Task#TASK Task + -- @return #FSM_PROCESS + function FSM_PROCESS:SetTask( Task ) + + self.Task = Task + + return self + end + + --- Gets the task of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.Task#TASK + function FSM_PROCESS:GetTask() + + return self.Task + end + + --- Gets the mission of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.Mission#MISSION + function FSM_PROCESS:GetMission() + + return self.Task.Mission + end + + --- Gets the mission of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.CommandCenter#COMMANDCENTER + function FSM_PROCESS:GetCommandCenter() + + return self:GetTask():GetMission():GetCommandCenter() + end + +-- TODO: Need to check and fix that an FSM_PROCESS is only for a UNIT. Not for a GROUP. + + --- Send a message of the @{Task} to the Group of the Unit. +-- @param #FSM_PROCESS self +function FSM_PROCESS:Message( Message ) + self:F( { Message = Message } ) + + local CC = self:GetCommandCenter() + local TaskGroup = self.Controllable:GetGroup() + + local PlayerName = self.Controllable:GetPlayerName() -- Only for a unit + PlayerName = PlayerName and " (" .. PlayerName .. ")" or "" -- If PlayerName is nil, then keep it nil, otherwise add brackets. + local Callsign = self.Controllable:GetCallsign() + local Prefix = Callsign and " @ " .. Callsign .. PlayerName or "" + + Message = Prefix .. ": " .. Message + CC:MessageToGroup( Message, TaskGroup ) +end + + + + + --- Assign the process to a @{Unit} and activate the process. + -- @param #FSM_PROCESS self + -- @param Task.Tasking#TASK Task + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @return #FSM_PROCESS self + function FSM_PROCESS:Assign( ProcessUnit, Task ) + self:T( { Task, ProcessUnit } ) + + self:SetControllable( ProcessUnit ) + self:SetTask( Task ) + + --self.ProcessGroup = ProcessUnit:GetGroup() + + return self + end + + function FSM_PROCESS:onenterAssigned( ProcessUnit ) + self:T( "Assign" ) + + self.Task:Assign() + end + + function FSM_PROCESS:onenterFailed( ProcessUnit ) + self:T( "Failed" ) + + self.Task:Fail() + end + + function FSM_PROCESS:onenterSuccess( ProcessUnit ) + self:T( "Success" ) + + self.Task:Success() + end + + --- StateMachine callback function for a FSM_PROCESS + -- @param #FSM_PROCESS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function FSM_PROCESS:onstatechange( ProcessUnit, Task, From, Event, To, Dummy ) + self:T( { ProcessUnit, From, Event, To, Dummy, self:IsTrace() } ) + + if self:IsTrace() then + MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + end + + self:T( { Scores = self._Scores, To = To } ) + -- TODO: This needs to be reworked with a callback functions allocated within Task, and set within the mission script from the Task Objects... + if self._Scores[To] then + + local Task = self.Task + local Scoring = Task:GetScoring() + if Scoring then + Scoring:_AddMissionTaskScore( Task.Mission, ProcessUnit, self._Scores[To].ScoreText, self._Scores[To].Score ) + end + end + end + +end + +do -- FSM_TASK + + --- FSM_TASK class + -- @type FSM_TASK + -- @field Tasking.Task#TASK Task + -- @extends Core.Fsm#FSM + FSM_TASK = { + ClassName = "FSM_TASK", + } + + --- Creates a new FSM_TASK object. + -- @param #FSM_TASK self + -- @param #table FSMT + -- @param Tasking.Task#TASK Task + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #FSM_TASK + function FSM_TASK:New( FSMT ) + + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New( FSMT ) ) -- Core.Fsm#FSM_TASK + + self["onstatechange"] = self.OnStateChange + + return self + end + + function FSM_TASK:_call_handler( handler, params, EventName ) + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + return self[handler]( self, unpack( params ) ) + end + end + +end -- FSM_TASK + +do -- FSM_SET + + --- FSM_SET class + -- @type FSM_SET + -- @field Core.Set#SET_BASE Set + -- @extends Core.Fsm#FSM + FSM_SET = { + ClassName = "FSM_SET", + } + + --- Creates a new FSM_SET object. + -- @param #FSM_SET self + -- @param #table FSMT Finite State Machine Table + -- @param Set_SET_BASE FSMSet (optional) The Set object that the FSM_SET governs. + -- @return #FSM_SET + function FSM_SET:New( FSMSet ) + + -- Inherits from BASE + self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM_SET + + if FSMSet then + self:Set( FSMSet ) + end + + return self + end + + --- Sets the SET_BASE object that the FSM_SET governs. + -- @param #FSM_SET self + -- @param Core.Set#SET_BASE FSMSet + -- @return #FSM_SET + function FSM_SET:Set( FSMSet ) + self:F( FSMSet ) + self.Set = FSMSet + end + + --- Gets the SET_BASE object that the FSM_SET governs. + -- @param #FSM_SET self + -- @return Core.Set#SET_BASE + function FSM_SET:Get() + return self.Controllable + end + + function FSM_SET:_call_handler( handler, params, EventName ) + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + return self[handler]( self, self.Set, unpack( params ) ) + end + end + +end -- FSM_SET + +--- This module contains the OBJECT class. +-- +-- 1) @{Object#OBJECT} class, extends @{Base#BASE} +-- =========================================================== +-- The @{Object#OBJECT} class is a wrapper class to handle the DCS Object objects: +-- +-- * Support all DCS Object APIs. +-- * Enhance with Object specific APIs not in the DCS Object API set. +-- * Manage the "state" of the DCS Object. +-- +-- 1.1) OBJECT constructor: +-- ------------------------------ +-- The OBJECT class provides the following functions to construct a OBJECT instance: +-- +-- * @{Object#OBJECT.New}(): Create a OBJECT instance. +-- +-- 1.2) OBJECT methods: +-- -------------------------- +-- The following methods can be used to identify an Object object: +-- +-- * @{Object#OBJECT.GetID}(): Returns the ID of the Object object. +-- +-- === +-- +-- @module Object + +--- The OBJECT class +-- @type OBJECT +-- @extends Core.Base#BASE +-- @field #string ObjectName The name of the Object. +OBJECT = { + ClassName = "OBJECT", + ObjectName = "", +} + +--- A DCSObject +-- @type DCSObject +-- @field id_ The ID of the controllable in DCS + +--- Create a new OBJECT from a DCSObject +-- @param #OBJECT self +-- @param Dcs.DCSWrapper.Object#Object ObjectName The Object name +-- @return #OBJECT self +function OBJECT:New( ObjectName, Test ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( ObjectName ) + self.ObjectName = ObjectName + + return self +end + + +--- Returns the unit's unique identifier. +-- @param Wrapper.Object#OBJECT self +-- @return Dcs.DCSWrapper.Object#Object.ID ObjectID +-- @return #nil The DCS Object is not existing or alive. +function OBJECT:GetID() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + + if DCSObject then + local ObjectID = DCSObject:getID() + return ObjectID + end + + return nil +end + +--- Destroys the OBJECT. +-- @param #OBJECT self +-- @return #nil The DCS Unit is not existing or alive. +function OBJECT:Destroy() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + + if DCSObject then + + DCSObject:destroy() + end + + return nil +end + + + + +--- This module contains the IDENTIFIABLE class. +-- +-- 1) @{#IDENTIFIABLE} class, extends @{Object#OBJECT} +-- =============================================================== +-- The @{#IDENTIFIABLE} class is a wrapper class to handle the DCS Identifiable objects: +-- +-- * Support all DCS Identifiable APIs. +-- * Enhance with Identifiable specific APIs not in the DCS Identifiable API set. +-- * Manage the "state" of the DCS Identifiable. +-- +-- 1.1) IDENTIFIABLE constructor: +-- ------------------------------ +-- The IDENTIFIABLE class provides the following functions to construct a IDENTIFIABLE instance: +-- +-- * @{#IDENTIFIABLE.New}(): Create a IDENTIFIABLE instance. +-- +-- 1.2) IDENTIFIABLE methods: +-- -------------------------- +-- The following methods can be used to identify an identifiable object: +-- +-- * @{#IDENTIFIABLE.GetName}(): Returns the name of the Identifiable. +-- * @{#IDENTIFIABLE.IsAlive}(): Returns if the Identifiable is alive. +-- * @{#IDENTIFIABLE.GetTypeName}(): Returns the type name of the Identifiable. +-- * @{#IDENTIFIABLE.GetCoalition}(): Returns the coalition of the Identifiable. +-- * @{#IDENTIFIABLE.GetCountry}(): Returns the country of the Identifiable. +-- * @{#IDENTIFIABLE.GetDesc}(): Returns the descriptor structure of the Identifiable. +-- +-- +-- === +-- +-- @module Identifiable + +--- The IDENTIFIABLE class +-- @type IDENTIFIABLE +-- @extends Wrapper.Object#OBJECT +-- @field #string IdentifiableName The name of the identifiable. +IDENTIFIABLE = { + ClassName = "IDENTIFIABLE", + IdentifiableName = "", +} + +local _CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Identifiable", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Create a new IDENTIFIABLE from a DCSIdentifiable +-- @param #IDENTIFIABLE self +-- @param Dcs.DCSWrapper.Identifiable#Identifiable IdentifiableName The DCS Identifiable name +-- @return #IDENTIFIABLE self +function IDENTIFIABLE:New( IdentifiableName ) + local self = BASE:Inherit( self, OBJECT:New( IdentifiableName ) ) + self:F2( IdentifiableName ) + self.IdentifiableName = IdentifiableName + return self +end + +--- Returns if the Identifiable is alive. +-- @param #IDENTIFIABLE self +-- @return #boolean true if Identifiable is alive. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:IsAlive() + self:F3( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableIsAlive = DCSIdentifiable:isExist() + return IdentifiableIsAlive + end + + return false +end + + + + +--- Returns DCS Identifiable object name. +-- The function provides access to non-activated objects too. +-- @param #IDENTIFIABLE self +-- @return #string The name of the DCS Identifiable. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetName() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableName = self.IdentifiableName + return IdentifiableName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + +--- Returns the type name of the DCS Identifiable. +-- @param #IDENTIFIABLE self +-- @return #string The type name of the DCS Identifiable. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetTypeName() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableTypeName = DCSIdentifiable:getTypeName() + self:T3( IdentifiableTypeName ) + return IdentifiableTypeName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + +--- Returns category of the DCS Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSWrapper.Object#Object.Category The category ID +function IDENTIFIABLE:GetCategory() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + local ObjectCategory = DCSObject:getCategory() + self:T3( ObjectCategory ) + return ObjectCategory + end + + return nil +end + + +--- Returns the DCS Identifiable category name as defined within the DCS Identifiable Descriptor. +-- @param #IDENTIFIABLE self +-- @return #string The DCS Identifiable Category Name +function IDENTIFIABLE:GetCategoryName() + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCategoryName = _CategoryName[ self:GetDesc().category ] + return IdentifiableCategoryName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Returns coalition of the Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSCoalitionWrapper.Object#coalition.side The side of the coalition. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetCoalition() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCoalition = DCSIdentifiable:getCoalition() + self:T3( IdentifiableCoalition ) + return IdentifiableCoalition + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Returns country of the Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCScountry#country.id The country identifier. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetCountry() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCountry = DCSIdentifiable:getCountry() + self:T3( IdentifiableCountry ) + return IdentifiableCountry + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + + +--- Returns Identifiable descriptor. Descriptor type depends on Identifiable category. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSWrapper.Identifiable#Identifiable.Desc The Identifiable descriptor. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetDesc() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableDesc = DCSIdentifiable:getDesc() + self:T2( IdentifiableDesc ) + return IdentifiableDesc + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Gets the CallSign of the IDENTIFIABLE, which is a blank by default. +-- @param #IDENTIFIABLE self +-- @return #string The CallSign of the IDENTIFIABLE. +function IDENTIFIABLE:GetCallsign() + return '' +end + + +function IDENTIFIABLE:GetThreatLevel() + + return 0, "Scenery" +end +--- This module contains the POSITIONABLE class. +-- +-- 1) @{Positionable#POSITIONABLE} class, extends @{Identifiable#IDENTIFIABLE} +-- =========================================================== +-- The @{Positionable#POSITIONABLE} class is a wrapper class to handle the POSITIONABLE objects: +-- +-- * Support all DCS APIs. +-- * Enhance with POSITIONABLE specific APIs not in the DCS API set. +-- * Manage the "state" of the POSITIONABLE. +-- +-- 1.1) POSITIONABLE constructor: +-- ------------------------------ +-- The POSITIONABLE class provides the following functions to construct a POSITIONABLE instance: +-- +-- * @{Positionable#POSITIONABLE.New}(): Create a POSITIONABLE instance. +-- +-- 1.2) POSITIONABLE methods: +-- -------------------------- +-- The following methods can be used to identify an measurable object: +-- +-- * @{Positionable#POSITIONABLE.GetID}(): Returns the ID of the measurable object. +-- * @{Positionable#POSITIONABLE.GetName}(): Returns the name of the measurable object. +-- +-- === +-- +-- @module Positionable + +--- The POSITIONABLE class +-- @type POSITIONABLE +-- @extends Wrapper.Identifiable#IDENTIFIABLE +-- @field #string PositionableName The name of the measurable. +POSITIONABLE = { + ClassName = "POSITIONABLE", + PositionableName = "", +} + +--- A DCSPositionable +-- @type DCSPositionable +-- @field id_ The ID of the controllable in DCS + +--- Create a new POSITIONABLE from a DCSPositionable +-- @param #POSITIONABLE self +-- @param Dcs.DCSWrapper.Positionable#Positionable PositionableName The POSITIONABLE name +-- @return #POSITIONABLE self +function POSITIONABLE:New( PositionableName ) + local self = BASE:Inherit( self, IDENTIFIABLE:New( PositionableName ) ) + + self.PositionableName = PositionableName + return self +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Position The 3D position vectors of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPositionVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePosition = DCSPositionable:getPosition().p + self:T3( PositionablePosition ) + return PositionablePosition + end + + return nil +end + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec2 The 2D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVec2() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + + local PositionableVec2 = {} + PositionableVec2.x = PositionableVec3.x + PositionableVec2.y = PositionableVec3.z + + self:T2( PositionableVec2 ) + return PositionableVec2 + end + + return nil +end + +--- Returns a POINT_VEC2 object indicating the point in 2D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Core.Point#POINT_VEC2 The 2D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPointVec2() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + + local PositionablePointVec2 = POINT_VEC2:NewFromVec3( PositionableVec3 ) + + self:T2( PositionablePointVec2 ) + return PositionablePointVec2 + end + + return nil +end + +--- Returns a POINT_VEC3 object indicating the point in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Core.Point#POINT_VEC3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPointVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = self:GetPositionVec3() + + local PositionablePointVec3 = POINT_VEC3:NewFromVec3( PositionableVec3 ) + + self:T2( PositionablePointVec3 ) + return PositionablePointVec3 + end + + return nil +end + + +--- Returns a random @{DCSTypes#Vec3} vector within a range, indicating the point in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetRandomVec3( Radius ) + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePointVec3 = DCSPositionable:getPosition().p + local PositionableRandomVec3 = {} + local angle = math.random() * math.pi*2; + PositionableRandomVec3.x = PositionablePointVec3.x + math.cos( angle ) * math.random() * Radius; + PositionableRandomVec3.y = PositionablePointVec3.y + PositionableRandomVec3.z = PositionablePointVec3.z + math.sin( angle ) * math.random() * Radius; + + self:T3( PositionableRandomVec3 ) + return PositionableRandomVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Vec3} vector indicating the 3D vector of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + self:T3( PositionableVec3 ) + return PositionableVec3 + end + + return nil +end + +--- Returns the altitude of the POSITIONABLE. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Distance The altitude of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetAltitude() + self:F2() + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePointVec3 = DCSPositionable:getPoint() --Dcs.DCSTypes#Vec3 + return PositionablePointVec3.y + end + + return nil +end + +--- Returns if the Positionable is located above a runway. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #boolean true if Positionable is above a runway. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:IsAboveRunway() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + + local Vec2 = self:GetVec2() + local SurfaceType = land.getSurfaceType( Vec2 ) + local IsAboveRunway = SurfaceType == land.SurfaceType.RUNWAY + + self:T2( IsAboveRunway ) + return IsAboveRunway + end + + return nil +end + + + +--- Returns the POSITIONABLE heading in degrees. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #number The POSTIONABLE heading +function POSITIONABLE:GetHeading() + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + + local PositionablePosition = DCSPositionable:getPosition() + if PositionablePosition then + local PositionableHeading = math.atan2( PositionablePosition.x.z, PositionablePosition.x.x ) + if PositionableHeading < 0 then + PositionableHeading = PositionableHeading + 2 * math.pi + end + PositionableHeading = PositionableHeading * 180 / math.pi + self:T2( PositionableHeading ) + return PositionableHeading + end + end + + return nil +end + + +--- Returns true if the POSITIONABLE is in the air. +-- Polymorphic, is overridden in GROUP and UNIT. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #boolean true if in the air. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:InAir() + self:F2( self.PositionableName ) + + return nil +end + + +--- Returns the POSITIONABLE velocity vector. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The velocity vector +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVelocity() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVelocityVec3 = DCSPositionable:getVelocity() + self:T3( PositionableVelocityVec3 ) + return PositionableVelocityVec3 + end + + return nil +end + +--- Returns the POSITIONABLE velocity in km/h. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #number The velocity in km/h +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVelocityKMH() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local VelocityVec3 = self:GetVelocity() + local Velocity = ( VelocityVec3.x ^ 2 + VelocityVec3.y ^ 2 + VelocityVec3.z ^ 2 ) ^ 0.5 -- in meters / sec + local Velocity = Velocity * 3.6 -- now it is in km/h. + self:T3( Velocity ) + return Velocity + end + + return nil +end + +--- Returns a message with the callsign embedded (if there is one). +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +-- @return Core.Message#MESSAGE +function POSITIONABLE:GetMessage( Message, Duration, Name ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + Name = Name or self:GetTypeName() + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. Name .. ")" ) + 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToAll( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToAll() + end + + return nil +end + +--- Send a message to a 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTYpes#Duration Duration The duration of the message. +-- @param Dcs.DCScoalition#coalition MessageCoalition The Coalition receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToCoalition( Message, Duration, MessageCoalition, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToCoalition( MessageCoalition ) + 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTYpes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToRed( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToBlue( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Client#CLIENT Client The client object receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToClient( Message, Duration, Client, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToClient( Client ) + end + + return nil +end + +--- Send a message to a @{Group}. +-- 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Group#GROUP MessageGroup The GROUP object receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToGroup( Message, Duration, MessageGroup, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + if DCSObject:isExist() then + self:GetMessage( Message, Duration, Name ):ToGroup( MessageGroup ) + end + end + + return nil +end + +--- Send a message to the players in the @{Group}. +-- 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:Message( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToGroup( self ) + end + + return nil +end + + + + + +--- This module contains the CONTROLLABLE class. +-- +-- 1) @{Controllable#CONTROLLABLE} class, extends @{Positionable#POSITIONABLE} +-- =========================================================== +-- The @{Controllable#CONTROLLABLE} class is a wrapper class to handle the DCS Controllable objects: +-- +-- * Support all DCS Controllable APIs. +-- * Enhance with Controllable specific APIs not in the DCS Controllable API set. +-- * Handle local Controllable Controller. +-- * Manage the "state" of the DCS Controllable. +-- +-- 1.1) CONTROLLABLE constructor +-- ----------------------------- +-- The CONTROLLABLE class provides the following functions to construct a CONTROLLABLE instance: +-- +-- * @{#CONTROLLABLE.New}(): Create a CONTROLLABLE instance. +-- +-- 1.2) CONTROLLABLE task methods +-- ------------------------------ +-- Several controllable 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 @{Controllable#CONTROLLABLE.PushTask} or @{Controllable#SetTask} method to assign the task to the CONTROLLABLE. +-- Tasks are specific for the category of the CONTROLLABLE, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which controllable 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 controllable 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: +-- +-- * @{#CONTROLLABLE.TaskAttackGroup}: (AIR) Attack a Controllable. +-- * @{#CONTROLLABLE.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#CONTROLLABLE.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#CONTROLLABLE.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#CONTROLLABLE.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#CONTROLLABLE.TaskEmbarking}: (AIR) Move the controllable to a Vec2 Point, wait for a defined duration and embark a controllable. +-- * @{#CONTROLLABLE.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#CONTROLLABLE.TaskEscort}: (AIR) Escort another airborne controllable. +-- * @{#CONTROLLABLE.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction. +-- * @{#CONTROLLABLE.TaskFireAtPoint}: (GROUND) Fire some or all ammunition at a VEC2 point. +-- * @{#CONTROLLABLE.TaskFollow}: (AIR) Following another airborne controllable. +-- * @{#CONTROLLABLE.TaskHold}: (GROUND) Hold ground controllable from moving. +-- * @{#CONTROLLABLE.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the controllable. +-- * @{#CONTROLLABLE.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#CONTROLLABLE.TaskLandAtZone}: (AIR) Land the controllable at a @{Zone#ZONE_RADIUS). +-- * @{#CONTROLLABLE.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the controllable at a specified alititude. +-- * @{#CONTROLLABLE.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#CONTROLLABLE.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#CONTROLLABLE.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#CONTROLLABLE.TaskRouteToVec2}: (AIR + GROUND) Make the Controllable move to a given point. +-- * @{#CONTROLLABLE.TaskRouteToVec3}: (AIR + GROUND) Make the Controllable move to a given point. +-- * @{#CONTROLLABLE.TaskRouteToZone}: (AIR + GROUND) Route the controllable to a given zone. +-- * @{#CONTROLLABLE.TaskReturnToBase}: (AIR) Route the controllable to an airbase. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the controllable (using its sensors) before the task can be executed: +-- +-- * @{#CONTROLLABLE.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#CONTROLLABLE.EnRouteTaskEngageControllable}: (AIR) Engaging a controllable. The task does not assign the target controllable to the unit/controllable to attack now; it just allows the unit/controllable to engage the target controllable as well as other assigned targets. +-- * @{#CONTROLLABLE.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#CONTROLLABLE.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#CONTROLLABLE.EnRouteTaskFAC}: (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose a targets (enemy ground controllable) around as well as other assigned targets. +-- * @{#CONTROLLABLE.EnRouteTaskFAC_EngageControllable}: (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose the target (enemy ground controllable) as well as other assigned targets. +-- * @{#CONTROLLABLE.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: +-- +-- * @{#CONTROLLABLE.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#CONTROLLABLE.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#CONTROLLABLE.TaskCondition}: Return a condition section for a controlled task. +-- * @{#CONTROLLABLE.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from controllable templates +-- +-- Controllable templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a controllable and assign it to another: +-- +-- * @{#CONTROLLABLE.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) CONTROLLABLE Command methods +-- -------------------------- +-- Controllable **command methods** prepare the execution of commands using the @{#CONTROLLABLE.SetCommand} method: +-- +-- * @{#CONTROLLABLE.CommandDoScript}: Do Script command. +-- * @{#CONTROLLABLE.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) CONTROLLABLE Option methods +-- ------------------------- +-- Controllable **Option methods** change the behaviour of the Controllable while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#CONTROLLABLE.OptionROEWeaponFree} +-- * @{#CONTROLLABLE.OptionROEOpenFire} +-- * @{#CONTROLLABLE.OptionROEReturnFire} +-- * @{#CONTROLLABLE.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific controllable, use: +-- +-- * @{#CONTROLLABLE.OptionROEWeaponFreePossible} +-- * @{#CONTROLLABLE.OptionROEOpenFirePossible} +-- * @{#CONTROLLABLE.OptionROEReturnFirePossible} +-- * @{#CONTROLLABLE.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#CONTROLLABLE.OptionROTNoReaction} +-- * @{#CONTROLLABLE.OptionROTPassiveDefense} +-- * @{#CONTROLLABLE.OptionROTEvadeFire} +-- * @{#CONTROLLABLE.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific controllable, use: +-- +-- * @{#CONTROLLABLE.OptionROTNoReactionPossible} +-- * @{#CONTROLLABLE.OptionROTPassiveDefensePossible} +-- * @{#CONTROLLABLE.OptionROTEvadeFirePossible} +-- * @{#CONTROLLABLE.OptionROTVerticalPossible} +-- +-- === +-- +-- @module Controllable + +--- The CONTROLLABLE class +-- @type CONTROLLABLE +-- @extends Wrapper.Positionable#POSITIONABLE +-- @field Dcs.DCSWrapper.Controllable#Controllable DCSControllable The DCS controllable class. +-- @field #string ControllableName The name of the controllable. +CONTROLLABLE = { + ClassName = "CONTROLLABLE", + ControllableName = "", + WayPointFunctions = {}, +} + +--- Create a new CONTROLLABLE from a DCSControllable +-- @param #CONTROLLABLE self +-- @param Dcs.DCSWrapper.Controllable#Controllable ControllableName The DCS Controllable name +-- @return #CONTROLLABLE self +function CONTROLLABLE:New( ControllableName ) + local self = BASE:Inherit( self, POSITIONABLE:New( ControllableName ) ) + self:F2( ControllableName ) + self.ControllableName = ControllableName + + self.TaskScheduler = SCHEDULER:New( self ) + return self +end + +-- DCS Controllable methods support. + +--- Get the controller for the CONTROLLABLE. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSController#Controller +function CONTROLLABLE:_GetController() + self:F2( { self.ControllableName } ) + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local ControllableController = DCSControllable:getController() + self:T3( ControllableController ) + return ControllableController + end + + return nil +end + +-- Get methods + +--- Returns the UNITs wrappers of the DCS Units of the Controllable (default is a GROUP). +-- @param #CONTROLLABLE self +-- @return #list The UNITs wrappers. +function CONTROLLABLE:GetUnits() + self:F2( { self.ControllableName } ) + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local DCSUnits = DCSControllable: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 health. Dead controllables have health <= 1.0. +-- @param #CONTROLLABLE self +-- @return #number The controllable health value (unit or group average). +-- @return #nil The controllable is not existing or alive. +function CONTROLLABLE:GetLife() + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local UnitLife = 0 + local Units = self:GetUnits() + if #Units == 1 then + local Unit = Units[1] -- Wrapper.Unit#UNIT + UnitLife = Unit:GetLife() + else + local UnitLifeTotal = 0 + for UnitID, Unit in pairs( Units ) do + local Unit = Unit -- Wrapper.Unit#UNIT + UnitLifeTotal = UnitLifeTotal + Unit:GetLife() + end + UnitLife = UnitLifeTotal / #Units + end + return UnitLife + end + + return nil +end + + + +-- Tasks + +--- Clear all tasks from the controllable. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE +function CONTROLLABLE:ClearTasks() + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:resetTask() + return self + end + + return nil +end + + +--- Popping current Task from the controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:PopCurrentTask() + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + + -- When a controllable SPAWNs, it takes about a second to get the controllable in the simulator. Setting tasks to unspawned controllables provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Controllable. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + self.TaskScheduler:Schedule( 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 controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local Controller = self:_GetController() + self:T3( Controller ) + + -- When a controllable SPAWNs, it takes about a second to get the controllable in the simulator. Setting tasks to unspawned controllables provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Controllable. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + Controller:setTask( DCSTask ) + else + self.TaskScheduler:Schedule( Controller, Controller.setTask, { DCSTask }, WaitTime ) + end + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param Dcs.DCSTime#Time duration +-- @param #number lastWayPoint +-- return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSTasking.Task#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSTasking.Task#TaskArray DCSTasks Array of @{DCSTasking.Task#Task} +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + for TaskID, Task in ipairs( DCSTasks ) do + self:E( Task ) + end + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSCommand#Command DCSCommand +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSCommand#Command DCSCommand +-- @return #CONTROLLABLE self +function CONTROLLABLE:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #CONTROLLABLE self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return Dcs.DCSTasking.Task#Task +-- @usage +-- --- This test demonstrates the use(s) of the SwitchWayPoint method of the GROUP class. +-- HeliGroup = GROUP:FindByName( "Helicopter" ) +-- +-- --- Route the helicopter back to the FARP after 60 seconds. +-- -- We use the SCHEDULER class to do this. +-- SCHEDULER:New( nil, +-- function( HeliGroup ) +-- local CommandRTB = HeliGroup:CommandSwitchWayPoint( 2, 8 ) +-- HeliGroup:SetCommand( CommandRTB ) +-- end, { HeliGroup }, 90 +-- ) +function CONTROLLABLE:CommandSwitchWayPoint( FromWayPoint, ToWayPoint ) + self:F2( { FromWayPoint, ToWayPoint } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + +--- Perform stop route command +-- @param #CONTROLLABLE self +-- @param #boolean StopRoute +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:CommandStopRoute( StopRoute, Index ) + self:F2( { StopRoute, Index } ) + + local CommandStopRoute = { + id = 'StopRoute', + params = { + value = StopRoute, + }, + } + + self:T3( { CommandStopRoute } ) + return CommandStopRoute +end + + +-- TASKS FOR AIR CONTROLLABLES + + +--- (AIR) Attack a Controllable. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup The Controllable 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired attack start altitude. Controllable/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/controllable will choose closest altitude to the desired attack start altitude. If the desired altitude is defined controllable/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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.ControllableName, 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 #CONTROLLABLE self +-- @param Wrapper.Unit#UNIT AttackUnit The UNIT. +-- @param #boolean GroupAttack (optional) If true, all units in the group will attack the Unit when found. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/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 ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackUnit( AttackUnit, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack ) + self:F2( { self.ControllableName, AttackUnit, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack } ) + + local DCSTask + DCSTask = { + id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + groupAttack = GroupAttack or false, + visible = Visible or false, + expend = WeaponExpend or "Auto", + directionEnabled = Direction and true or false, + direction = Direction, + altitudeEnabled = Altitude and true or false, + altitude = Altitude or 30, + attackQtyLimit = AttackQty and true or false, + attackQty = AttackQty, + }, + } + + self:E( DCSTask ) + + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable 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 Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskBombing( Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = Vec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + 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 #CONTROLLABLE self +-- @param Dcs.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 #CONTROLLABLE self +function CONTROLLABLE:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.ControllableName, 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 controllable at a specified alititude. +-- @param #CONTROLLABLE self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.ControllableName, Altitude, Speed } ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local ControllablePoint = self:GetVec2() + return self:TaskOrbitCircleAtVec2( ControllablePoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the controllable. +-- @param #CONTROLLABLE self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskHoldPosition() + self:F2( { self.ControllableName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackMapObject( Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = Vec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #CONTROLLABLE self +-- @param Wrapper.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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskRefueling() + self:F2( { self.ControllableName } ) + +-- 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskLandAtVec2( Point, Duration ) + self:F2( { self.ControllableName, 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 controllable at a @{Zone#ZONE_RADIUS). +-- @param #CONTROLLABLE self +-- @param Core.Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.ControllableName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomVec2() + else + Point = Zone:GetVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne controllable. +-- The unit / controllable will follow lead unit of another controllable, wingmens of both controllables will continue following their leaders. +-- If another controllable is on land the unit / controllable will orbit around. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE FollowControllable The controllable to be followed. +-- @param Dcs.DCSTypes#Vec3 Vec3 Position of the unit / lead unit of the controllable relative lead unit of another controllable in frame reference oriented by course of lead unit of another controllable. If another controllable is on land the unit / controllable will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another controllable. Once reached the unit / controllable Follow task is finished. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFollow( FollowControllable, Vec3, LastWaypointIndex ) + self:F2( { self.ControllableName, FollowControllable, Vec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = false + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { + id = 'Follow', + params = { + groupId = FollowControllable:GetID(), + pos = Vec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne controllable. +-- The unit / controllable will follow lead unit of another controllable, wingmens of both controllables will continue following their leaders. +-- The unit / controllable will also protect that controllable from threats of specified types. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE EscortControllable The controllable to be escorted. +-- @param Dcs.DCSTypes#Vec3 Vec3 Position of the unit / lead unit of the controllable relative lead unit of another controllable in frame reference oriented by course of lead unit of another controllable. If another controllable is on land the unit / controllable will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another controllable. Once reached the unit / controllable Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted controllable to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param Dcs.DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskEscort( FollowControllable, Vec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.ControllableName, FollowControllable, Vec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = false + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Escort', + params = { + groupId = FollowControllable:GetID(), + pos = Vec3, + 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The point to fire at. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @param #number AmmoCount (optional) Quantity of ammunition to expand (omit to fire until ammunition is depleted). +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFireAtPoint( Vec2, Radius, AmmoCount ) + self:F2( { self.ControllableName, Vec2, Radius, AmmoCount } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- expendQty = number, + -- expendQtyEnabled = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = Vec2, + radius = Radius, + expendQty = 100, -- dummy value + expendQtyEnabled = false, + } + } + + if AmmoCount then + DCSTask.params.expendQty = AmmoCount + DCSTask.params.expendQtyEnabled = true + end + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground controllable from moving. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskHold() + self:F2( { self.ControllableName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/CONTROLLABLES + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup Target CONTROLLABLE. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.ControllableName, 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-ACT_ROUTE TASKS FOR AIRBORNE CONTROLLABLES + +--- (AIR) Engaging targets of defined types. +-- @param #CONTROLLABLE self +-- @param Dcs.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 Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.ControllableName, 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 2D-coordinates of the zone. +-- @param Dcs.DCSTypes#Distance Radius Radius of the zone. +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageTargets( Vec2, Radius, TargetTypes, Priority ) + self:F2( { self.ControllableName, Vec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = Vec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a controllable. The task does not assign the target controllable to the unit/controllable to attack now; it just allows the unit/controllable to engage the target controllable as well as other assigned targets. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup The Controllable 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired attack start altitude. Controllable/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/controllable will choose closest altitude to the desired attack start altitude. If the desired altitude is defined controllable/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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.ControllableName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageControllable = { + -- id = 'EngageControllable ', + -- 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 = 'EngageControllable', + 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) Search and attack the Unit. +-- @param #CONTROLLABLE self +-- @param Wrapper.Unit#UNIT EngageUnit The UNIT. +-- @param #number Priority (optional) 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 #boolean GroupAttack (optional) If true, all units in the group will attack the Unit when found. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired altitude to perform the unit engagement. +-- @param #boolean Visible (optional) Unit must be visible. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageUnit( EngageUnit, Priority, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack ) + self:F2( { self.ControllableName, EngageUnit, Priority, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- controllableAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = EngageUnit:GetID(), + priority = Priority or 1, + groupAttack = GroupAttack or false, + visible = Visible or false, + expend = WeaponExpend or "Auto", + directionEnabled = Direction and true or false, + direction = Direction, + altitudeEnabled = Altitude and true or false, + altitude = Altitude, + attackQtyLimit = AttackQty and true or false, + attackQty = AttackQty, + controllableAttack = ControllableAttack, + }, + }, + + 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 #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskAWACS( ) + self:F2( { self.ControllableName } ) + +-- 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 #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskTanker( ) + self:F2( { self.ControllableName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/controllables + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEWR( ) + self:F2( { self.ControllableName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/controllables + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose the target (enemy ground controllable) 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 controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup Target CONTROLLABLE. +-- @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 Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.ControllableName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageControllable = { +-- id = 'FAC_EngageControllable', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageControllable', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose a targets (enemy ground controllable) 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 controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.ControllableName, 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 controllable to a Vec2 Point, wait for a defined duration and embark a controllable. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #CONTROLLABLE EmbarkingControllable The controllable to be embarked. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure +function CONTROLLABLE:TaskEmbarking( Point, Duration, EmbarkingControllable ) + self:F2( { self.ControllableName, Point, Duration, EmbarkingControllable.DCSControllable } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + controllablesForEmbarking = { EmbarkingControllable.ControllableID }, + 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 controllable when arrived within a defined Radius. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.ControllableName, Point, Radius } ) + + local DCSTask --Dcs.DCSTasking.Task#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 #CONTROLLABLE self +-- @param #table TaskMission A table containing the mission task. +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param #table Points A table of route points. +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Controllable move to fly to a given point. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #CONTROLLABLE self +function CONTROLLABLE:RouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local ControllablePoint = self:GetUnit( 1 ):GetVec2() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.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 Controllable move to a given point. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #CONTROLLABLE self +function CONTROLLABLE:RouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local ControllableVec3 = self:GetUnit( 1 ):GetVec3() + + local PointFrom = {} + PointFrom.x = ControllableVec3.x + PointFrom.y = ControllableVec3.z + PointFrom.alt = ControllableVec3.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 controllable to follow a given route. +-- @param #CONTROLLABLE self +-- @param #table GoPoints A table of Route Points. +-- @return #CONTROLLABLE self +function CONTROLLABLE:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + self.TaskScheduler:Schedule( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the controllable to a given zone. +-- The controllable final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #CONTROLLABLE self +-- @param Core.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 CONTROLLABLE:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local ControllablePoint = self:GetVec2() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.y + PointFrom.type = "Turning Point" + PointFrom.action = Formation or "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomVec2() + else + ZonePoint = Zone:GetVec2() + 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 + +--- (AIR) Return the Controllable to an @{Airbase#AIRBASE} +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #CONTROLLABLE self +-- @param Wrapper.Airbase#AIRBASE ReturnAirbase The @{Airbase#AIRBASE} to return to. +-- @param #number Speed (optional) The speed. +-- @return #string The route +function CONTROLLABLE:RouteReturnToAirbase( ReturnAirbase, Speed ) + self:F2( { ReturnAirbase, Speed } ) + +-- Example +-- [4] = +-- { +-- ["alt"] = 45, +-- ["type"] = "Land", +-- ["action"] = "Landing", +-- ["alt_type"] = "BARO", +-- ["formation_template"] = "", +-- ["properties"] = +-- { +-- ["vnav"] = 1, +-- ["scale"] = 0, +-- ["angle"] = 0, +-- ["vangle"] = 0, +-- ["steer"] = 2, +-- }, -- end of ["properties"] +-- ["ETA"] = 527.81058817743, +-- ["airdromeId"] = 12, +-- ["y"] = 243127.2973737, +-- ["x"] = -5406.2803440839, +-- ["name"] = "DictKey_WptName_53", +-- ["speed"] = 138.88888888889, +-- ["ETA_locked"] = false, +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] +-- ["speed_locked"] = true, +-- }, -- end of [4] + + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local ControllablePoint = self:GetVec2() + local ControllableVelocity = self:GetMaxVelocity() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = ControllableVelocity + + + local PointTo = {} + local AirbasePoint = ReturnAirbase:GetVec2() + + PointTo.x = AirbasePoint.x + PointTo.y = AirbasePoint.y + PointTo.type = "Land" + PointTo.action = "Landing" + PointTo.airdromeId = ReturnAirbase:GetID()-- Airdrome ID + self:T(PointTo.airdromeId) + --PointTo.alt = 0 + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + local Route = { points = Points, } + + return Route + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #CONTROLLABLE self +-- @param #string DoScript +-- @return #DCSCommand +function CONTROLLABLE:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the controllable. +-- @param #CONTROLLABLE self +-- @return #table The MissionTemplate +-- TODO: Rework the method how to retrieve a template ... +function CONTROLLABLE:GetTaskMission() + self:F2( self.ControllableName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Controllables[self.ControllableName].Template ) +end + +--- Return the mission route of the controllable. +-- @param #CONTROLLABLE self +-- @return #table The mission route defined by points. +function CONTROLLABLE:GetTaskRoute() + self:F2( self.ControllableName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Controllables[self.ControllableName].Template.route.points ) +end + +--- Return the route of a controllable by using the @{Database#DATABASE} class. +-- @param #CONTROLLABLE 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 CONTROLLABLE:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Controllable + local ControllableName = string.match( self:GetName(), ".*#" ) + if ControllableName then + ControllableName = ControllableName:sub( 1, -2 ) + else + ControllableName = self:GetName() + end + + self:T3( { ControllableName } ) + + local Template = _DATABASE.Templates.Controllables[ControllableName].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 + else + error( "Template not found for Controllable : " .. ControllableName ) + end + + return nil +end + + +--- Return the detected targets of the controllable. +-- The optional parametes specify the detection methods that can be applied. +-- If no detection method is given, the detection will use all the available methods by default. +-- @param Wrapper.Controllable#CONTROLLABLE self +-- @param #boolean DetectVisual (optional) +-- @param #boolean DetectOptical (optional) +-- @param #boolean DetectRadar (optional) +-- @param #boolean DetectIRST (optional) +-- @param #boolean DetectRWR (optional) +-- @param #boolean DetectDLINK (optional) +-- @return #table DetectedTargets +function CONTROLLABLE:GetDetectedTargets( DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK ) + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + local DetectionVisual = ( DetectVisual and DetectVisual == true ) and Controller.Detection.VISUAL or nil + local DetectionOptical = ( DetectOptical and DetectOptical == true ) and Controller.Detection.OPTICAL or nil + local DetectionRadar = ( DetectRadar and DetectRadar == true ) and Controller.Detection.RADAR or nil + local DetectionIRST = ( DetectIRST and DetectIRST == true ) and Controller.Detection.IRST or nil + local DetectionRWR = ( DetectRWR and DetectRWR == true ) and Controller.Detection.RWR or nil + local DetectionDLINK = ( DetectDLINK and DetectDLINK == true ) and Controller.Detection.DLINK or nil + + + return self:_GetController():getDetectedTargets( DetectionVisual, DetectionOptical, DetectionRadar, DetectionIRST, DetectionRWR, DetectionDLINK ) + end + + return nil +end + +function CONTROLLABLE:IsTargetDetected( DCSObject ) + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE hold their weapons? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEHoldFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Wrapper.Controllable#CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:OptionROEHoldFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack returning on enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEReturnFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEReturnFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack designated targets? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEOpenFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEOpenFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack targets of opportunity? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEWeaponFreePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEWeaponFree() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE ignore enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTNoReactionPossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTNoReaction() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade using passive defenses? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTPassiveDefensePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTPassiveDefense() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade on enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTEvadeFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTEvadeFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade on fire using vertical manoeuvres? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTVerticalPossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTVertical() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 + +--- Retrieve the controllable mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Controllable#CONTROLLABLE:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Controllable@CONTROLLABLE:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the controllable is RESTARTED! +-- @param #CONTROLLABLE self +-- @param #table WayPoints If WayPoints is given, then use the route. +-- @return #CONTROLLABLE +function CONTROLLABLE:WayPointInitialize( WayPoints ) + self:F( { WayPoints } ) + + if WayPoints then + self.WayPoints = WayPoints + else + self.WayPoints = self:GetTaskRoute() + end + + return self +end + +--- Get the current WayPoints set with the WayPoint functions( Note that the WayPoints can be nil, although there ARE waypoints). +-- @param #CONTROLLABLE self +-- @return #table WayPoints If WayPoints is given, then return the WayPoints structure. +function CONTROLLABLE:GetWayPoints() + self:F( ) + + if self.WayPoints then + return self.WayPoints + end + + return nil +end + +--- Registers a waypoint function that will be executed when the controllable moves over the WayPoint. +-- @param #CONTROLLABLE 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 controllable moves over the waypoint. The waypoint function takes variable parameters. +-- @return #CONTROLLABLE +function CONTROLLABLE: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 CONTROLLABLE:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + self:F2( { WayPoint, WayPointIndex, FunctionString, FunctionArguments } ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionControllable = GROUP:Find( ... ) " + + if FunctionArguments and #FunctionArguments > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionControllable, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionControllable )" + 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 controllable will be 1! +-- @param #CONTROLLABLE 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 #CONTROLLABLE +function CONTROLLABLE:WayPointExecute( WayPoint, WaitTime ) + self:F( { 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 + +-- Message APIs--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Controllable#CONTROLLABLE} +-- ============================================================= +-- 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 +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} task methods section for a description of the task methods. +-- +-- ### 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: +-- +-- * @{Controllable#CONTROLLABLE.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- ## 1.3) GROUP Command methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} command methods section for a description of the command methods. +-- +-- ## 1.4) GROUP option methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} option methods section for a description of the option methods. +-- +-- ## 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. +-- +-- ## 1.6) GROUP AI methods +-- +-- A GROUP has AI methods to control the AI activation. +-- +-- * @{#GROUP.SetAIOnOff}(): Turns the GROUP AI On or Off. +-- * @{#GROUP.SetAIOn}(): Turns the GROUP AI On. +-- * @{#GROUP.SetAIOff}(): Turns the GROUP AI Off. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-07: GROUP:**HandleEvent( Event, EventFunction )** added. +-- 2017-03-07: GROUP:**UnHandleEvent( Event )** added. +-- +-- 2017-01-24: GROUP:**SetAIOnOff( AIOnOff )** added. +-- +-- 2017-01-24: GROUP:**SetAIOn()** added. +-- +-- 2017-01-24: GROUP:**SetAIOff()** added. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * [**Entropy**](https://forums.eagle.ru/member.php?u=111471), **Afinegan**: Came up with the requirement for AIOnOff(). +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Group +-- @author FlightControl + +--- The GROUP class +-- @type GROUP +-- @extends Wrapper.Controllable#CONTROLLABLE +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", +} + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param Dcs.DCSWrapper.Group#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) ) + self:F2( GroupName ) + self.GroupName = GroupName + + self:SetEventPriority( 4 ) + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param Dcs.DCSWrapper.Group#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Wrapper.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 Dcs.DCSWrapper.Group#Group The DCS Group. +function GROUP:GetDCSObject() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Position The 3D position vectors of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function GROUP:GetPositionVec3() -- Overridden from POSITIONABLE:GetPositionVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePosition = DCSPositionable:getUnits()[1]:getPosition().p + self:T3( PositionablePosition ) + return PositionablePosition + 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:GetDCSObject() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() and DCSGroup:getUnit(1) ~= nil + 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:GetDCSObject() + + 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 Dcs.DCSWrapper.Group#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the #GROUP. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + 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 Dcs.DCSCoalitionWrapper.Object#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + 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 Dcs.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:GetDCSObject() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + 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 Wrapper.Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSObject() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + 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 Dcs.DCSWrapper.Unit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + 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:GetDCSObject() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSObject() ) + return self:GetDCSObject() +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:GetDCSObject() + + 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:GetDCSObject() + + 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. +-- @param #GROUP self +-- @return Dcs.DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetVec2() + self:F2( self.GroupName ) + + local UnitPoint = self:GetUnit(1) + UnitPoint:GetVec2() + local GroupPointVec2 = UnitPoint:GetVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current Vec3 vector of the first DCS Unit in the GROUP. +-- @return Dcs.DCSTypes#Vec3 Current Vec3 of the first DCS Unit of the GROUP. +function GROUP:GetVec3() + self:F2( self.GroupName ) + + local GroupVec3 = self:GetUnit(1):GetVec3() + self:T3( GroupVec3 ) + return GroupVec3 +end + + + +do -- Is Zone methods + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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 Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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 Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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 + +end + +do -- AI methods + + --- Turns the AI On or Off for the GROUP. + -- @param #GROUP self + -- @param #boolean AIOnOff The value true turns the AI On, the value false turns the AI Off. + -- @return #GROUP The GROUP. + function GROUP:SetAIOnOff( AIOnOff ) + + local DCSGroup = self:GetDCSObject() -- Dcs.DCSGroup#Group + + if DCSGroup then + local DCSController = DCSGroup:getController() -- Dcs.DCSController#Controller + if DCSController then + DCSController:setOnOff( AIOnOff ) + return self + end + end + + return nil + end + + --- Turns the AI On for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOn() + + return self:SetAIOnOff( true ) + end + + --- Turns the AI Off for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOff() + + return self:SetAIOnOff( false ) + end + +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:GetDCSObject() + + if DCSGroup then + local GroupVelocityMax = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local UnitVelocityVec3 = UnitData:getVelocity() + local UnitVelocity = math.abs( UnitVelocityVec3.x ) + math.abs( UnitVelocityVec3.y ) + math.abs( UnitVelocityVec3.z ) + + if UnitVelocity > GroupVelocityMax then + GroupVelocityMax = UnitVelocity + end + end + + return GroupVelocityMax + 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 + +-- SPAWNING + +--- Respawn the @{GROUP} using a (tweaked) template of the Group. +-- The template must be retrieved with the @{Group#GROUP.GetTemplate}() function. +-- The template contains all the definitions as declared within the mission file. +-- To understand templates, do the following: +-- +-- * unpack your .miz file into a directory using 7-zip. +-- * browse in the directory created to the file **mission**. +-- * open the file and search for the country group definitions. +-- +-- Your group template will contain the fields as described within the mission file. +-- +-- This function will: +-- +-- * Get the current position and heading of the group. +-- * When the group is alive, it will tweak the template x, y and heading coordinates of the group and the embedded units to the current units positions. +-- * Then it will destroy the current alive group. +-- * And it will respawn the group using your new template definition. +-- @param Wrapper.Group#GROUP self +-- @param #table Template The template of the Group retrieved with GROUP:GetTemplate() +function GROUP:Respawn( Template ) + + local Vec3 = self:GetVec3() + Template.x = Vec3.x + Template.y = Vec3.z + --Template.x = nil + --Template.y = nil + + self:E( #Template.units ) + for UnitID, UnitData in pairs( self:GetUnits() ) do + local GroupUnit = UnitData -- Wrapper.Unit#UNIT + self:E( GroupUnit:GetName() ) + if GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + Template.units[UnitID].alt = GroupUnitVec3.y + Template.units[UnitID].x = GroupUnitVec3.x + Template.units[UnitID].y = GroupUnitVec3.z + Template.units[UnitID].heading = GroupUnitHeading + self:E( { UnitID, Template.units[UnitID], Template.units[UnitID] } ) + end + end + + self:Destroy() + _DATABASE:Spawn( Template ) +end + +--- Returns the group template from the @{DATABASE} (_DATABASE object). +-- @param #GROUP self +-- @return #table +function GROUP:GetTemplate() + local GroupName = self:GetName() + self:E( GroupName ) + return _DATABASE:GetGroupTemplate( GroupName ) +end + +--- Sets the controlled status in a Template. +-- @param #GROUP self +-- @param #boolean Controlled true is controlled, false is uncontrolled. +-- @return #table +function GROUP:SetTemplateControlled( Template, Controlled ) + Template.uncontrolled = not Controlled + return Template +end + +--- Sets the CountryID of the group in a Template. +-- @param #GROUP self +-- @param Dcs.DCScountry#country.id CountryID The country ID. +-- @return #table +function GROUP:SetTemplateCountry( Template, CountryID ) + Template.CountryID = CountryID + return Template +end + +--- Sets the CoalitionID of the group in a Template. +-- @param #GROUP self +-- @param Dcs.DCSCoalitionWrapper.Object#coalition.side CoalitionID The coalition ID. +-- @return #table +function GROUP:SetTemplateCoalition( Template, CoalitionID ) + Template.CoalitionID = CoalitionID + return Template +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 + else + error( "Template not found for Group : " .. GroupName ) + end + + return nil +end + +--- Calculate the maxium A2G threat level of the Group. +-- @param #GROUP self +function GROUP:CalculateThreatLevelA2G() + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( self:GetUnits() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + return MaxThreatLevelA2G +end + +--- Returns true if the first unit of the GROUP is in the air. +-- @param Wrapper.Group#GROUP self +-- @return #boolean true if in the first unit of the group is in the air. +-- @return #nil The GROUP is not existing or not alive. +function GROUP:InAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + + if DCSGroup then + local DCSUnit = DCSGroup:getUnit(1) + if DCSUnit then + local GroupInAir = DCSGroup:getUnit(1):inAir() + self:T3( GroupInAir ) + return GroupInAir + end + end + + return nil +end + +function GROUP:OnReSpawn( ReSpawnFunction ) + + self.ReSpawnFunction = ReSpawnFunction +end + +do -- Event Handling + + --- Subscribe to a DCS Event. + -- @param #GROUP self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the GROUP. + -- @return #GROUP + function GROUP:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventForGroup( self:GetName(), EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #GROUP self + -- @param Core.Event#EVENTS Event + -- @return #GROUP + function GROUP:UnHandleEvent( Event ) + + self:EventDispatcher():RemoveForGroup( self:GetName(), self, Event ) + + return self + end + +end + +do -- Players + + --- Get player names + -- @param #GROUP self + -- @return #table The group has players, an array of player names is returned. + -- @return #nil The group has no players + function GROUP:GetPlayerNames() + + local PlayerNames = nil + + local Units = self:GetUnits() + for UnitID, UnitData in pairs( Units ) do + local Unit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = Unit:GetPlayerName() + if PlayerName and PlayerName ~= "" then + PlayerNames = PlayerNames or {} + table.insert( PlayerNames, PlayerName ) + end + end + + self:F( PlayerNames ) + return PlayerNames + end + +end--- This module contains the UNIT class. +-- +-- 1) @{#UNIT} class, extends @{Controllable#CONTROLLABLE} +-- =========================================================== +-- 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. +-- +-- +-- 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 @{DCSWrapper.Unit#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.GetVec3}() 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 + + + + + +--- The UNIT class +-- @type UNIT +-- @extends Wrapper.Controllable#CONTROLLABLE +UNIT = { + ClassName="UNIT", +} + + +--- Unit.SensorType +-- @type Unit.SensorType +-- @field OPTIC +-- @field RADAR +-- @field IRST +-- @field RWR + + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param #string UnitName The name of the DCS unit. +-- @return #UNIT +function UNIT:Register( UnitName ) + local self = BASE:Inherit( self, CONTROLLABLE:New( UnitName ) ) + self.UnitName = UnitName + + self:SetEventPriority( 3 ) + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param Dcs.DCSWrapper.Unit#Unit DCSUnit An existing DCS Unit object reference. +-- @return #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 self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Return the name of the UNIT. +-- @param #UNIT self +-- @return #string The UNIT name. +function UNIT:Name() + + return self.UnitName +end + + +--- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit +function UNIT:GetDCSObject() + + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Respawn the @{Unit} using a (tweaked) template of the parent Group. +-- +-- This function will: +-- +-- * Get the current position and heading of the group. +-- * When the unit is alive, it will tweak the template x, y and heading coordinates of the group and the embedded units to the current units positions. +-- * Then it will respawn the re-modelled group. +-- +-- @param #UNIT self +-- @param Dcs.DCSTypes#Vec3 SpawnVec3 The position where to Spawn the new Unit at. +-- @param #number Heading The heading of the unit respawn. +function UNIT:ReSpawn( SpawnVec3, Heading ) + + local SpawnGroupTemplate = UTILS.DeepCopy( _DATABASE:GetGroupTemplateFromUnitName( self:Name() ) ) + self:T( SpawnGroupTemplate ) + + local SpawnGroup = self:GetGroup() + + if SpawnGroup then + + local Vec3 = SpawnGroup:GetVec3() + SpawnGroupTemplate.x = SpawnVec3.x + SpawnGroupTemplate.y = SpawnVec3.z + + self:E( #SpawnGroupTemplate.units ) + for UnitID, UnitData in pairs( SpawnGroup:GetUnits() ) do + local GroupUnit = UnitData -- #UNIT + self:E( GroupUnit:GetName() ) + if GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + SpawnGroupTemplate.units[UnitID].alt = GroupUnitVec3.y + SpawnGroupTemplate.units[UnitID].x = GroupUnitVec3.x + SpawnGroupTemplate.units[UnitID].y = GroupUnitVec3.z + SpawnGroupTemplate.units[UnitID].heading = GroupUnitHeading + self:E( { UnitID, SpawnGroupTemplate.units[UnitID], SpawnGroupTemplate.units[UnitID] } ) + end + end + end + + for UnitTemplateID, UnitTemplateData in pairs( SpawnGroupTemplate.units ) do + self:T( UnitTemplateData.name ) + if UnitTemplateData.name == self:Name() then + self:T("Adjusting") + SpawnGroupTemplate.units[UnitTemplateID].alt = SpawnVec3.y + SpawnGroupTemplate.units[UnitTemplateID].x = SpawnVec3.x + SpawnGroupTemplate.units[UnitTemplateID].y = SpawnVec3.z + SpawnGroupTemplate.units[UnitTemplateID].heading = Heading + self:E( { UnitTemplateID, SpawnGroupTemplate.units[UnitTemplateID], SpawnGroupTemplate.units[UnitTemplateID] } ) + else + self:E( SpawnGroupTemplate.units[UnitTemplateID].name ) + local GroupUnit = UNIT:FindByName( SpawnGroupTemplate.units[UnitTemplateID].name ) -- #UNIT + if GroupUnit and GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + UnitTemplateData.alt = GroupUnitVec3.y + UnitTemplateData.x = GroupUnitVec3.x + UnitTemplateData.y = GroupUnitVec3.z + UnitTemplateData.heading = GroupUnitHeading + else + if SpawnGroupTemplate.units[UnitTemplateID].name ~= self:Name() then + self:T("nilling") + SpawnGroupTemplate.units[UnitTemplateID].delete = true + end + end + end + end + + -- Remove obscolete units from the group structure + i = 1 + while i <= #SpawnGroupTemplate.units do + + local UnitTemplateData = SpawnGroupTemplate.units[i] + self:T( UnitTemplateData.name ) + + if UnitTemplateData.delete then + table.remove( SpawnGroupTemplate.units, i ) + else + i = i + 1 + end + end + + _DATABASE:Spawn( SpawnGroupTemplate ) +end + + + +--- Returns if the unit is activated. +-- @param #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:GetDCSObject() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + + + +--- Returns the Unit's callsign - the localized string. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + self:E( self.ClassName .. " " .. self.UnitName .. " not found!" ) + return nil +end + + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param #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:GetDCSObject() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + 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 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:GetDCSObject() + + 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 Wrapper.Unit#UNIT self +-- @return Wrapper.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:GetDCSObject() + + if DCSUnit then + local UnitGroup = GROUP:Find( DCSUnit:getGroup() ) + return UnitGroup + end + + return nil +end + + +-- Need to add here functions to check if radar is on and which object etc. + +--- 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 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:GetDCSObject() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + 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 if the unit has sensors of a certain type. +-- @param #UNIT self +-- @return #boolean returns true if the unit has specified types of sensors. This function is more preferable than Unit.getSensors() if you don't want to get information about all the unit's sensors, and just want to check if the unit has specified types of sensors. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:HasSensors( ... ) + self:F2( arg ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local HasSensors = DCSUnit:hasSensors( unpack( arg ) ) + return HasSensors + end + + return nil +end + +--- Returns if the unit is SEADable. +-- @param #UNIT self +-- @return #boolean returns true if the unit is SEADable. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:HasSEAD() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitSEADAttributes = DCSUnit:getDesc().attributes + + local HasSEAD = false + if UnitSEADAttributes["RADAR_BAND1_FOR_ARM"] and UnitSEADAttributes["RADAR_BAND1_FOR_ARM"] == true or + UnitSEADAttributes["RADAR_BAND2_FOR_ARM"] and UnitSEADAttributes["RADAR_BAND2_FOR_ARM"] == true then + HasSEAD = true + end + return HasSEAD + end + + return nil +end + +--- 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 self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return Dcs.DCSWrapper.Object#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:GetDCSObject() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, 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 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:GetDCSObject() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the UNIT in a UNIT list of one element. +-- @param #UNIT self +-- @return #list The UNITs wrappers. +function UNIT:GetUnits() + self:F2( { self.UnitName } ) + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local DCSUnits = DCSUnit:getUnits() + local Units = {} + Units[1] = UNIT:Find( DCSUnit ) + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns the category name of the #UNIT. +-- @param #UNIT self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function UNIT:GetCategoryName() + self:F3( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + if DCSUnit then + local CategoryNames = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + local UnitCategory = DCSUnit:getDesc().category + self:T3( UnitCategory ) + + return CategoryNames[UnitCategory] + end + + return nil +end + + +--- Returns the Unit's A2G threat level on a scale from 1 to 10 ... +-- The following threat levels are foreseen: +-- +-- * Threat level 0: Unit is unarmed. +-- * Threat level 1: Unit is infantry. +-- * Threat level 2: Unit is an infantry vehicle. +-- * Threat level 3: Unit is ground artillery. +-- * Threat level 4: Unit is a tank. +-- * Threat level 5: Unit is a modern tank or ifv with ATGM. +-- * Threat level 6: Unit is a AAA. +-- * Threat level 7: Unit is a SAM or manpad, IR guided. +-- * Threat level 8: Unit is a Short Range SAM, radar guided. +-- * Threat level 9: Unit is a Medium Range SAM, radar guided. +-- * Threat level 10: Unit is a Long Range SAM, radar guided. +-- @param #UNIT self +function UNIT:GetThreatLevel() + + local Attributes = self:GetDesc().attributes + self:T( Attributes ) + + local ThreatLevel = 0 + local ThreatText = "" + + if self:IsGround() then + + self:T( "Ground" ) + + local ThreatLevels = { + "Unarmed", + "Infantry", + "Old Tanks & APCs", + "Tanks & IFVs without ATGM", + "Tanks & IFV with ATGM", + "Modern Tanks", + "AAA", + "IR Guided SAMs", + "SR SAMs", + "MR SAMs", + "LR SAMs" + } + + + if Attributes["LR SAM"] then ThreatLevel = 10 + elseif Attributes["MR SAM"] then ThreatLevel = 9 + elseif Attributes["SR SAM"] and + not Attributes["IR Guided SAM"] then ThreatLevel = 8 + elseif ( Attributes["SR SAM"] or Attributes["MANPADS"] ) and + Attributes["IR Guided SAM"] then ThreatLevel = 7 + elseif Attributes["AAA"] then ThreatLevel = 6 + elseif Attributes["Modern Tanks"] then ThreatLevel = 5 + elseif ( Attributes["Tanks"] or Attributes["IFV"] ) and + Attributes["ATGM"] then ThreatLevel = 4 + elseif ( Attributes["Tanks"] or Attributes["IFV"] ) and + not Attributes["ATGM"] then ThreatLevel = 3 + elseif Attributes["Old Tanks"] or Attributes["APC"] or Attributes["Artillery"] then ThreatLevel = 2 + elseif Attributes["Infantry"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + if self:IsAir() then + + self:T( "Air" ) + + local ThreatLevels = { + "Unarmed", + "Tanker", + "AWACS", + "Transport Helicpter", + "UAV", + "Bomber", + "Strategic Bomber", + "Attack Helicopter", + "Interceptor", + "Multirole Fighter", + "Fighter" + } + + + if Attributes["Fighters"] then ThreatLevel = 10 + elseif Attributes["Multirole fighters"] then ThreatLevel = 9 + elseif Attributes["Battleplanes"] then ThreatLevel = 8 + elseif Attributes["Attack helicopters"] then ThreatLevel = 7 + elseif Attributes["Strategic bombers"] then ThreatLevel = 6 + elseif Attributes["Bombers"] then ThreatLevel = 5 + elseif Attributes["UAVs"] then ThreatLevel = 4 + elseif Attributes["Transport helicopters"] then ThreatLevel = 3 + elseif Attributes["AWACS"] then ThreatLevel = 2 + elseif Attributes["Tankers"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + if self:IsShip() then + + self:T( "Ship" ) + +--["Aircraft Carriers"] = {"Heavy armed ships",}, +--["Cruisers"] = {"Heavy armed ships",}, +--["Destroyers"] = {"Heavy armed ships",}, +--["Frigates"] = {"Heavy armed ships",}, +--["Corvettes"] = {"Heavy armed ships",}, +--["Heavy armed ships"] = {"Armed ships", "Armed Air Defence", "HeavyArmoredUnits",}, +--["Light armed ships"] = {"Armed ships","NonArmoredUnits"}, +--["Armed ships"] = {"Ships"}, +--["Unarmed ships"] = {"Ships","HeavyArmoredUnits",}, + + local ThreatLevels = { + "Unarmed ship", + "Light armed ships", + "Corvettes", + "", + "Frigates", + "", + "Cruiser", + "", + "Destroyer", + "", + "Aircraft Carrier" + } + + + if Attributes["Aircraft Carriers"] then ThreatLevel = 10 + elseif Attributes["Destroyers"] then ThreatLevel = 8 + elseif Attributes["Cruisers"] then ThreatLevel = 6 + elseif Attributes["Frigates"] then ThreatLevel = 4 + elseif Attributes["Corvettes"] then ThreatLevel = 2 + elseif Attributes["Light armed ships"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + self:T2( ThreatLevel ) + return ThreatLevel, ThreatText + +end + + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Core.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 } ) + + if self:IsAlive() then + local IsInZone = Zone:IsVec3InZone( self:GetVec3() ) + + self:T( { IsInZone } ) + return IsInZone + end + + return false +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Core.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 } ) + + if self:IsAlive() then + local IsInZone = not Zone:IsVec3InZone( self:GetVec3() ) + + self:T( { IsInZone } ) + return IsInZone + else + return false + end +end + + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param #UNIT self +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitVec3 = self:GetVec3() + local AwaitUnitVec3 = AwaitUnit:GetVec3() + + if (((UnitVec3.x - AwaitUnitVec3.x)^2 + (UnitVec3.z - AwaitUnitVec3.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + + + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +-- @param Utilities.Utils#FLARECOLOR FlareColor +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetVec3(), 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:GetVec3(), 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:GetVec3(), 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:GetVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + local Vec3 = self:GetVec3() + if Vec3 then + trigger.action.signalFlare( Vec3, trigger.flareColor.Red, 0 ) + end +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor, Range ) + self:F2() + if Range then + trigger.action.smoke( self:GetRandomVec3( Range ), SmokeColor ) + else + trigger.action.smoke( self:GetVec3(), SmokeColor ) + end + +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetVec3(), 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 DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = 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 + + return nil +end + +--- Returns if the unit is of an ground category. +-- If the unit is a ground vehicle or infantry, this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Ground category evaluation result. +function UNIT:IsGround() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.GROUND_UNIT } ) + + local IsGroundResult = ( UnitDescriptor.category == Unit.Category.GROUND_UNIT ) + + self:T3( IsGroundResult ) + return IsGroundResult + end + + return nil +end + +--- Returns if the unit is a friendly unit. +-- @param #UNIT self +-- @return #boolean IsFriendly evaluation result. +function UNIT:IsFriendly( FriendlyCoalition ) + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( { UnitCoalition, FriendlyCoalition } ) + + local IsFriendlyResult = ( UnitCoalition == FriendlyCoalition ) + + self:E( IsFriendlyResult ) + return IsFriendlyResult + end + + return nil +end + +--- Returns if the unit is of a ship category. +-- If the unit is a ship, this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Ship category evaluation result. +function UNIT:IsShip() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.SHIP } ) + + local IsShipResult = ( UnitDescriptor.category == Unit.Category.SHIP ) + + self:T3( IsShipResult ) + return IsShipResult + end + + return nil +end + +--- Returns true if the UNIT is in the air. +-- @param Wrapper.Positionable#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The UNIT is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +do -- Event Handling + + --- Subscribe to a DCS Event. + -- @param #UNIT self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the unit. + -- @return #UNIT + function UNIT:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventForUnit( self:GetName(), EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #UNIT self + -- @param Core.Event#EVENTS Event + -- @return #UNIT + function UNIT:UnHandleEvent( Event ) + + self:EventDispatcher():RemoveForUnit( self:GetName(), self, Event ) + + return self + end + +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 + +--- The CLIENT class +-- @type CLIENT +-- @extends Wrapper.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, Error ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + if not Error then + error( "CLIENT not found for: " .. ClientName ) + end +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. +-- @param #boolean Error A flag that indicates whether an error should be raised if the CLIENT cannot be found. By default an error will be raised. +-- @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, Error ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + if not Error then + error( "CLIENT not found for: " .. ClientName ) + end +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, { "Client Alive " .. ClientName }, 1, 5 ) + + self:E( self ) + 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, "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, "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 CallBackFunction Create a function that will be called when a player joins the slot. +-- @return #CLIENT +function CLIENT:Alive( CallBackFunction, ... ) + self:F() + + self.ClientCallBack = CallBackFunction + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler( SchedulerName ) + self:F3( { SchedulerName, self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) + + if self:IsAlive() then + 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 Dcs.DCSWrapper.Group#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 Dcs.DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return Dcs.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 Wrapper.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 Dcs.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 @{AI_Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{AI_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, "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 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. +-- @param #string MessageID is the identifier of the message when displayed with intervals. +function CLIENT:Message( Message, MessageDuration, MessageCategory, MessageInterval, MessageID ) + self:F( { Message, MessageDuration, MessageCategory, MessageInterval } ) + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if MessageID ~= nil then + 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, MessageDuration, MessageCategory ):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, MessageDuration , MessageCategory):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, MessageDuration, MessageCategory ):ToClient( self ) + self.Messages[MessageID].MessageTime = timer.getTime() + end + end + end + else + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + end + end +end +--- This module contains the STATIC class. +-- +-- 1) @{Static#STATIC} class, extends @{Positionable#POSITIONABLE} +-- =============================================================== +-- 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 + + + + + + +--- The STATIC class +-- @type STATIC +-- @extends Wrapper.Positionable#POSITIONABLE +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. +-- @param #boolean RaiseError Raise an error if not found. +-- @return #STATIC +function STATIC:FindByName( StaticName, RaiseError ) + local StaticFound = _DATABASE:FindStatic( StaticName ) + + self.StaticName = StaticName + + if StaticFound then + StaticFound:F3( { StaticName } ) + + return StaticFound + end + + if RaiseError == nil or RaiseError == true then + error( "STATIC not found for: " .. StaticName ) + end + + return nil +end + +function STATIC:Register( StaticName ) + local self = BASE:Inherit( self, POSITIONABLE:New( StaticName ) ) + self.StaticName = StaticName + return self +end + + +function STATIC:GetDCSObject() + local DCSStatic = StaticObject.getByName( self.StaticName ) + + if DCSStatic then + return DCSStatic + end + + return nil +end + +function STATIC:GetThreatLevel() + + return 1, "Static" +end--- This module contains the AIRBASE classes. +-- +-- === +-- +-- 1) @{Airbase#AIRBASE} class, extends @{Positionable#POSITIONABLE} +-- ================================================================= +-- The @{AIRBASE} class is a wrapper class to handle the DCS Airbase objects: +-- +-- * Support all DCS Airbase APIs. +-- * Enhance with Airbase specific APIs not in the DCS Airbase API set. +-- +-- +-- 1.1) AIRBASE reference methods +-- ------------------------------ +-- For each DCS Airbase object alive within a running mission, a AIRBASE wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The AIRBASE class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Airbase or the DCS AirbaseName. +-- +-- Another thing to know is that AIRBASE objects do not "contain" the DCS Airbase object. +-- The AIRBASE methods will reference the DCS Airbase object by name when it is needed during API execution. +-- If the DCS Airbase object does not exist or is nil, the AIRBASE methods will return nil and log an exception in the DCS.log file. +-- +-- The AIRBASE class provides the following functions to retrieve quickly the relevant AIRBASE instance: +-- +-- * @{#AIRBASE.Find}(): Find a AIRBASE instance from the _DATABASE object using a DCS Airbase object. +-- * @{#AIRBASE.FindByName}(): Find a AIRBASE instance from the _DATABASE object using a DCS Airbase name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these AIRBASE OBJECT REFERENCES! (make the AIRBASE object references nil). +-- +-- 1.2) DCS AIRBASE APIs +-- --------------------- +-- The DCS Airbase APIs are used extensively within MOOSE. The AIRBASE class has for each DCS Airbase API a corresponding method. +-- To be able to distinguish easily in your code the difference between a AIRBASE API call and a DCS Airbase API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Airbase method @{DCSWrapper.Airbase#Airbase.getName}() +-- is implemented in the AIRBASE class as @{#AIRBASE.GetName}(). +-- +-- More functions will be added +-- ---------------------------- +-- During the MOOSE development, more functions will be added. +-- +-- @module Airbase +-- @author FlightControl + + + + + +--- The AIRBASE class +-- @type AIRBASE +-- @extends Wrapper.Positionable#POSITIONABLE +AIRBASE = { + ClassName="AIRBASE", + CategoryName = { + [Airbase.Category.AIRDROME] = "Airdrome", + [Airbase.Category.HELIPAD] = "Helipad", + [Airbase.Category.SHIP] = "Ship", + }, + } + +-- Registration. + +--- Create a new AIRBASE from DCSAirbase. +-- @param #AIRBASE self +-- @param #string AirbaseName The name of the airbase. +-- @return Wrapper.Airbase#AIRBASE +function AIRBASE:Register( AirbaseName ) + + local self = BASE:Inherit( self, POSITIONABLE:New( AirbaseName ) ) + self.AirbaseName = AirbaseName + return self +end + +-- Reference methods. + +--- Finds a AIRBASE from the _DATABASE using a DCSAirbase object. +-- @param #AIRBASE self +-- @param Dcs.DCSWrapper.Airbase#Airbase DCSAirbase An existing DCS Airbase object reference. +-- @return Wrapper.Airbase#AIRBASE self +function AIRBASE:Find( DCSAirbase ) + + local AirbaseName = DCSAirbase:getName() + local AirbaseFound = _DATABASE:FindAirbase( AirbaseName ) + return AirbaseFound +end + +--- Find a AIRBASE in the _DATABASE using the name of an existing DCS Airbase. +-- @param #AIRBASE self +-- @param #string AirbaseName The Airbase Name. +-- @return Wrapper.Airbase#AIRBASE self +function AIRBASE:FindByName( AirbaseName ) + + local AirbaseFound = _DATABASE:FindAirbase( AirbaseName ) + return AirbaseFound +end + +function AIRBASE:GetDCSObject() + local DCSAirbase = Airbase.getByName( self.AirbaseName ) + + if DCSAirbase then + return DCSAirbase + end + + return nil +end + + + +--- This module contains the SCENERY class. +-- +-- 1) @{Scenery#SCENERY} class, extends @{Positionable#POSITIONABLE} +-- =============================================================== +-- Scenery objects are defined on the map. +-- The @{Scenery#SCENERY} class is a wrapper class to handle the DCS Scenery objects: +-- +-- * Wraps the DCS Scenery objects. +-- * Support all DCS Scenery APIs. +-- * Enhance with Scenery specific APIs not in the DCS API set. +-- +-- @module Scenery +-- @author FlightControl + + + +--- The SCENERY class +-- @type SCENERY +-- @extends Wrapper.Positionable#POSITIONABLE +SCENERY = { + ClassName = "SCENERY", +} + + +function SCENERY:Register( SceneryName, SceneryObject ) + local self = BASE:Inherit( self, POSITIONABLE:New( SceneryName ) ) + self.SceneryName = SceneryName + self.SceneryObject = SceneryObject + return self +end + +function SCENERY:GetDCSObject() + return self.SceneryObject +end + +function SCENERY:GetThreatLevel() + + return 0, "Scenery" +end +--- Single-Player:**Yes** / Multi-Player:**Yes** / Core:**Yes** -- **Administer the scoring of player achievements, +-- and create a CSV file logging the scoring events for use at team or squadron websites.** +-- +-- ![Banner Image](..\Presentations\SCORING\Dia1.JPG) +-- +-- === +-- +-- The @{#SCORING} class administers the scoring of player achievements, +-- and creates a CSV file logging the scoring events and results for use at team or squadron websites. +-- +-- SCORING automatically calculates the threat level of the objects hit and destroyed by players, +-- which can be @{Unit}, @{Static) and @{Scenery} objects. +-- +-- Positive score points are granted when enemy or neutral targets are destroyed. +-- Negative score points or penalties are given when a friendly target is hit or destroyed. +-- This brings a lot of dynamism in the scoring, where players need to take care to inflict damage on the right target. +-- By default, penalties weight heavier in the scoring, to ensure that players don't commit fratricide. +-- The total score of the player is calculated by **adding the scores minus the penalties**. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia4.JPG) +-- +-- The score value is calculated based on the **threat level of the player** and the **threat level of the target**. +-- A calculated score takes the threat level of the target divided by a balanced threat level of the player unit. +-- As such, if the threat level of the target is high, and the player threat level is low, a higher score will be given than +-- if the threat level of the player would be high too. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia5.JPG) +-- +-- When multiple players hit the same target, and finally succeed in destroying the target, then each player who contributed to the target +-- destruction, will receive a score. This is important for targets that require significant damage before it can be destroyed, like +-- ships or heavy planes. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia13.JPG) +-- +-- Optionally, the score values can be **scaled** by a **scale**. Specific scales can be set for positive cores or negative penalties. +-- The default range of the scores granted is a value between 0 and 10. The default range of penalties given is a value between 0 and 30. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia7.JPG) +-- +-- **Additional scores** can be granted to **specific objects**, when the player(s) destroy these objects. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia9.JPG) +-- +-- Various @{Zone}s can be defined for which scores are also granted when objects in that @{Zone} are destroyed. +-- This is **specifically useful** to designate **scenery targets on the map** that will generate points when destroyed. +-- +-- With a small change in MissionScripting.lua, the scoring results can also be logged in a **CSV file**. +-- These CSV files can be used to: +-- +-- * Upload scoring to a database or a BI tool to publish the scoring results to the player community. +-- * Upload scoring in an (online) Excel like tool, using pivot tables and pivot charts to show mission results. +-- * Share scoring amoung players after the mission to discuss mission results. +-- +-- Scores can be **reported**. **Menu options** are automatically added to **each player group** when a player joins a client slot or a CA unit. +-- Use the radio menu F10 to consult the scores while running the mission. +-- Scores can be reported for your user, or an overall score can be reported of all players currently active in the mission. +-- +-- # 1) @{Scoring#SCORING} class, extends @{Base#BASE} +-- +-- ## 1.1) Set the destroy score or penalty scale +-- +-- Score scales can be set for scores granted when enemies or friendlies are destroyed. +-- Use the method @{#SCORING.SetScaleDestroyScore}() to set the scale of enemy destroys (positive destroys). +-- Use the method @{#SCORING.SetScaleDestroyPenalty}() to set the scale of friendly destroys (negative destroys). +-- +-- local Scoring = SCORING:New( "Scoring File" ) +-- Scoring:SetScaleDestroyScore( 10 ) +-- Scoring:SetScaleDestroyPenalty( 40 ) +-- +-- The above sets the scale for valid scores to 10. So scores will be given in a scale from 0 to 10. +-- The penalties will be given in a scale from 0 to 40. +-- +-- ## 1.2) Define special targets that will give extra scores. +-- +-- Special targets can be set that will give extra scores to the players when these are destroyed. +-- Use the methods @{#SCORING.AddUnitScore}() and @{#SCORING.RemoveUnitScore}() to specify a special additional score for a specific @{Unit}s. +-- Use the methods @{#SCORING.AddStaticScore}() and @{#SCORING.RemoveStaticScore}() to specify a special additional score for a specific @{Static}s. +-- Use the method @{#SCORING.SetGroupGroup}() to specify a special additional score for a specific @{Group}s. +-- +-- local Scoring = SCORING:New( "Scoring File" ) +-- Scoring:AddUnitScore( UNIT:FindByName( "Unit #001" ), 200 ) +-- Scoring:AddStaticScore( STATIC:FindByName( "Static #1" ), 100 ) +-- +-- The above grants an additional score of 200 points for Unit #001 and an additional 100 points of Static #1 if these are destroyed. +-- Note that later in the mission, one can remove these scores set, for example, when the a goal achievement time limit is over. +-- For example, this can be done as follows: +-- +-- Scoring:RemoveUnitScore( UNIT:FindByName( "Unit #001" ) ) +-- +-- ## 1.3) Define destruction zones that will give extra scores. +-- +-- Define zones of destruction. Any object destroyed within the zone of the given category will give extra points. +-- Use the method @{#SCORING.AddZoneScore}() to add a @{Zone} for additional scoring. +-- Use the method @{#SCORING.RemoveZoneScore}() to remove a @{Zone} for additional scoring. +-- There are interesting variations that can be achieved with this functionality. For example, if the @{Zone} is a @{Zone#ZONE_UNIT}, +-- then the zone is a moving zone, and anything destroyed within that @{Zone} will generate points. +-- The other implementation could be to designate a scenery target (a building) in the mission editor surrounded by a @{Zone}, +-- just large enough around that building. +-- +-- ## 1.4) Add extra Goal scores upon an event or a condition. +-- +-- A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens. +-- Use the method @{#SCORING.AddGoalScore}() to add a score for a Player at any time in your mission. +-- +-- ## 1.5) Configure fratricide level. +-- +-- When a player commits too much damage to friendlies, his penalty score will reach a certain level. +-- Use the method @{#SCORING.SetFratricide}() to define the level when a player gets kicked. +-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score. +-- +-- ## 1.6) Penalty score when a player changes the coalition. +-- +-- When a player changes the coalition, he can receive a penalty score. +-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition. +-- By default, the penalty for changing coalition is the default penalty scale. +-- +-- ## 1.8) Define output CSV files. +-- +-- The CSV file is given the name of the string given in the @{#SCORING.New}{} constructor, followed by the .csv extension. +-- The file is incrementally saved in the **\\Saved Games\\DCS\\Logs** folder, and has a time stamp indicating each mission run. +-- See the following example: +-- +-- local ScoringFirstMission = SCORING:New( "FirstMission" ) +-- local ScoringSecondMission = SCORING:New( "SecondMission" ) +-- +-- The above documents that 2 Scoring objects are created, ScoringFirstMission and ScoringSecondMission. +-- +-- ## 1.9) Configure messages. +-- +-- When players hit or destroy targets, messages are sent. +-- Various methods exist to configure: +-- +-- * Which messages are sent upon the event. +-- * Which audience receives the message. +-- +-- ### 1.9.1) Configure the messages sent upon the event. +-- +-- Use the following methods to configure when to send messages. By default, all messages are sent. +-- +-- * @{#SCORING.SetMessagesHit}(): Configure to send messages after a target has been hit. +-- * @{#SCORING.SetMessagesDestroy}(): Configure to send messages after a target has been destroyed. +-- * @{#SCORING.SetMessagesAddon}(): Configure to send messages for additional score, after a target has been destroyed. +-- * @{#SCORING.SetMessagesZone}(): Configure to send messages for additional score, after a target has been destroyed within a given zone. +-- +-- ### 1.9.2) Configure the audience of the messages. +-- +-- Use the following methods to configure the audience of the messages. By default, the messages are sent to all players in the mission. +-- +-- * @{#SCORING.SetMessagesToAll}(): Configure to send messages to all players. +-- * @{#SCORING.SetMessagesToCoalition}(): Configure to send messages to only those players within the same coalition as the player. +-- +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-02-26: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **Wingthor (TAW)**: Testing & Advice. +-- * **Dutch-Baron (TAW)**: Testing & Advice. +-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing and Advice. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Scoring + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Core.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() ) -- #SCORING + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + -- Additional Object scores + self.ScoringObjects = {} + + -- Additional Zone scores. + self.ScoringZones = {} + + -- Configure Messages + self:SetMessagesToAll() + self:SetMessagesHit( true ) + self:SetMessagesDestroy( true ) + self:SetMessagesScore( true ) + self:SetMessagesZone( true ) + + -- Scales + self:SetScaleDestroyScore( 10 ) + self:SetScaleDestroyPenalty( 30 ) + + -- Default fratricide penalty level (maximum penalty that can be assigned to a player before he gets kicked). + self:SetFratricide( self.ScaleDestroyPenalty * 3 ) + + -- Default penalty when a player changes coalition. + self:SetCoalitionChangePenalty( self.ScaleDestroyPenalty ) + + -- Event handlers + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Hit, self._EventOnHit ) + self:HandleEvent( EVENTS.PlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit ) + + -- Create the CSV file. + self:OpenCSV( GameName ) + + return self + +end + +--- Set the scale for scoring valid destroys (enemy destroys). +-- A default calculated score is a value between 1 and 10. +-- The scale magnifies the scores given to the players. +-- @param #SCORING self +-- @param #number Scale The scale of the score given. +function SCORING:SetScaleDestroyScore( Scale ) + + self.ScaleDestroyScore = Scale + + return self +end + +--- Set the scale for scoring penalty destroys (friendly destroys). +-- A default calculated penalty is a value between 1 and 10. +-- The scale magnifies the scores given to the players. +-- @param #SCORING self +-- @param #number Scale The scale of the score given. +-- @return #SCORING +function SCORING:SetScaleDestroyPenalty( Scale ) + + self.ScaleDestroyPenalty = Scale + + return self +end + +--- Add a @{Unit} for additional scoring when the @{Unit} is destroyed. +-- Note that if there was already a @{Unit} declared within the scoring with the same name, +-- then the old @{Unit} will be replaced with the new @{Unit}. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score needs to be given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddUnitScore( ScoreUnit, Score ) + + local UnitName = ScoreUnit:GetName() + + self.ScoringObjects[UnitName] = Score + + return self +end + +--- Removes a @{Unit} for additional scoring when the @{Unit} is destroyed. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score needs to be given. +-- @return #SCORING +function SCORING:RemoveUnitScore( ScoreUnit ) + + local UnitName = ScoreUnit:GetName() + + self.ScoringObjects[UnitName] = nil + + return self +end + +--- Add a @{Static} for additional scoring when the @{Static} is destroyed. +-- Note that if there was already a @{Static} declared within the scoring with the same name, +-- then the old @{Static} will be replaced with the new @{Static}. +-- @param #SCORING self +-- @param Wrapper.Static#UNIT ScoreStatic The @{Static} for which the Score needs to be given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddStaticScore( ScoreStatic, Score ) + + local StaticName = ScoreStatic:GetName() + + self.ScoringObjects[StaticName] = Score + + return self +end + +--- Removes a @{Static} for additional scoring when the @{Static} is destroyed. +-- @param #SCORING self +-- @param Wrapper.Static#UNIT ScoreStatic The @{Static} for which the Score needs to be given. +-- @return #SCORING +function SCORING:RemoveStaticScore( ScoreStatic ) + + local StaticName = ScoreStatic:GetName() + + self.ScoringObjects[StaticName] = nil + + return self +end + + +--- Specify a special additional score for a @{Group}. +-- @param #SCORING self +-- @param Wrapper.Group#GROUP ScoreGroup The @{Group} for which each @{Unit} a Score is given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddScoreGroup( ScoreGroup, Score ) + + local ScoreUnits = ScoreGroup:GetUnits() + + for ScoreUnitID, ScoreUnit in pairs( ScoreUnits ) do + local UnitName = ScoreUnit:GetName() + self.ScoringObjects[UnitName] = Score + end + + return self +end + +--- Add a @{Zone} to define additional scoring when any object is destroyed in that zone. +-- Note that if a @{Zone} with the same name is already within the scoring added, the @{Zone} (type) and Score will be replaced! +-- This allows for a dynamic destruction zone evolution within your mission. +-- @param #SCORING self +-- @param Core.Zone#ZONE_BASE ScoreZone The @{Zone} which defines the destruction score perimeters. +-- Note that a zone can be a polygon or a moving zone. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddZoneScore( ScoreZone, Score ) + + local ZoneName = ScoreZone:GetName() + + self.ScoringZones[ZoneName] = {} + self.ScoringZones[ZoneName].ScoreZone = ScoreZone + self.ScoringZones[ZoneName].Score = Score + + return self +end + +--- Remove a @{Zone} for additional scoring. +-- The scoring will search if any @{Zone} is added with the given name, and will remove that zone from the scoring. +-- This allows for a dynamic destruction zone evolution within your mission. +-- @param #SCORING self +-- @param Core.Zone#ZONE_BASE ScoreZone The @{Zone} which defines the destruction score perimeters. +-- Note that a zone can be a polygon or a moving zone. +-- @return #SCORING +function SCORING:RemoveZoneScore( ScoreZone ) + + local ZoneName = ScoreZone:GetName() + + self.ScoringZones[ZoneName] = nil + + return self +end + + +--- Configure to send messages after a target has been hit. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesHit( OnOff ) + + self.MessagesHit = OnOff + return self +end + +--- If to send messages after a target has been hit. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesHit() + + return self.MessagesHit +end + +--- Configure to send messages after a target has been destroyed. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesDestroy( OnOff ) + + self.MessagesDestroy = OnOff + return self +end + +--- If to send messages after a target has been destroyed. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesDestroy() + + return self.MessagesDestroy +end + +--- Configure to send messages after a target has been destroyed and receives additional scores. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesScore( OnOff ) + + self.MessagesScore = OnOff + return self +end + +--- If to send messages after a target has been destroyed and receives additional scores. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesScore() + + return self.MessagesScore +end + +--- Configure to send messages after a target has been hit in a zone, and additional score is received. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesZone( OnOff ) + + self.MessagesZone = OnOff + return self +end + +--- If to send messages after a target has been hit in a zone, and additional score is received. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesZone() + + return self.MessagesZone +end + +--- Configure to send messages to all players. +-- @param #SCORING self +-- @return #SCORING +function SCORING:SetMessagesToAll() + + self.MessagesAudience = 1 + return self +end + +--- If to send messages to all players. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesToAll() + + return self.MessagesAudience == 1 +end + +--- Configure to send messages to only those players within the same coalition as the player. +-- @param #SCORING self +-- @return #SCORING +function SCORING:SetMessagesToCoalition() + + self.MessagesAudience = 2 + return self +end + +--- If to send messages to only those players within the same coalition as the player. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesToCoalition() + + return self.MessagesAudience == 2 +end + + +--- When a player commits too much damage to friendlies, his penalty score will reach a certain level. +-- Use this method to define the level when a player gets kicked. +-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score. +-- @param #SCORING self +-- @param #number Fratricide The amount of maximum penalty that may be inflicted by a friendly player before he gets kicked. +-- @return #SCORING +function SCORING:SetFratricide( Fratricide ) + + self.Fratricide = Fratricide + return self +end + + +--- When a player changes the coalition, he can receive a penalty score. +-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition. +-- By default, the penalty for changing coalition is the default penalty scale. +-- @param #SCORING self +-- @param #number CoalitionChangePenalty The amount of penalty that is given. +-- @return #SCORING +function SCORING:SetCoalitionChangePenalty( CoalitionChangePenalty ) + + self.CoalitionChangePenalty = CoalitionChangePenalty + return self +end + + +--- Add a new player entering a Unit. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT UnitData +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData:IsAlive() 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() + local UnitThreatLevel, UnitThreatType = UnitData:GetThreatLevel() + + 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].Destroy = {} + self.Players[PlayerName].Goals = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Destroy[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + 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 + ):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 + self.Players[PlayerName].UNIT = UnitData + self.Players[PlayerName].ThreatLevel = UnitThreatLevel + self.Players[PlayerName].ThreatType = UnitThreatType + + if self.Players[PlayerName].Penalty > self.Fratricide * 0.50 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 " .. self.Fratricide .. ", you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + 30 + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > self.Fratricide then + UnitData:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + 10 + ):ToAll() + end + + end +end + + +--- Add a goal score for a player. +-- The method takes the PlayerUnit for which the Goal score needs to be set. +-- The GoalTag is a string or identifier that is taken into the CSV file scoring log to identify the goal. +-- A free text can be given that is shown to the players. +-- The Score can be both positive and negative. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT PlayerUnit The @{Unit} of the Player. Other Properties for the scoring are taken from this PlayerUnit, like coalition, type etc. +-- @param #string GoalTag The string or identifier that is used in the CSV file to identify the goal (sort or group later in Excel). +-- @param #string Text A free text that is shown to the players. +-- @param #number Score The score can be both positive or negative ( Penalty ). +function SCORING:AddGoalScore( PlayerUnit, GoalTag, Text, Score ) + + local PlayerName = PlayerUnit:GetPlayerName() + + self:E( { PlayerUnit.UnitName, PlayerName, GoalTag, Text, Score } ) + + -- PlayerName can be nil, if the Unit with the player crashed or due to another reason. + if PlayerName then + local PlayerData = self.Players[PlayerName] + + PlayerData.Goals[GoalTag] = PlayerData.Goals[GoalTag] or { Score = 0 } + PlayerData.Goals[GoalTag].Score = PlayerData.Goals[GoalTag].Score + Score + PlayerData.Score = PlayerData.Score + Score + + MESSAGE:New( Text, 30 ):ToAll() + + self:ScoreCSV( PlayerName, "", "GOAL_" .. string.upper( GoalTag ), 1, Score, PlayerUnit:GetName() ) + end +end + + +--- Registers Scores the players completing a Mission Task. +-- @param #SCORING self +-- @param Tasking.Mission#MISSION Mission +-- @param Wrapper.Unit#UNIT PlayerUnit +-- @param #string Text +-- @param #number Score +function SCORING:_AddMissionTaskScore( Mission, PlayerUnit, Text, Score ) + + local PlayerName = PlayerUnit:GetPlayerName() + local MissionName = Mission:GetName() + + self:E( { Mission:GetName(), PlayerUnit.UnitName, PlayerName, Text, Score } ) + + -- PlayerName can be nil, if the Unit with the player crashed or due to another reason. + if PlayerName then + local PlayerData = self.Players[PlayerName] + + if not PlayerData.Mission[MissionName] then + PlayerData.Mission[MissionName] = {} + PlayerData.Mission[MissionName].ScoreTask = 0 + PlayerData.Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( PlayerData.Mission[MissionName] ) + + PlayerData.Score = self.Players[PlayerName].Score + Score + PlayerData.Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has " .. Text .. " in Mission '" .. MissionName .. "'. " .. + Score .. " task score!", + 30 ):ToAll() + + self:ScoreCSV( PlayerName, "", "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:GetName() ) + end +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +-- @param #SCORING self +-- @param Tasking.Mission#MISSION Mission +-- @param Wrapper.Unit#UNIT PlayerUnit +-- @param #string Text +-- @param #number Score +function SCORING:_AddMissionScore( Mission, Text, Score ) + + local MissionName = Mission:GetName() + + self:E( { Mission, Text, Score } ) + self:E( self.Players ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + self:E( PlayerData ) + if PlayerData.Mission[MissionName] then + + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has " .. Text .. " in Mission '" .. MissionName .. "'. " .. + Score .. " mission score!", + 60 ):ToAll() + + self:ScoreCSV( PlayerName, "", "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + + +--- Handles the OnPlayerEnterUnit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:OnEventPlayerEnterUnit( Event ) + if Event.IniUnit then + self:_AddPlayerFromUnit( Event.IniUnit ) + local Menu = MENU_GROUP:New( Event.IniGroup, 'Scoring' ) + local ReportGroupSummary = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Summary report players in group', Menu, SCORING.ReportScoreGroupSummary, self, Event.IniGroup ) + local ReportGroupDetailed = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Detailed report players in group', Menu, SCORING.ReportScoreGroupDetailed, self, Event.IniGroup ) + local ReportToAllSummary = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Summary report all players', Menu, SCORING.ReportScoreAllSummary, self, Event.IniGroup ) + self:SetState( Event.IniUnit, "ScoringMenu", Menu ) + end +end + +--- Handles the OnPlayerLeaveUnit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:OnEventPlayerLeaveUnit( Event ) + if Event.IniUnit then + local Menu = self:GetState( Event.IniUnit, "ScoringMenu" ) -- Core.Menu#MENU_GROUP + if Menu then + Menu:Remove() + end + end +end + + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + 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 TargetUNIT = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = nil + + 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 + InitUNIT = Event.IniUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = Event.IniPlayerName + + InitCoalition = Event.IniCoalition + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + --InitCategory = InitUnit:getDesc().category + InitCategory = Event.IniCategory + InitType = Event.IniTypeName + + 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 + TargetUNIT = Event.TgtUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = Event.TgtPlayerName + + TargetCoalition = Event.TgtCoalition + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + --TargetCategory = TargetUnit:getDesc().category + TargetCategory = Event.TgtCategory + TargetType = Event.TgtTypeName + + 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 ) + end + + self:T( "Hitting Something" ) + + -- What is he hitting? + if TargetCategory then + + -- A target got hit, score it. + -- Player contains the score data from self.Players[InitPlayerName] + local Player = self.Players[InitPlayerName] + + -- Ensure there is a hit table per TargetCategory and TargetUnitName. + Player.Hit[TargetCategory] = Player.Hit[TargetCategory] or {} + Player.Hit[TargetCategory][TargetUnitName] = Player.Hit[TargetCategory][TargetUnitName] or {} + + -- PlayerHit contains the score counters and data per unit that was hit. + local PlayerHit = Player.Hit[TargetCategory][TargetUnitName] + + PlayerHit.Score = PlayerHit.Score or 0 + PlayerHit.Penalty = PlayerHit.Penalty or 0 + PlayerHit.ScoreHit = PlayerHit.ScoreHit or 0 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit or 0 + PlayerHit.TimeStamp = PlayerHit.TimeStamp or 0 + PlayerHit.UNIT = PlayerHit.UNIT or TargetUNIT + PlayerHit.ThreatLevel, PlayerHit.ThreatType = PlayerHit.UNIT:GetThreatLevel() + + -- Only grant hit scores if there was more than one second between the last hit. + if timer.getTime() - PlayerHit.TimeStamp > 1 then + PlayerHit.TimeStamp = timer.getTime() + + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + + -- Ensure there is a Player to Player hit reference table. + Player.HitPlayers[TargetPlayerName] = true + end + + local Score = 0 + + if InitCoalition then -- A coalition object was hit. + if InitCoalition == TargetCoalition then + Player.Penalty = Player.Penalty + 10 + PlayerHit.Penalty = PlayerHit.Penalty + 10 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit + 1 + + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit friendly player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit a friendly target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + end + self:ScoreCSV( InitPlayerName, TargetPlayerName, "HIT_PENALTY", 1, -10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + Player.Score = Player.Score + 1 + PlayerHit.Score = PlayerHit.Score + 1 + PlayerHit.ScoreHit = PlayerHit.ScoreHit + 1 + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit enemy player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit an enemy target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + end + self:ScoreCSV( InitPlayerName, TargetPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + else -- A scenery object was hit. + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit a scenery object.", + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( InitPlayerName, "", "HIT_SCORE", 1, 0, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end + + -- It is a weapon initiated by a player, that is hitting something + -- This seems to occur only with scenery and static objects. + if Event.WeaponPlayerName ~= nil then + self:_AddPlayerFromUnit( Event.WeaponUNIT ) + if self.Players[Event.WeaponPlayerName] 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 ) + end + + self:T( "Hitting Scenery" ) + + -- What is he hitting? + if TargetCategory then + + -- A scenery or static got hit, score it. + -- Player contains the score data from self.Players[WeaponPlayerName] + local Player = self.Players[Event.WeaponPlayerName] + + -- Ensure there is a hit table per TargetCategory and TargetUnitName. + Player.Hit[TargetCategory] = Player.Hit[TargetCategory] or {} + Player.Hit[TargetCategory][TargetUnitName] = Player.Hit[TargetCategory][TargetUnitName] or {} + + -- PlayerHit contains the score counters and data per unit that was hit. + local PlayerHit = Player.Hit[TargetCategory][TargetUnitName] + + PlayerHit.Score = PlayerHit.Score or 0 + PlayerHit.Penalty = PlayerHit.Penalty or 0 + PlayerHit.ScoreHit = PlayerHit.ScoreHit or 0 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit or 0 + PlayerHit.TimeStamp = PlayerHit.TimeStamp or 0 + PlayerHit.UNIT = PlayerHit.UNIT or TargetUNIT + PlayerHit.ThreatLevel, PlayerHit.ThreatType = PlayerHit.UNIT:GetThreatLevel() + + -- Only grant hit scores if there was more than one second between the last hit. + if timer.getTime() - PlayerHit.TimeStamp > 1 then + PlayerHit.TimeStamp = timer.getTime() + + local Score = 0 + + if InitCoalition then -- A coalition object was hit, probably a static. + if InitCoalition == TargetCoalition then + -- TODO: Penalty according scale + Player.Penalty = Player.Penalty + 10 + PlayerHit.Penalty = PlayerHit.Penalty + 10 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit + 1 + + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit a friendly target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( Event.WeaponCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, TargetPlayerName, "HIT_PENALTY", 1, -10, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + Player.Score = Player.Score + 1 + PlayerHit.Score = PlayerHit.Score + 1 + PlayerHit.ScoreHit = PlayerHit.ScoreHit + 1 + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit an enemy target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( Event.WeaponCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, TargetPlayerName, "HIT_SCORE", 1, 1, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + else -- A scenery object was hit. + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit a scenery object.", + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, "", "HIT_SCORE", 1, 0, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + end + end +end + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Core.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.IniUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = Event.IniPlayerName + + TargetCoalition = Event.IniCoalition + --TargetCategory = TargetUnit:getCategory() + --TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetCategory = Event.IniCategory + TargetType = Event.IniTypeName + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + -- Player contains the score and reference data for the player. + for PlayerName, Player in pairs( self.Players ) do + if Player then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got destroyed" ) + + -- Some variables + local InitUnitName = Player.UnitName + local InitUnitType = Player.UnitType + local InitCoalition = Player.UnitCoalition + local InitCategory = Player.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + local Destroyed = false + + -- What is the player destroying? + if Player and Player.Hit and Player.Hit[TargetCategory] and Player.Hit[TargetCategory][TargetUnitName] and Player.Hit[TargetCategory][TargetUnitName].TimeStamp ~= 0 then -- Was there a hit for this unit for this player before registered??? + + local TargetThreatLevel = Player.Hit[TargetCategory][TargetUnitName].ThreatLevel + local TargetThreatType = Player.Hit[TargetCategory][TargetUnitName].ThreatType + + Player.Destroy[TargetCategory] = Player.Destroy[TargetCategory] or {} + Player.Destroy[TargetCategory][TargetType] = Player.Destroy[TargetCategory][TargetType] or {} + + -- PlayerDestroy contains the destroy score data per category and target type of the player. + local TargetDestroy = Player.Destroy[TargetCategory][TargetType] + TargetDestroy.Score = TargetDestroy.Score or 0 + TargetDestroy.ScoreDestroy = TargetDestroy.ScoreDestroy or 0 + TargetDestroy.Penalty = TargetDestroy.Penalty or 0 + TargetDestroy.PenaltyDestroy = TargetDestroy.PenaltyDestroy or 0 + + if TargetCoalition then + if InitCoalition == TargetCoalition then + local ThreatLevelTarget = TargetThreatLevel + local ThreatTypeTarget = TargetThreatType + local ThreatLevelPlayer = Player.ThreatLevel / 10 + 1 + local ThreatPenalty = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.ScaleDestroyPenalty / 10 ) + self:E( { ThreatLevel = ThreatPenalty, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } ) + + Player.Penalty = Player.Penalty + ThreatPenalty + TargetDestroy.Penalty = TargetDestroy.Penalty + ThreatPenalty + TargetDestroy.PenaltyDestroy = TargetDestroy.PenaltyDestroy + 1 + + if Player.HitPlayers[TargetPlayerName] then -- A player destroyed another player + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed friendly player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.PenaltyDestroy .. " times. " .. + "Penalty: -" .. TargetDestroy.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed a friendly target " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.PenaltyDestroy .. " times. " .. + "Penalty: -" .. TargetDestroy.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + end + + Destroyed = true + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_PENALTY", 1, ThreatPenalty, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + + local ThreatLevelTarget = TargetThreatLevel + local ThreatTypeTarget = TargetThreatType + local ThreatLevelPlayer = Player.ThreatLevel / 10 + 1 + local ThreatScore = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.ScaleDestroyScore / 10 ) + + self:E( { ThreatLevel = ThreatScore, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } ) + + Player.Score = Player.Score + ThreatScore + TargetDestroy.Score = TargetDestroy.Score + ThreatScore + TargetDestroy.ScoreDestroy = TargetDestroy.ScoreDestroy + 1 + if Player.HitPlayers[TargetPlayerName] then -- A player destroyed another player + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed enemy player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.ScoreDestroy .. " times. " .. + "Score: " .. TargetDestroy.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed an enemy " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.ScoreDestroy .. " times. " .. + "Score: " .. TargetDestroy.Score .. ". Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + end + Destroyed = true + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, ThreatScore, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + + local UnitName = TargetUnit:GetName() + local Score = self.ScoringObjects[UnitName] + if Score then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Special target '" .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. " destroyed! " .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! Total: " .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesScore() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesScore() and self:IfMessagesToCoalition() ) + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + Destroyed = true + end + + -- Check if there are Zones where the destruction happened. + for ZoneName, ScoreZoneData in pairs( self.ScoringZones ) do + self:E( { ScoringZone = ScoreZoneData } ) + local ScoreZone = ScoreZoneData.ScoreZone -- Core.Zone#ZONE_BASE + local Score = ScoreZoneData.Score + if ScoreZone:IsVec2InZone( TargetUnit:GetVec2() ) then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Target destroyed in zone '" .. ScoreZone:GetName() .. "'." .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! " .. + "Total: " .. Player.Score - Player.Penalty, + 15 ) + :ToAllIf( self:IfMessagesZone() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesZone() and self:IfMessagesToCoalition() ) + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + Destroyed = true + end + end + + end + else + -- Check if there are Zones where the destruction happened. + for ZoneName, ScoreZoneData in pairs( self.ScoringZones ) do + self:E( { ScoringZone = ScoreZoneData } ) + local ScoreZone = ScoreZoneData.ScoreZone -- Core.Zone#ZONE_BASE + local Score = ScoreZoneData.Score + if ScoreZone:IsVec2InZone( TargetUnit:GetVec2() ) then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Scenery destroyed in zone '" .. ScoreZone:GetName() .. "'." .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! " .. + "Total: " .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesZone() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesZone() and self:IfMessagesToCoalition() ) + Destroyed = true + self:ScoreCSV( PlayerName, "", "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + + -- Delete now the hit cache if the target was destroyed. + -- Otherwise points will be granted every time a target gets killed by the players that hit that target. + -- This is only relevant for player to player destroys. + if Destroyed then + Player.Hit[TargetCategory][TargetUnitName].TimeStamp = 0 + end + end + end + end +end + + +--- Produce detailed report of player hit scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerHits( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageHits = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + self:T( "Hit scores exist for player " .. PlayerName ) + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + 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 = "Hits: " .. ScoreMessageHits + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + + +--- Produce detailed report of player destroy scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerDestroys( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageDestroys = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + if PlayerData.Destroy[CategoryID] then + self:T( "Destroy scores exist for player " .. PlayerName ) + local Score = 0 + local ScoreDestroy = 0 + local Penalty = 0 + local PenaltyDestroy = 0 + + for UnitName, UnitData in pairs( PlayerData.Destroy[CategoryID] ) do + self:E( { UnitData = UnitData } ) + if UnitData ~= {} then + Score = Score + UnitData.Score + ScoreDestroy = ScoreDestroy + UnitData.ScoreDestroy + Penalty = Penalty + UnitData.Penalty + PenaltyDestroy = PenaltyDestroy + UnitData.PenaltyDestroy + end + end + + local ScoreMessageDestroy = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageDestroy ) + ScoreMessageDestroys = ScoreMessageDestroys .. ScoreMessageDestroy + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageDestroys = ScoreMessageDestroys .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageDestroys ~= "" then + ScoreMessage = "Destroys: " .. ScoreMessageDestroys + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player penalty scores because of changing the coalition. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerCoalitionChanges( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 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 + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player goal scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerGoals( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageGoal = "" + local ScoreGoal = 0 + local ScoreTask = 0 + for GoalName, GoalData in pairs( PlayerData.Goals ) do + ScoreGoal = ScoreGoal + GoalData.Score + ScoreMessageGoal = ScoreMessageGoal .. "'" .. GoalName .. "':" .. GoalData.Score .. "; " + end + PlayerScore = PlayerScore + ScoreGoal + + if ScoreMessageGoal ~= "" then + ScoreMessage = "Goals: " .. ScoreMessageGoal + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player penalty scores because of changing the coalition. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerMissions( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 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 = "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")" + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + + +--- Report Group Score Summary +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreGroupSummary( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score Group Summary" ) + + local PlayerUnits = PlayerGroup:GetUnits() + for UnitID, PlayerUnit in pairs( PlayerUnits ) do + local PlayerUnit = PlayerUnit -- Wrapper.Unit#UNIT + local PlayerName = PlayerUnit:GetPlayerName() + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +end + +--- Report Group Score Detailed +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreGroupDetailed( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score Group Detailed" ) + + local PlayerUnits = PlayerGroup:GetUnits() + for UnitID, PlayerUnit in pairs( PlayerUnits ) do + local PlayerUnit = PlayerUnit -- Wrapper.Unit#UNIT + local PlayerName = PlayerUnit:GetPlayerName() + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty, + ReportHits, + ReportDestroys, + ReportCoalitionChanges, + ReportGoals, + ReportMissions + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +end + +--- Report all players score +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreAllSummary( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score All Players" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +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","TargetPlayerName","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 TargetPlayerName The name of the target 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, TargetPlayerName, 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( '"', '_' ) + + TargetPlayerName = TargetPlayerName or "" + TargetPlayerName = TargetPlayerName: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 + + TargetUnitCoalition = TargetUnitCoalition or "" + TargetUnitCategory = TargetUnitCategory or "" + TargetUnitType = TargetUnitType or "" + TargetUnitName = TargetUnitName or "" + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. TargetPlayerName .. '"' .. ',' .. + '"' .. 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 + +--- 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 + + + + + + + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Core.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() ) -- #CLEANUP + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + self:HandleEvent( EVENTS.Birth ) + + 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 Dcs.DCSWrapper.Group#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 + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSWrapper.Unit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param Dcs.DCSWrapper.Unit#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 + 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 Dcs.DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param Dcs.DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +--- @param #CLEANUP self +-- @param Core.Event#EVENTDATA EventData +function CLEANUP:_OnEventBirth( EventData ) + self:F( { EventData } ) + + self.CleanUpList[EventData.IniDCSUnitName] = {} + self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnit = EventData.IniDCSUnit + self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroup = EventData.IniDCSGroup + self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroupName = EventData.IniDCSGroupName + self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnitName = EventData.IniDCSUnitName + + EventData.IniUnit:HandleEvent( EVENTS.EngineShutdown , self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.EngineStartup, self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.Hit, self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.PilotDead, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Dead, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Crash, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Shot, self._EventShot ) + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param Dcs.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. + -- 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 Dcs.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() + 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 Dcs.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 ) + 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 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSWrapper.Unit#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 Dcs.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 ) + + 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 + 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 + +--- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**All** -- +-- **Spawn groups of units dynamically in your missions.** +-- +-- ![Banner Image](..\Presentations\SPAWN\SPAWN.JPG) +-- +-- === +-- +-- # 1) @{#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 methods (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 represents the GROUP Template (definition). +-- * @{#SPAWN.NewWithAlias}(): Creates a new SPAWN object taking the name of the group that represents the GROUP Template (definition), and gives each spawned @{Group} an different name. +-- +-- 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 methods 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, which all start with the **Init** prefix: +-- +-- * @{#SPAWN.InitKeepUnitNames}(): Keeps the unit names as defined within the mission editor, but note that anything after a # mark is ignored, and any spaces before and after the resulting name are removed. IMPORTANT! This method MUST be the first used after :New !!! +-- * @{#SPAWN.InitLimit}(): Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.InitRandomizeRoute}(): Randomize the routes of spawned groups, and for air groups also optionally the height. +-- * @{#SPAWN.InitRandomizeTemplate}(): 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.InitUnControlled}(): Spawn plane groups uncontrolled. +-- * @{#SPAWN.InitArray}(): 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 methods are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- * @{#SPAWN.InitRandomizePosition}(): Randomizes the position of @{Group}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. +-- * @{#SPAWN.InitRandomizeUnits}(): Randomizes the @{Unit}s in the @{Group} that is spawned within a **radius band**, given an Outer and Inner radius. +-- * @{#SPAWN.InitRandomizeZones}(): Randomizes the spawning between a predefined list of @{Zone}s that are declared using this function. Each zone can be given a probability factor. +-- * @{#SPAWN.InitAIOn}(): Turns the AI On when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOff}(): Turns the AI Off when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOnOff}(): Turns the AI On or Off when spawning the new @{Group} object. +-- +-- ## 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.SpawnFromVec3}(): Spawn a new group from a Vec3 coordinate. (The group will can be spawned at a point in the air). +-- * @{#SPAWN.SpawnFromVec2}(): Spawn a new group from a Vec2 coordinate. (The group will be spawned at land height ). +-- * @{#SPAWN.SpawnFromStatic}(): Spawn a new group from a structure, taking the position of a @{Static}. +-- * @{#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) Retrieve alive GROUPs spawned by the SPAWN object +-- +-- The SPAWN class administers which GROUPS it has reserved (in stock) or has created during mission execution. +-- Every time a SPAWN object spawns a new GROUP object, a reference to the GROUP object is added to an internal table of GROUPS. +-- SPAWN provides methods to iterate through that internal GROUP object reference table: +-- +-- * @{#SPAWN.GetFirstAliveGroup}(): Will find the first alive GROUP it has spawned, and return the alive GROUP object and the first Index where the first alive GROUP object has been found. +-- * @{#SPAWN.GetNextAliveGroup}(): Will find the next alive GROUP object from a given Index, and return a reference to the alive GROUP object and the next Index where the alive GROUP has been found. +-- * @{#SPAWN.GetLastAliveGroup}(): Will find the last alive GROUP object, and will return a reference to the last live GROUP object and the last Index where the last alive GROUP object has been found. +-- +-- You can use the methods @{#SPAWN.GetFirstAliveGroup}() and sequently @{#SPAWN.GetNextAliveGroup}() to iterate through the alive GROUPS within the SPAWN object, and to actions... See the respective methods for an example. +-- The method @{#SPAWN.GetGroupFromIndex}() will return the GROUP object reference from the given Index, dead or alive... +-- +-- ## 1.5) 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.InitCleanUp}() 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.InitCleanUp}() for further info. +-- +-- ## 1.6) Catch the @{Group} spawn event in a callback function! +-- +-- When using the SpawnScheduled method, new @{Group}s are created following the schedule timing parameters. +-- When a new @{Group} is spawned, you maybe want to execute actions with that group spawned at the spawn event. +-- To SPAWN class supports this functionality through the @{#SPAWN.OnSpawnGroup}( **function( SpawnedGroup ) end ** ) method, which takes a function as a parameter that you can define locally. +-- Whenever a new @{Group} is spawned, the given function is called, and the @{Group} that was just spawned, is given as a parameter. +-- As a result, your spawn event handling function requires one parameter to be declared, which will contain the spawned @{Group} object. +-- A coding example is provided at the description of the @{#SPAWN.OnSpawnGroup}( **function( SpawnedGroup ) end ** ) method. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-14: SPAWN:**InitKeepUnitNames()** added. +-- 2017-03-14: SPAWN:**InitRandomizePosition( RandomizePosition, OuterRadious, InnerRadius )** added. +-- +-- 2017-02-04: SPAWN:InitUnControlled( **UnControlled** ) replaces SPAWN:InitUnControlled(). +-- +-- 2017-01-24: SPAWN:**InitAIOnOff( AIOnOff )** added. +-- +-- 2017-01-24: SPAWN:**InitAIOn()** added. +-- +-- 2017-01-24: SPAWN:**InitAIOff()** added. +-- +-- 2016-08-15: SPAWN:**InitCleanUp**( SpawnCleanUpInterval ) replaces SPAWN:_CleanUp_( SpawnCleanUpInterval ). +-- +-- 2016-08-15: SPAWN:**InitRandomizeZones( SpawnZones )** added. +-- +-- 2016-08-14: SPAWN:**OnSpawnGroup**( SpawnCallBackFunction, ... ) replaces SPAWN:_SpawnFunction_( SpawnCallBackFunction, ... ). +-- +-- 2016-08-14: SPAWN.SpawnInZone( Zone, __RandomizeGroup__, SpawnIndex ) replaces SpawnInZone( Zone, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ). +-- +-- 2016-08-14: SPAWN.SpawnFromVec3( Vec3, SpawnIndex ) replaces SpawnFromVec3( Vec3, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromVec2( Vec2, SpawnIndex ) replaces SpawnFromVec2( Vec2, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromUnit( SpawnUnit, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromStatic( SpawnStatic, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.**InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius )** added: +-- +-- 2016-08-14: SPAWN.**Init**Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) replaces SPAWN._Limit_( SpawnMaxUnitsAlive, SpawnMaxGroups ): +-- +-- 2016-08-14: SPAWN.**Init**Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) replaces SPAWN._Array_( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ). +-- +-- 2016-08-14: SPAWN.**Init**RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) replaces SPAWN._RandomizeRoute_( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ). +-- +-- 2016-08-14: SPAWN.**Init**RandomizeTemplate( SpawnTemplatePrefixTable ) replaces SPAWN._RandomizeTemplate_( SpawnTemplatePrefixTable ). +-- +-- 2016-08-14: SPAWN.**Init**UnControlled() replaces SPAWN._UnControlled_(). +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **Aaron**: Posed the idea for Group position randomization at SpawnInZone and make the Unit randomization separate from the Group randomization. +-- * [**Entropy**](https://forums.eagle.ru/member.php?u=111471), **Afinegan**: Came up with the requirement for AIOnOff(). +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Spawn + + + +--- SPAWN Class +-- @type SPAWN +-- @extends Core.Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +-- @field #number AliveUnits +-- @field #number MaxAliveUnits +-- @field #number SpawnIndex +-- @field #number MaxAliveGroups +-- @field #SPAWN.SpawnZoneTable SpawnZoneTable +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + +--- @type SPAWN.SpawnZoneTable +-- @list SpawnZone + + +--- 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() ) -- #SPAWN + 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.SpawnInitLimit = false -- By default, no InitLimit + 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.AIOnOff = true -- The AI is on by default when spawning a group. + self.SpawnUnControlled = false + self.SpawnInitKeepUnitNames = false -- Overwrite unit names by default with group name. + + 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.SpawnInitLimit = false -- By default, no InitLimit + 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.AIOnOff = true -- The AI is on by default when spawning a group. + self.SpawnUnControlled = false + self.SpawnInitKeepUnitNames = false -- Overwrite unit names by default with group name. + + 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 method 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' ):InitLimit( 2, 24 ) +function SPAWN:InitLimit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnInitLimit = true + 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 + +--- Keeps the unit names as defined within the mission editor, +-- but note that anything after a # mark is ignored, +-- and any spaces before and after the resulting name are removed. +-- IMPORTANT! This method MUST be the first used after :New !!! +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitKeepUnitNames() + self:F( ) + + self.SpawnInitKeepUnitNames = true + + 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 ... +-- @param #number SpawnHeight (optional) Specifies the **additional** height in meters that can be added to the base height specified at each waypoint in the ME. +-- @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' ):InitRandomizeRoute( 2, 2, 2000 ) +function SPAWN:InitRandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + self.SpawnRandomizeRouteHeight = SpawnHeight + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + +--- Randomizes the position of @{Group}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. +-- @param #SPAWN self +-- @param #boolean RandomizePosition If true, SPAWN will perform the randomization of the @{Group}s position between a given outer and inner radius. +-- @param Dcs.DCSTypes#Distance OuterRadius (optional) The outer radius in meters where the new group will be spawned. +-- @param Dcs.DCSTypes#Distance InnerRadius (optional) The inner radius in meters where the new group will NOT be spawned. +-- @return #SPAWN +function SPAWN:InitRandomizePosition( RandomizePosition, OuterRadius, InnerRadius ) + self:F( { self.SpawnTemplatePrefix, RandomizePosition, OuterRadius, InnerRadius } ) + + self.SpawnRandomizePosition = RandomizePosition or false + self.SpawnRandomizePositionOuterRadius = OuterRadius or 0 + self.SpawnRandomizePositionInnerRadius = InnerRadius or 0 + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- Randomizes the UNITs that are spawned within a radius band given an Outer and Inner radius. +-- @param #SPAWN self +-- @param #boolean RandomizeUnits If true, SPAWN will perform the randomization of the @{UNIT}s position within the group between a given outer and inner radius. +-- @param Dcs.DCSTypes#Distance OuterRadius (optional) The outer radius in meters where the new group will be spawned. +-- @param Dcs.DCSTypes#Distance InnerRadius (optional) The inner radius in meters where the new group will NOT be spawned. +-- @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' ):InitRandomizeRoute( 2, 2, 2000 ) +function SPAWN:InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ) + self:F( { self.SpawnTemplatePrefix, RandomizeUnits, OuterRadius, InnerRadius } ) + + self.SpawnRandomizeUnits = RandomizeUnits or false + self.SpawnOuterRadius = OuterRadius or 0 + self.SpawnInnerRadius = InnerRadius or 0 + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + +--- This method is rather complicated to understand. But I'll try to explain. +-- This method 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' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +function SPAWN:InitRandomizeTemplate( 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 + +--TODO: Add example. +--- This method provides the functionality to randomize the spawning of the Groups at a given list of zones of different types. +-- @param #SPAWN self +-- @param #table SpawnZoneTable A table with @{Zone} objects. If this table is given, then each spawn will be executed within the given list of @{Zone}s objects. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 3 different zones for each new SPAWN the Group to be executed, regardless of the zone type. +function SPAWN:InitRandomizeZones( SpawnZoneTable ) + self:F( { self.SpawnTemplatePrefix, SpawnZoneTable } ) + + self.SpawnZoneTable = SpawnZoneTable + self.SpawnRandomizeZones = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeZones( 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 method 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():InitRandomizeRoute( 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:InitCleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup() + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + --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' ):InitLimit( 2, 24 ):InitArray( 90, "Diamond", 10, 100, 50 ) +function SPAWN:InitArray( 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 + +do -- AI methods + --- Turns the AI On or Off for the @{Group} when spawning. + -- @param #SPAWN self + -- @param #boolean AIOnOff A value of true sets the AI On, a value of false sets the AI Off. + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOnOff( AIOnOff ) + + self.AIOnOff = AIOnOff + return self + end + + --- Turns the AI On for the @{Group} when spawning. + -- @param #SPAWN self + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOn() + + return self:InitAIOnOff( true ) + end + + --- Turns the AI Off for the @{Group} when spawning. + -- @param #SPAWN self + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOff() + + return self:InitAIOnOff( false ) + end + +end -- AI methods + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex, self.AliveUnits } ) + + 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 Wrapper.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 ) + local WayPoints = SpawnGroup and SpawnGroup.WayPoints or nil + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSObject() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + local SpawnGroup = self:SpawnWithIndex( SpawnIndex ) + if SpawnGroup and WayPoints then + -- If there were WayPoints set, then Re-Execute those WayPoints! + SpawnGroup:WayPointInitialize( WayPoints ) + SpawnGroup:WayPointExecute( 1, 5 ) + end + + if SpawnGroup.ReSpawnFunction then + SpawnGroup:ReSpawnFunction() + end + + return SpawnGroup +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Wrapper.Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F2( { SpawnTemplatePrefix = self.SpawnTemplatePrefix, SpawnIndex = SpawnIndex, AliveUnits = self.AliveUnits, SpawnMaxGroups = self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + self:T( SpawnTemplate.name ) + + if SpawnTemplate then + + local PointVec3 = POINT_VEC3:New( SpawnTemplate.route.points[1].x, SpawnTemplate.route.points[1].alt, SpawnTemplate.route.points[1].y ) + self:T( { "Current point of ", self.SpawnTemplatePrefix, PointVec3 } ) + + -- If RandomizePosition, then Randomize the formation in the zone band, keeping the template. + if self.SpawnRandomizePosition then + local RandomVec2 = PointVec3:GetRandomVec2InRadius( self.SpawnRandomizePositionOuterRadius, self.SpawnRandomizePositionInnerRadius ) + local CurrentX = SpawnTemplate.units[1].x + local CurrentY = SpawnTemplate.units[1].y + SpawnTemplate.x = RandomVec2.x + SpawnTemplate.y = RandomVec2.y + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].x = SpawnTemplate.units[UnitID].x + ( RandomVec2.x - CurrentX ) + SpawnTemplate.units[UnitID].y = SpawnTemplate.units[UnitID].y + ( RandomVec2.y - CurrentY ) + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + end + + -- If RandomizeUnits, then Randomize the formation at the start point. + if self.SpawnRandomizeUnits then + for UnitID = 1, #SpawnTemplate.units do + local RandomVec2 = PointVec3:GetRandomVec2InRadius( self.SpawnOuterRadius, self.SpawnInnerRadius ) + SpawnTemplate.units[UnitID].x = RandomVec2.x + SpawnTemplate.units[UnitID].y = RandomVec2.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + end + + if SpawnTemplate.CategoryID == Group.Category.HELICOPTER or SpawnTemplate.CategoryID == Group.Category.AIRPLANE then + if SpawnTemplate.route.points[1].type == "TakeOffParking" then + SpawnTemplate.uncontrolled = self.SpawnUnControlled + end + end + end + + _EVENTDISPATCHER:OnBirthForTemplate( SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( SpawnTemplate, self._OnEngineShutDown, self ) + end + self:T3( SpawnTemplate.name ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( SpawnTemplate ) + + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Wrapper.Group#GROUP + + --TODO: Need to check if this function doesn't need to be scheduled, as the group may not be immediately there! + if SpawnGroup then + + SpawnGroup:SetAIOnOff( self.AIOnOff ) + end + + -- 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 method 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 method 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 SpawnCallBackFunction 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 +-- @usage +-- -- Declare SpawnObject and call a function when a new Group is spawned. +-- local SpawnObject = SPAWN +-- :New( "SpawnObject" ) +-- :InitLimit( 2, 10 ) +-- :OnSpawnGroup( +-- function( SpawnGroup ) +-- SpawnGroup:E( "I am spawned" ) +-- end +-- ) +-- :SpawnScheduled( 300, 0.3 ) +function SPAWN:OnSpawnGroup( SpawnCallBackFunction, ... ) + self:F( "OnSpawnGroup" ) + + self.SpawnFunctionHook = SpawnCallBackFunction + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + +--- Will spawn a group from a Vec3 in 3D space. +-- This method is mostly advisable to be used if you want to simulate spawning units in the air, like helicopters or airplanes. +-- 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 Dcs.DCSTypes#Vec3 Vec3 The Vec3 coordinates where to spawn the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Vec3, SpawnIndex } ) + + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + self:T2(PointVec3) + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + self:T( { "Current point of ", self.SpawnTemplatePrefix, Vec3 } ) + + -- Translate the position of the Group Template to the Vec3. + for UnitID = 1, #SpawnTemplate.units do + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + local UnitTemplate = SpawnTemplate.units[UnitID] + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = Vec3.x + ( SX - BX ) + local TY = Vec3.z + ( SY - BY ) + SpawnTemplate.units[UnitID].x = TX + SpawnTemplate.units[UnitID].y = TY + SpawnTemplate.units[UnitID].alt = Vec3.y + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + SpawnTemplate.route.points[1].x = Vec3.x + SpawnTemplate.route.points[1].y = Vec3.z + SpawnTemplate.route.points[1].alt = Vec3.y + + SpawnTemplate.x = Vec3.x + SpawnTemplate.y = Vec3.z + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + + return nil +end + +--- Will spawn a group from a Vec2 in 3D space. +-- This method is mostly advisable to be used if you want to simulate spawning groups on the ground from air units, like vehicles. +-- 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 Dcs.DCSTypes#Vec2 Vec2 The Vec2 coordinates where to spawn the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromVec2( Vec2, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Vec2, SpawnIndex } ) + + local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) + return self:SpawnFromVec3( PointVec2:GetVec3(), SpawnIndex ) +end + + +--- Will spawn a group from a hosting unit. This method 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 Wrapper.Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + return self:SpawnFromVec3( HostUnit:GetVec3(), SpawnIndex ) + end + + return nil +end + +--- Will spawn a group from a hosting static. This method is mostly advisable to be used if you want to simulate spawning from buldings and structures (static buildings). +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Wrapper.Static#STATIC HostStatic The static dropping or unloading the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromStatic( HostStatic, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostStatic, SpawnIndex } ) + + if HostStatic and HostStatic:IsAlive() then + return self:SpawnFromVec3( HostStatic:GetVec3(), SpawnIndex ) + end + + return nil +end + +--- Will spawn a Group within a given @{Zone}. +-- The @{Zone} can be of any type derived from @{Zone#ZONE_BASE}. +-- Once the @{Group} is spawned within the zone, the @{Group} will continue on its route. +-- The **first waypoint** (where the group is spawned) is replaced with the zone location coordinates. +-- @param #SPAWN self +-- @param Core.Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #boolean RandomizeGroup (optional) Randomization of the @{Group} position in the zone. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, RandomizeGroup, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, SpawnIndex } ) + + if Zone then + if RandomizeGroup then + return self:SpawnFromVec2( Zone:GetRandomVec2(), SpawnIndex ) + else + return self:SpawnFromVec2( Zone:GetVec2(), SpawnIndex ) + end + end + + return nil +end + +--- (**AIR**) Will spawn a plane group in UnControlled or Controlled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- You can use UnControlled mode to simulate planes startup and ready for take-off but aren't moving (yet). +-- ReSpawn the plane in Controlled mode, and the plane will move... +-- @param #SPAWN self +-- @param #boolean UnControlled true if UnControlled, false if Controlled. +-- @return #SPAWN self +function SPAWN:InitUnControlled( UnControlled ) + self:F2( { self.SpawnTemplatePrefix, UnControlled } ) + + self.SpawnUnControlled = UnControlled + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = UnControlled + 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 + +--- Will find the first alive @{Group} it has spawned, and return the alive @{Group} object and the first Index where the first alive @{Group} object has been found. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP, #number The @{Group} object found, the new Index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +-- @usage +-- -- Find the first alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetFirstAliveGroup() +-- while GroupPlane ~= nil do +-- -- Do actions with the GroupPlane object. +-- GroupPlane, Index = SpawnPlanes:GetNextAliveGroup( Index ) +-- end +function SPAWN:GetFirstAliveGroup() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + return SpawnGroup, SpawnIndex + end + end + + return nil, nil +end + + +--- Will find the next alive @{Group} object from a given Index, and return a reference to the alive @{Group} object and the next Index where the alive @{Group} has been found. +-- @param #SPAWN self +-- @param #number SpawnIndexStart A Index holding the start position to search from. This method can also be used to find the first alive @{Group} object from the given Index. +-- @return Wrapper.Group#GROUP, #number The next alive @{Group} object found, the next Index where the next alive @{Group} object was found. +-- @return #nil, #nil When no alive @{Group} object is found from the start Index position, #nil is returned. +-- @usage +-- -- Find the first alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetFirstAliveGroup() +-- while GroupPlane ~= nil do +-- -- Do actions with the GroupPlane object. +-- GroupPlane, Index = SpawnPlanes:GetNextAliveGroup( Index ) +-- end +function SPAWN:GetNextAliveGroup( SpawnIndexStart ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndexStart } ) + + SpawnIndexStart = SpawnIndexStart + 1 + for SpawnIndex = SpawnIndexStart, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + return SpawnGroup, SpawnIndex + end + end + + return nil, nil +end + +--- Will find the last alive @{Group} object, and will return a reference to the last live @{Group} object and the last Index where the last alive @{Group} object has been found. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP, #number The last alive @{Group} object found, the last Index where the last alive @{Group} object was found. +-- @return #nil, #nil When no alive @{Group} object is found, #nil is returned. +-- @usage +-- -- Find the last alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetLastAliveGroup() +-- if GroupPlane then -- GroupPlane can be nil!!! +-- -- Do actions with the GroupPlane object. +-- end +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 Wrapper.Group#GROUP self +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 Dcs.DCSWrapper.Unit#Unit DCSUnit The @{DCSUnit} to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + local SpawnUnitName = ( DCSUnit and DCSUnit:getName() ) or nil + if SpawnUnitName then + local IndexString = string.match( SpawnUnitName, "#.*-" ):sub( 2, -2 ) + if IndexString then + local Index = tonumber( IndexString ) + return Index + end + end + + return nil +end + +--- Return the prefix of a SpawnUnit. +-- 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 Dcs.DCSWrapper.Unit#UNIT DCSUnit The @{DCSUnit} to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + local DCSGroup = DCSUnit:getGroup() + local DCSUnitName = ( DCSGroup and DCSGroup:getName() ) or nil + if DCSUnitName then + local SpawnPrefix = string.match( DCSUnitName, ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +-- @param #SPAWN self +-- @param Dcs.DCSWrapper.Unit#Unit DCSUnit The @{DCSUnit} to be searched. +-- @return Wrapper.Group#GROUP The Group +-- @return #nil Nothing found +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + 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 + + 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:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T3( 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. +-- @param #SPAWN self +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F3( { 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:T3( { 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 + + if SpawnTemplate.CategoryID == Group.Category.GROUND then + self:T3( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false + end + + if self.SpawnInitKeepUnitNames == false then + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + end + else + for UnitID = 1, #SpawnTemplate.units do + local UnitPrefix, Rest = string.match( SpawnTemplate.units[UnitID].name, "^([^#]+)#?" ):gsub( "^%s*(.-)%s*$", "%1" ) + self:T( { UnitPrefix, Rest } ) + + SpawnTemplate.units[UnitID].name = string.format( '%s#%03d-%02d', UnitPrefix, SpawnIndex, UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + end + end + + self:T3( { "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 ) + + -- Manage randomization of altitude for airborne units ... + if SpawnTemplate.CategoryID == Group.Category.AIRPLANE or SpawnTemplate.CategoryID == Group.Category.HELICOPTER then + if SpawnTemplate.route.points[t].alt and self.SpawnRandomizeRouteHeight then + SpawnTemplate.route.points[t].alt = SpawnTemplate.route.points[t].alt + math.random( 1, self.SpawnRandomizeRouteHeight ) + end + else + SpawnTemplate.route.points[t].alt = nil + end + + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + self:_RandomizeZones( SpawnIndex ) + + 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 + local OldX = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].x + local OldY = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].y + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x = self.SpawnTemplate.units[1].x + ( self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x - OldX ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y = self.SpawnTemplate.units[1].y + ( self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y - OldY ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].alt = self.SpawnTemplate.units[1].alt + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +--- Private method that randomizes the @{Zone}s where the Group will be spawned. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeZones( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeZones } ) + + if self.SpawnRandomizeZones then + local SpawnZone = nil -- Core.Zone#ZONE_BASE + while not SpawnZone do + self:T( { SpawnZoneTableCount = #self.SpawnZoneTable, self.SpawnZoneTable } ) + local ZoneID = math.random( #self.SpawnZoneTable ) + self:T( ZoneID ) + SpawnZone = self.SpawnZoneTable[ ZoneID ]:GetZoneMaybe() + end + + self:T( "Preparing Spawn in Zone", SpawnZone:GetName() ) + + local SpawnVec2 = SpawnZone:GetRandomVec2() + + self:T( { SpawnVec2 = SpawnVec2 } ) + + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + + self:T( { Route = SpawnTemplate.route } ) + + for UnitID = 1, #SpawnTemplate.units do + local UnitTemplate = SpawnTemplate.units[UnitID] + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = SpawnVec2.x + ( SX - BX ) + local TY = SpawnVec2.y + ( SY - BY ) + UnitTemplate.x = TX + UnitTemplate.y = TY + -- TODO: Manage altitude based on landheight... + --SpawnTemplate.units[UnitID].alt = SpawnVec2: + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + end + SpawnTemplate.x = SpawnVec2.x + SpawnTemplate.y = SpawnVec2.y + SpawnTemplate.route.points[1].x = SpawnVec2.x + SpawnTemplate.route.points[1].y = SpawnVec2.y + end + + 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 method is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F2( { 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.SpawnTemplate.units <= self.SpawnMaxUnitsAlive ) or self.UnControlled == true 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 ... + +--- @param #SPAWN self +-- @param Core.Event#EVENTDATA Event +function SPAWN:_OnBirth( Event ) + + if timer.getTime0() < timer.getAbsTime() then + if Event.IniDCSUnit then + local EventPrefix = self:_GetPrefixFromDCSUnit( Event.IniDCSUnit ) + self:T( { "Birth Event:", EventPrefix, self.SpawnTemplatePrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... + +--- @param #SPAWN self +-- @param Core.Event#EVENTDATA Event +function SPAWN:_OnDeadOrCrash( Event ) + self:F( self.SpawnTemplatePrefix, Event ) + + if Event.IniDCSUnit then + local EventPrefix = self:_GetPrefixFromDCSUnit( Event.IniDCSUnit ) + self:T( { "Dead event: " .. EventPrefix, self.SpawnTemplatePrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end +end + +--- 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:F2( { "_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 + +--- Schedules the CleanUp of Groups +-- @param #SPAWN self +-- @return #boolean True = Continue Scheduler +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup() + self:T( { "CleanUp Scheduler:", SpawnGroup, SpawnCursor } ) + + while SpawnGroup do + + local SpawnUnits = SpawnGroup:GetUnits() + + for UnitID, UnitData in pairs( SpawnUnits ) do + + local SpawnUnit = UnitData -- Wrapper.Unit#UNIT + local SpawnUnitName = SpawnUnit:GetName() + + + self.SpawnCleanUpTimeStamps[SpawnUnitName] = self.SpawnCleanUpTimeStamps[SpawnUnitName] or {} + local Stamp = self.SpawnCleanUpTimeStamps[SpawnUnitName] + self:T( { SpawnUnitName, Stamp } ) + + if Stamp.Vec2 then + if SpawnUnit:InAir() == false and SpawnUnit:GetVelocityKMH() < 1 then + local NewVec2 = SpawnUnit:GetVec2() + if Stamp.Vec2.x == NewVec2.x and Stamp.Vec2.y == NewVec2.y then + -- If the plane is not moving, and is on the ground, assign it with a timestamp... + if Stamp.Time + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "ReSpawning:", SpawnGroup:GetName() } ) + self:ReSpawn( SpawnCursor ) + Stamp.Vec2 = nil + Stamp.Time = nil + end + else + Stamp.Time = timer.getTime() + Stamp.Vec2 = SpawnUnit:GetVec2() + end + else + Stamp.Vec2 = nil + Stamp.Time = nil + end + else + if SpawnUnit:InAir() == false then + Stamp.Vec2 = SpawnUnit:GetVec2() + if SpawnUnit:GetVelocityKMH() < 1 then + Stamp.Time = timer.getTime() + end + else + Stamp.Time = nil + Stamp.Vec2 = nil + end + end + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup, SpawnCursor } ) + + 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 + +--- the MOVEMENT class +-- @type MOVEMENT +-- @extends Core.Base#BASE +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() ) -- #MOVEMENT + 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. + + self:HandleEvent( EVENTS.Birth ) + +-- 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. +-- @param #MOVEMENT self +-- @param Core.Event#EVENTDATA self +function MOVEMENT:OnEventBirth( EventData ) + self:F( { EventData } ) + + 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 EventData.IniDCSUnit then + self:T( "Birth object : " .. EventData.IniDCSUnitName ) + if EventData.IniDCSGroup and EventData.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( EventData.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[EventData.IniDCSUnitName] = EventData.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + + EventData.IniUnit:HandleEvent( EVENTS.DEAD, self.OnDeadOrCrash ) + 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) + +--- The SEAD class +-- @type SEAD +-- @extends Core.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 + + self:HandleEvent( EVENTS.Shot ) + + 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 +-- @param #SEAD +-- @param Core.Event#EVENTDATA EventData +function SEAD:OnEventShot( EventData ) + self:F( { EventData } ) + + local SEADUnit = EventData.IniDCSUnit + local SEADUnitName = EventData.IniDCSUnitName + local SEADWeapon = EventData.Weapon -- Identify the weapon fired + local SEADWeaponName = EventData.WeaponName -- return weapon type + -- 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 = EventData.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 ) + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) + 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 (F10) 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. +-- +-- +-- @usage +-- -- Declare a new EscortPlanes object as follows: +-- +-- -- First find the GROUP object and the CLIENT object. +-- local EscortClient = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. +-- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- +-- -- Now use these 2 objects to construct the new EscortPlanes object. +-- EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) +-- +-- +-- +-- @module Escort +-- @author FlightControl + +--- ESCORT class +-- @type ESCORT +-- @extends Core.Base#BASE +-- @field Wrapper.Client#CLIENT EscortClient +-- @field Wrapper.Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field Core.Scheduler#SCHEDULER FollowScheduler The instance of the SCHEDULER class. +-- @field #number FollowDistance The current follow distance. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field Dcs.DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field Dcs.DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Core.Menu#MENU_CLIENT EscortMenuResumeMission +-- @field Functional.Detection#DETECTION_BASE Detection +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = 1, + 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, + SmokeDirectionVector = false, + 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 Wrapper.Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Wrapper.Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @param #string EscortBriefing A text showing the ESCORT briefing to the player. Note that if no EscortBriefing is provided, the default briefing will be shown. +-- @return #ESCORT self +-- @usage +-- -- Declare a new EscortPlanes object as follows: +-- +-- -- First find the GROUP object and the CLIENT object. +-- local EscortClient = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. +-- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- +-- -- Now use these 2 objects to construct the new EscortPlanes object. +-- EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + + local self = BASE:Inherit( self, BASE:New() ) -- #ESCORT + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Wrapper.Client#CLIENT + self.EscortGroup = EscortGroup -- Wrapper.Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self.EscortSetGroup = SET_GROUP:New() + self.EscortSetGroup:AddObject( self.EscortGroup ) + self.EscortSetGroup:Flush() + self.Detection = DETECTION_UNITS:New( self.EscortSetGroup, 15000 ) + + self.EscortGroup.Detection = self.Detection + + -- 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()].Detection = self.EscortGroup.Detection + end + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + if not EscortBriefing then + 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 + ) + else + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") " .. EscortBriefing, + 60, EscortClient + ) + end + + self.FollowDistance = 100 + self.CT1 = 0 + self.GT1 = 0 + + self.FollowScheduler, self.FollowSchedule = SCHEDULER:New( self, self._FollowScheduler, {}, 1, .5, .01 ) + self.FollowScheduler:Stop( self.FollowSchedule ) + + self.EscortMode = ESCORT.MODE.MISSION + + + return self +end + +--- Set a Detection method for the EscortClient to be reported upon. +-- Detection methods are based on the derived classes from DETECTION_BASE. +-- @param #ESCORT self +-- @param Function.Detection#DETECTION_BASE Detection +function ESCORT:SetDetection( Detection ) + + self.Detection = Detection + self.EscortGroup.Detection = self.Detection + self.EscortClient._EscortGroups[self.EscortGroup:GetName()].Detection = self.EscortGroup.Detection + + Detection:__Start( 1 ) + +end + +--- This function is for test, it will put on the frequency of the FollowScheduler a red smoke at the direction vector calculated for the escort to fly to. +-- This allows to visualize where the escort is flying to. +-- @param #ESCORT self +-- @param #boolean SmokeDirection If true, then the direction vector will be smoked. +function ESCORT:TestSmokeDirectionVector( SmokeDirection ) + self.SmokeDirectionVector = ( SmokeDirection == true ) and true or false +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 Dcs.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, self, 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 Dcs.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 Dcs.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, + self, + self.EscortGroup, + Height, + 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 Dcs.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 Dcs.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 Dcs.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 Dcs.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, + self, + 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, self ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Green, "Released a green flare!" ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Red, "Released a red flare!" ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.White, "Released a white flare!" ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Yellow, "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, self ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Green, "Releasing green smoke!" ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Red, "Releasing red smoke!" ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.White, "Releasing white smoke!" ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Orange, "Releasing orange smoke!" ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Blue, "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 Dcs.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, self ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, self, true ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, self, false ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + 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, self, self.EscortGroup:OptionROEHoldFire(), "Holding weapons!" ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, self, self.EscortGroup:OptionROEReturnFire(), "Returning fire!" ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, self, self.EscortGroup:OptionROEOpenFire(), "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, self, self.EscortGroup:OptionROEWeaponFree(), "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, self, self.EscortGroup:OptionROTNoReaction(), "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, self, self.EscortGroup:OptionROTPassiveDefense(), "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, self, self.EscortGroup:OptionROTEvadeFire(), "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, self, self.EscortGroup:OptionROTVertical(), "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( OrbitGroup, OrbitHeight, OrbitSeconds ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitUnit = OrbitGroup:GetUnit(1) -- Wrapper.Unit#UNIT + + self.FollowScheduler:Stop( self.FollowSchedule ) + + local PointFrom = {} + local GroupVec3 = EscortGroup:GetUnit(1):GetVec3() + PointFrom = {} + PointFrom.x = GroupVec3.x + PointFrom.y = GroupVec3.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupVec3.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetVec2() + 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( Distance ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = Distance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Functional.Escort#ESCORT self +-- @param Wrapper.Group#GROUP EscortGroup +-- @param Wrapper.Client#CLIENT EscortClient +-- @param Dcs.DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + self.FollowScheduler:Stop( self.FollowSchedule ) + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + self.FollowScheduler:Start( self.FollowSchedule ) + + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_Flare( Color, Message ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_Smoke( Color, Message ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT:_ReportNearbyTargetsNow() + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT:_SwitchReportNearbyTargets( ReportTargets ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = ReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + self.ReportTargetsScheduler:Schedule( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ScanTargets( ScanDuration ) + + local EscortGroup = self.EscortGroup -- Wrapper.Group#GROUP + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroup:IsHelicopter() then + EscortGroup:PushTask( + EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ), 1 ) + elseif EscortGroup:IsAirPlane() then + 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:Start( self.FollowSchedule ) + end + +end + +--- @param Wrapper.Group#GROUP EscortGroup +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup:GetState( EscortGroup, "Escort" ) + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #ESCORT self +-- @param #number DetectedItemID +function ESCORT:_AttackTarget( DetectedItemID ) + + local EscortGroup = self.EscortGroup -- Wrapper.Group#GROUP + self:E( EscortGroup ) + + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup:SetState( EscortGroup, "Escort", self ) + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroup:TaskAttackUnit( DetectedUnit ) + end + end, Tasks + ) + + Tasks[#Tasks+1] = EscortGroup:TaskFunction( 1, 2, "_Resume", { "''" } ) + + EscortGroup:SetTask( + EscortGroup:TaskCombo( + Tasks + ), 1 + ) + + else + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroup:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) + end + end, Tasks + ) + + EscortGroup:SetTask( + EscortGroup:TaskCombo( + Tasks + ), 1 + ) + + end + + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + +end + +--- +-- @param #number DetectedItemID +function ESCORT:_AssistTarget( EscortGroupAttack, DetectedItemID ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroupAttack:TaskAttackUnit( DetectedUnit ) + end + end, Tasks + ) + + Tasks[#Tasks+1] = EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + + EscortGroupAttack:SetTask( + EscortGroupAttack:TaskCombo( + Tasks + ), 1 + ) + + else + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroupAttack:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) + end + end, Tasks + ) + + EscortGroupAttack:SetTask( + EscortGroupAttack:TaskCombo( + Tasks + ), 1 + ) + + end + + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ROE( EscortROEFunction, EscortROEMessage ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ROT( EscortROTFunction, EscortROTMessage ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ResumeMission( WayPoint ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + 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 -- Wrapper.Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Functional.Escort#ESCORT self +function ESCORT:_FollowScheduler() + self:F( { self.FollowDistance } ) + + self:T( {self.EscortClient.UnitName, self.EscortGroup.GroupName } ) + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + local FollowDistance = self.FollowDistance + + self:T( {ClientUnit.UnitName, GroupUnit.UnitName } ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetVec3() + self:T( { "self.CV1", self.CV1 } ) + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetVec3() + 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:GetVec3() + 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 } + + if self.SmokeDirectionVector == true then + trigger.action.smoke( GDV, trigger.smokeColor.Red ) + end + + 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, FollowDistance, Time:", CS, GS, Speed, FollowDistance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:RouteToVec3( 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 + + if true then + + local EscortGroupName = self.EscortGroup:GetName() + + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + local DetectedItems = self.Detection:GetDetectedItems() + self:E( DetectedItems ) + + local DetectedTargets = false + + local DetectedMsgs = {} + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + local ClientEscortTargets = EscortGroupData.Detection + + for DetectedItemID, DetectedItem in ipairs( DetectedItems ) do + self:E( { DetectedItemID, DetectedItem } ) + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + + local DetectedItemReportSummary = self.Detection:DetectedItemReportSummary( DetectedItemID ) + + if ClientEscortGroupName == EscortGroupName then + + DetectedMsgs[#DetectedMsgs+1] = DetectedItemReportSummary + + MENU_CLIENT_COMMAND:New( self.EscortClient, + DetectedItemReportSummary, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + self, + DetectedItemID + ) + else + if self.EscortMenuTargetAssistance then + + self:T( DetectedItemReportSummary ) + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + DetectedItemReportSummary, + MenuTargetAssistance, + ESCORT._AssistTarget, + self, + EscortGroupData.EscortGroup, + DetectedItemID + ) + end + end + + DetectedTargets = true + + end + end + self:E( DetectedMsgs ) + if DetectedTargets then + self.EscortGroup:MessageToClient( "Detected targets:\n" .. table.concat( DetectedMsgs, "\n" ), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected.", 10, self.EscortClient ) + end + + return true + else +-- 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 EscortTargetUnitVec3 = EscortTargetUnit:GetVec3() +-- local EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( EscortTargetUnitVec3.x - EscortVec3.x )^2 + +-- ( EscortTargetUnitVec3.y - EscortVec3.y )^2 + +-- ( EscortTargetUnitVec3.z - EscortVec3.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 EscortTargetUnitVec3 = ClientEscortTargetData.AttackUnit:GetVec3() +-- local EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( EscortTargetUnitVec3.x - EscortVec3.x )^2 + +-- ( EscortTargetUnitVec3.y - EscortVec3.y )^2 + +-- ( EscortTargetUnitVec3.z - EscortVec3.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, +-- self, +-- EscortGroupData.EscortGroup, +-- 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 EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( WayPoint.x - EscortVec3.x )^2 + +-- ( WayPoint.y - EscortVec3.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 + end + + return false +end +--- This module contains the MISSILETRAINER class. +-- +-- === +-- +-- 1) @{MissileTrainer#MISSILETRAINER} class, extends @{Base#BASE} +-- =============================================================== +-- 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. +-- +-- +-- 1.1) 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. +-- +-- 1.2) 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. +-- +-- === +-- +-- CREDITS +-- ======= +-- **Stuka (Danny)** Who you can search on the Eagle Dynamics Forums. +-- Working together with Danny has resulted in the MISSILETRAINER class. +-- Danny has shared his ideas and together we made a design. +-- Together with the **476 virtual team**, we tested the MISSILETRAINER class, and got much positive feedback! +-- +-- @module MissileTrainer +-- @author FlightControl + + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @field Core.Set#SET_CLIENT DBClients +-- @extends Core.Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", + TrackingMissiles = {}, +} + +function MISSILETRAINER._Alive( Client, self ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "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, "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 + +--- 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 + + self:HandleEvent( EVENTS.Shot ) + + self.DBClients = SET_CLIENT:New():FilterStart() + + +-- for ClientID, Client in pairs( self.DBClients.Database ) do +-- self:E( "ForEach:" .. Client.UnitName ) +-- Client:Alive( self._Alive, self ) +-- end +-- + self.DBClients:ForEachClient( + function( Client ) + self:E( "ForEach:" .. Client.UnitName ) + Client:Alive( self._Alive, self ) + end + ) + + + +-- self.DB:ForEachClient( +-- --- @param Wrapper.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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Messages OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):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.", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Range display OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):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)", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):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", 15, "Menu" ):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 Core.Event#EVENTDATA EventData +function MISSILETRAINER:OnEventShot( EVentData ) + self:F( { EVentData } ) + + local TrainerSourceDCSUnit = EVentData.IniDCSUnit + local TrainerSourceDCSUnitName = EVentData.IniDCSUnitName + local TrainerWeapon = EVentData.Weapon -- Identify the weapon fired + local TrainerWeaponName = EVentData.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + if TrainerTargetDCSUnit then + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients:FindClient( 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 ), 5, "Launch Alert" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + 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 + else + -- TODO: some weapons don't know the target unit... Need to develop a workaround for this. + if ( TrainerWeapon:getTypeName() == "9M311" ) then + SCHEDULER:New( TrainerWeapon, TrainerWeapon.destroy, {}, 1 ) + else + end + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local TargetVec3 = Client:GetVec3() + + local Range = ( ( PositionMissile.x - TargetVec3.x )^2 + + ( PositionMissile.y - TargetVec3.y )^2 + + ( PositionMissile.z - TargetVec3.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 TargetVec3 = Client:GetVec3() + + self:T2( { TargetVec3, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - TargetVec3.x, y = PositionMissile.y - TargetVec3.y, z = PositionMissile.z - TargetVec3.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 TargetVec3 = Client:GetVec3() + + local Distance = ( ( PositionMissile.x - TargetVec3.x )^2 + + ( PositionMissile.y - TargetVec3.y )^2 + + ( PositionMissile.z - TargetVec3.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() + ), 15, "Hit Alert" ) + + 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() + ), 5, "Tracking" ) + + 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, 1, "Tracking" ):ToClient( Client ) + end + end + end + + return true +end +--- This module contains the AIRBASEPOLICE classes. +-- +-- === +-- +-- 1) @{AirbasePolice#AIRBASEPOLICE_BASE} class, extends @{Base#BASE} +-- ================================================================== +-- The @{AirbasePolice#AIRBASEPOLICE_BASE} class provides the main methods to monitor CLIENT behaviour at airbases. +-- CLIENTS should not be allowed to: +-- +-- * Don't taxi faster than 40 km/h. +-- * Don't take-off on taxiways. +-- * Avoid to hit other planes on the airbase. +-- * Obey ground control orders. +-- +-- 2) @{AirbasePolice#AIRBASEPOLICE_CAUCASUS} class, extends @{AirbasePolice#AIRBASEPOLICE_BASE} +-- ============================================================================================= +-- All the airbases on the caucasus map can be monitored using this class. +-- If you want to monitor specific airbases, you need to use the @{#AIRBASEPOLICE_BASE.Monitor}() method, which takes a table or airbase names. +-- The following names can be given: +-- * AnapaVityazevo +-- * Batumi +-- * Beslan +-- * Gelendzhik +-- * Gudauta +-- * Kobuleti +-- * KrasnodarCenter +-- * KrasnodarPashkovsky +-- * Krymsk +-- * Kutaisi +-- * MaykopKhanskaya +-- * MineralnyeVody +-- * Mozdok +-- * Nalchik +-- * Novorossiysk +-- * SenakiKolkhi +-- * SochiAdler +-- * Soganlug +-- * SukhumiBabushara +-- * TbilisiLochini +-- * Vaziani +-- +-- 3) @{AirbasePolice#AIRBASEPOLICE_NEVADA} class, extends @{AirbasePolice#AIRBASEPOLICE_BASE} +-- ============================================================================================= +-- All the airbases on the NEVADA map can be monitored using this class. +-- If you want to monitor specific airbases, you need to use the @{#AIRBASEPOLICE_BASE.Monitor}() method, which takes a table or airbase names. +-- The following names can be given: +-- * Nellis +-- * McCarran +-- * Creech +-- * Groom Lake +-- +-- ### Contributions: Dutch Baron - Concept & Testing +-- ### Author: FlightControl - Framework Design & Programming +-- +-- @module AirbasePolice + + + + + +--- @type AIRBASEPOLICE_BASE +-- @field Core.Set#SET_CLIENT SetClient +-- @extends Core.Base#BASE + +AIRBASEPOLICE_BASE = { + ClassName = "AIRBASEPOLICE_BASE", + SetClient = nil, + Airbases = nil, + AirbaseNames = nil, +} + + +--- Creates a new AIRBASEPOLICE_BASE object. +-- @param #AIRBASEPOLICE_BASE self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @param Airbases A table of Airbase Names. +-- @return #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:New( SetClient, Airbases ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + self:E( { self.ClassName, SetClient, Airbases } ) + + self.SetClient = SetClient + self.Airbases = Airbases + + for AirbaseID, Airbase in pairs( self.Airbases ) do + Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do + Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(SMOKECOLOR.Red):Flush() + end + end + +-- -- Template +-- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) +-- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) +-- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + + self.SetClient:ForEachClient( + --- @param Wrapper.Client#CLIENT Client + function( Client ) + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0) + Client:SetState( self, "Taxi", false ) + end + ) + + self.AirbaseMonitor = SCHEDULER:New( self, self._AirbaseMonitor, {}, 0, 2, 0.05 ) + + return self +end + +--- @type AIRBASEPOLICE_BASE.AirbaseNames +-- @list <#string> + +--- Monitor a table of airbase names. +-- @param #AIRBASEPOLICE_BASE self +-- @param #AIRBASEPOLICE_BASE.AirbaseNames AirbaseNames A list of AirbaseNames to monitor. If this parameters is nil, then all airbases will be monitored. +-- @return #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:Monitor( AirbaseNames ) + + if AirbaseNames then + if type( AirbaseNames ) == "table" then + self.AirbaseNames = AirbaseNames + else + self.AirbaseNames = { AirbaseNames } + end + end +end + +--- @param #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:_AirbaseMonitor() + + for AirbaseID, Airbase in pairs( self.Airbases ) do + + if not self.AirbaseNames or self.AirbaseNames[AirbaseID] then + + self:E( AirbaseID ) + + self.SetClient:ForEachClientInZone( Airbase.ZoneBoundary, + + --- @param Wrapper.Client#CLIENT Client + function( Client ) + + self:E( Client.UnitName ) + if Client:IsAlive() then + local NotInRunwayZone = true + for ZoneRunwayID, ZoneRunway in pairs( Airbase.ZoneRunways ) do + NotInRunwayZone = ( Client:IsNotInZone( ZoneRunway ) == true ) and NotInRunwayZone or false + end + + if NotInRunwayZone then + local Taxi = self:GetState( self, "Taxi" ) + self:E( Taxi ) + if Taxi == false then + Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. Airbase.MaximumSpeed " km/h.", 20, "ATC" ) + self:SetState( self, "Taxi", true ) + end + + -- TODO: GetVelocityKMH function usage + local VelocityVec3 = Client:GetVelocity() + local Velocity = ( VelocityVec3.x ^ 2 + VelocityVec3.y ^ 2 + VelocityVec3.z ^ 2 ) ^ 0.5 -- in meters / sec + local Velocity = Velocity * 3.6 -- now it is in km/h. + -- MESSAGE:New( "Velocity = " .. Velocity, 1 ):ToAll() + local IsAboveRunway = Client:IsAboveRunway() + local IsOnGround = Client:InAir() == false + self:T( IsAboveRunway, IsOnGround ) + + if IsAboveRunway and IsOnGround then + + if Velocity > Airbase.MaximumSpeed then + local IsSpeeding = Client:GetState( self, "Speeding" ) + + if IsSpeeding == true then + local SpeedingWarnings = Client:GetState( self, "Warnings" ) + self:T( SpeedingWarnings ) + + if SpeedingWarnings <= 3 then + Client:Message( "You are speeding on the taxiway! Slow down or you will be removed from this airbase! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Warning " .. SpeedingWarnings .. " / 3" ) + Client:SetState( self, "Warnings", SpeedingWarnings + 1 ) + else + MESSAGE:New( "Player " .. Client:GetPlayerName() .. " has been removed from the airbase, due to a speeding violation ...", 10, "Airbase Police" ):ToAll() + Client:Destroy() + trigger.action.setUserFlag( "AIRCRAFT_"..Client:GetID(), 100) + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + end + + else + Client:Message( "You are speeding on the taxiway, slow down now! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Attention! " ) + Client:SetState( self, "Speeding", true ) + Client:SetState( self, "Warnings", 1 ) + end + + else + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + end + end + + else + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + local Taxi = self:GetState( self, "Taxi" ) + if Taxi == true then + Client:Message( "You have progressed to the runway ... Await take-off clearance ...", 20, "ATC" ) + self:SetState( self, "Taxi", false ) + end + end + end + end + ) + end + end + + return true +end + + +--- @type AIRBASEPOLICE_CAUCASUS +-- @field Core.Set#SET_CLIENT SetClient +-- @extends #AIRBASEPOLICE_BASE + +AIRBASEPOLICE_CAUCASUS = { + ClassName = "AIRBASEPOLICE_CAUCASUS", + Airbases = { + AnapaVityazevo = { + PointsBoundary = { + [1]={["y"]=242234.85714287,["x"]=-6616.5714285726,}, + [2]={["y"]=241060.57142858,["x"]=-5585.142857144,}, + [3]={["y"]=243806.2857143,["x"]=-3962.2857142868,}, + [4]={["y"]=245240.57142858,["x"]=-4816.5714285726,}, + [5]={["y"]=244783.42857144,["x"]=-5630.8571428583,}, + [6]={["y"]=243800.57142858,["x"]=-5065.142857144,}, + [7]={["y"]=242232.00000001,["x"]=-6622.2857142868,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=242140.57142858,["x"]=-6478.8571428583,}, + [2]={["y"]=242188.57142858,["x"]=-6522.0000000011,}, + [3]={["y"]=244124.2857143,["x"]=-4344.0000000011,}, + [4]={["y"]=244068.2857143,["x"]=-4296.5714285726,}, + [5]={["y"]=242140.57142858,["x"]=-6480.0000000011,} + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Batumi = { + PointsBoundary = { + [1]={["y"]=617567.14285714,["x"]=-355313.14285715,}, + [2]={["y"]=616181.42857142,["x"]=-354800.28571429,}, + [3]={["y"]=616007.14285714,["x"]=-355128.85714286,}, + [4]={["y"]=618230,["x"]=-356914.57142858,}, + [5]={["y"]=618727.14285714,["x"]=-356166,}, + [6]={["y"]=617572.85714285,["x"]=-355308.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=616442.28571429,["x"]=-355090.28571429,}, + [2]={["y"]=618450.57142857,["x"]=-356522,}, + [3]={["y"]=618407.71428571,["x"]=-356584.85714286,}, + [4]={["y"]=618361.99999999,["x"]=-356554.85714286,}, + [5]={["y"]=618324.85714285,["x"]=-356599.14285715,}, + [6]={["y"]=618250.57142856,["x"]=-356543.42857143,}, + [7]={["y"]=618257.7142857,["x"]=-356496.28571429,}, + [8]={["y"]=618237.7142857,["x"]=-356459.14285715,}, + [9]={["y"]=616555.71428571,["x"]=-355258.85714286,}, + [10]={["y"]=616486.28571428,["x"]=-355280.57142858,}, + [11]={["y"]=616410.57142856,["x"]=-355227.71428572,}, + [12]={["y"]=616441.99999999,["x"]=-355179.14285715,}, + [13]={["y"]=616401.99999999,["x"]=-355147.71428572,}, + [14]={["y"]=616441.42857142,["x"]=-355092.57142858,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Beslan = { + PointsBoundary = { + [1]={["y"]=842082.57142857,["x"]=-148445.14285715,}, + [2]={["y"]=845237.71428572,["x"]=-148639.71428572,}, + [3]={["y"]=845232,["x"]=-148765.42857143,}, + [4]={["y"]=844220.57142857,["x"]=-149168.28571429,}, + [5]={["y"]=843274.85714286,["x"]=-149125.42857143,}, + [6]={["y"]=842077.71428572,["x"]=-148554,}, + [7]={["y"]=842083.42857143,["x"]=-148445.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=842104.57142857,["x"]=-148460.57142857,}, + [2]={["y"]=845225.71428572,["x"]=-148656,}, + [3]={["y"]=845220.57142858,["x"]=-148750,}, + [4]={["y"]=842098.85714286,["x"]=-148556.28571429,}, + [5]={["y"]=842104,["x"]=-148460.28571429,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Gelendzhik = { + PointsBoundary = { + [1]={["y"]=297856.00000001,["x"]=-51151.428571429,}, + [2]={["y"]=299044.57142858,["x"]=-49720.000000001,}, + [3]={["y"]=298861.71428572,["x"]=-49580.000000001,}, + [4]={["y"]=298198.85714286,["x"]=-49842.857142858,}, + [5]={["y"]=297990.28571429,["x"]=-50151.428571429,}, + [6]={["y"]=297696.00000001,["x"]=-51054.285714286,}, + [7]={["y"]=297850.28571429,["x"]=-51160.000000001,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=297834.00000001,["x"]=-51107.428571429,}, + [2]={["y"]=297786.57142858,["x"]=-51068.857142858,}, + [3]={["y"]=298946.57142858,["x"]=-49686.000000001,}, + [4]={["y"]=298993.14285715,["x"]=-49725.714285715,}, + [5]={["y"]=297835.14285715,["x"]=-51107.714285715,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Gudauta = { + PointsBoundary = { + [1]={["y"]=517246.57142857,["x"]=-197850.28571429,}, + [2]={["y"]=516749.42857142,["x"]=-198070.28571429,}, + [3]={["y"]=515755.14285714,["x"]=-197598.85714286,}, + [4]={["y"]=515369.42857142,["x"]=-196538.85714286,}, + [5]={["y"]=515623.71428571,["x"]=-195618.85714286,}, + [6]={["y"]=515946.57142857,["x"]=-195510.28571429,}, + [7]={["y"]=517243.71428571,["x"]=-197858.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=517096.57142857,["x"]=-197804.57142857,}, + [2]={["y"]=515880.85714285,["x"]=-195590.28571429,}, + [3]={["y"]=515812.28571428,["x"]=-195628.85714286,}, + [4]={["y"]=517036.57142857,["x"]=-197834.57142857,}, + [5]={["y"]=517097.99999999,["x"]=-197807.42857143,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Kobuleti = { + PointsBoundary = { + [1]={["y"]=634427.71428571,["x"]=-318290.28571429,}, + [2]={["y"]=635033.42857143,["x"]=-317550.2857143,}, + [3]={["y"]=635864.85714286,["x"]=-317333.14285715,}, + [4]={["y"]=636967.71428571,["x"]=-317261.71428572,}, + [5]={["y"]=637144.85714286,["x"]=-317913.14285715,}, + [6]={["y"]=634630.57142857,["x"]=-318687.42857144,}, + [7]={["y"]=634424.85714286,["x"]=-318290.2857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=634509.71428571,["x"]=-318339.42857144,}, + [2]={["y"]=636767.42857143,["x"]=-317516.57142858,}, + [3]={["y"]=636790,["x"]=-317575.71428572,}, + [4]={["y"]=634531.42857143,["x"]=-318398.00000001,}, + [5]={["y"]=634510.28571429,["x"]=-318339.71428572,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + KrasnodarCenter = { + PointsBoundary = { + [1]={["y"]=366680.28571429,["x"]=11699.142857142,}, + [2]={["y"]=366654.28571429,["x"]=11225.142857142,}, + [3]={["y"]=367497.14285715,["x"]=11082.285714285,}, + [4]={["y"]=368025.71428572,["x"]=10396.57142857,}, + [5]={["y"]=369854.28571429,["x"]=11367.999999999,}, + [6]={["y"]=369840.00000001,["x"]=11910.857142856,}, + [7]={["y"]=366682.57142858,["x"]=11697.999999999,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=369205.42857144,["x"]=11789.142857142,}, + [2]={["y"]=369209.71428572,["x"]=11714.857142856,}, + [3]={["y"]=366699.71428572,["x"]=11581.714285713,}, + [4]={["y"]=366698.28571429,["x"]=11659.142857142,}, + [5]={["y"]=369208.85714286,["x"]=11788.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + KrasnodarPashkovsky = { + PointsBoundary = { + [1]={["y"]=386754,["x"]=6476.5714285703,}, + [2]={["y"]=389182.57142858,["x"]=8722.2857142846,}, + [3]={["y"]=388832.57142858,["x"]=9086.5714285703,}, + [4]={["y"]=386961.14285715,["x"]=7707.9999999989,}, + [5]={["y"]=385404,["x"]=9179.4285714274,}, + [6]={["y"]=383239.71428572,["x"]=7386.5714285703,}, + [7]={["y"]=383954,["x"]=6486.5714285703,}, + [8]={["y"]=385775.42857143,["x"]=8097.9999999989,}, + [9]={["y"]=386804,["x"]=7319.4285714274,}, + [10]={["y"]=386375.42857143,["x"]=6797.9999999989,}, + [11]={["y"]=386746.85714286,["x"]=6472.2857142846,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=385891.14285715,["x"]=8416.5714285703,}, + [2]={["y"]=385842.28571429,["x"]=8467.9999999989,}, + [3]={["y"]=384180.85714286,["x"]=6917.1428571417,}, + [4]={["y"]=384228.57142858,["x"]=6867.7142857132,}, + [5]={["y"]=385891.14285715,["x"]=8416.5714285703,}, + }, + [2] = { + [1]={["y"]=386714.85714286,["x"]=6674.857142856,}, + [2]={["y"]=386757.71428572,["x"]=6627.7142857132,}, + [3]={["y"]=389028.57142858,["x"]=8741.4285714275,}, + [4]={["y"]=388981.71428572,["x"]=8790.5714285703,}, + [5]={["y"]=386714.57142858,["x"]=6674.5714285703,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Krymsk = { + PointsBoundary = { + [1]={["y"]=293338.00000001,["x"]=-7575.4285714297,}, + [2]={["y"]=295199.42857144,["x"]=-5434.0000000011,}, + [3]={["y"]=295595.14285715,["x"]=-6239.7142857154,}, + [4]={["y"]=294152.2857143,["x"]=-8325.4285714297,}, + [5]={["y"]=293345.14285715,["x"]=-7596.8571428582,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=293522.00000001,["x"]=-7567.4285714297,}, + [2]={["y"]=293578.57142858,["x"]=-7616.0000000011,}, + [3]={["y"]=295246.00000001,["x"]=-5591.142857144,}, + [4]={["y"]=295187.71428573,["x"]=-5546.0000000011,}, + [5]={["y"]=293523.14285715,["x"]=-7568.2857142868,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Kutaisi = { + PointsBoundary = { + [1]={["y"]=682087.42857143,["x"]=-284512.85714286,}, + [2]={["y"]=685387.42857143,["x"]=-283662.85714286,}, + [3]={["y"]=685294.57142857,["x"]=-284977.14285715,}, + [4]={["y"]=682744.57142857,["x"]=-286505.71428572,}, + [5]={["y"]=682094.57142857,["x"]=-284527.14285715,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=682638,["x"]=-285202.28571429,}, + [2]={["y"]=685050.28571429,["x"]=-284507.42857144,}, + [3]={["y"]=685068.85714286,["x"]=-284578.85714286,}, + [4]={["y"]=682657.42857143,["x"]=-285264.28571429,}, + [5]={["y"]=682638.28571429,["x"]=-285202.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + MaykopKhanskaya = { + PointsBoundary = { + [1]={["y"]=456876.28571429,["x"]=-27665.42857143,}, + [2]={["y"]=457800,["x"]=-28392.857142858,}, + [3]={["y"]=459368.57142857,["x"]=-26378.571428573,}, + [4]={["y"]=459425.71428572,["x"]=-25242.857142858,}, + [5]={["y"]=458961.42857143,["x"]=-24964.285714287,}, + [6]={["y"]=456878.57142857,["x"]=-27667.714285715,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=457005.42857143,["x"]=-27668.000000001,}, + [2]={["y"]=459028.85714286,["x"]=-25168.857142858,}, + [3]={["y"]=459082.57142857,["x"]=-25216.857142858,}, + [4]={["y"]=457060,["x"]=-27714.285714287,}, + [5]={["y"]=457004.57142857,["x"]=-27669.714285715,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + MineralnyeVody = { + PointsBoundary = { + [1]={["y"]=703857.14285714,["x"]=-50226.000000002,}, + [2]={["y"]=707385.71428571,["x"]=-51911.714285716,}, + [3]={["y"]=707595.71428571,["x"]=-51434.857142859,}, + [4]={["y"]=707900,["x"]=-51568.857142859,}, + [5]={["y"]=707542.85714286,["x"]=-52326.000000002,}, + [6]={["y"]=706628.57142857,["x"]=-52568.857142859,}, + [7]={["y"]=705142.85714286,["x"]=-51790.285714288,}, + [8]={["y"]=703678.57142857,["x"]=-50611.714285716,}, + [9]={["y"]=703857.42857143,["x"]=-50226.857142859,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=703904,["x"]=-50352.571428573,}, + [2]={["y"]=707596.28571429,["x"]=-52094.571428573,}, + [3]={["y"]=707560.57142858,["x"]=-52161.714285716,}, + [4]={["y"]=703871.71428572,["x"]=-50420.571428573,}, + [5]={["y"]=703902,["x"]=-50352.000000002,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Mozdok = { + PointsBoundary = { + [1]={["y"]=832123.42857143,["x"]=-83608.571428573,}, + [2]={["y"]=835916.28571429,["x"]=-83144.285714288,}, + [3]={["y"]=835474.28571429,["x"]=-84170.571428573,}, + [4]={["y"]=832911.42857143,["x"]=-84470.571428573,}, + [5]={["y"]=832487.71428572,["x"]=-85565.714285716,}, + [6]={["y"]=831573.42857143,["x"]=-85351.42857143,}, + [7]={["y"]=832123.71428572,["x"]=-83610.285714288,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=832201.14285715,["x"]=-83699.428571431,}, + [2]={["y"]=832212.57142857,["x"]=-83780.571428574,}, + [3]={["y"]=835730.28571429,["x"]=-83335.714285717,}, + [4]={["y"]=835718.85714286,["x"]=-83246.571428574,}, + [5]={["y"]=832200.57142857,["x"]=-83700.000000002,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Nalchik = { + PointsBoundary = { + [1]={["y"]=759370,["x"]=-125502.85714286,}, + [2]={["y"]=761384.28571429,["x"]=-124177.14285714,}, + [3]={["y"]=761472.85714286,["x"]=-124325.71428572,}, + [4]={["y"]=761092.85714286,["x"]=-125048.57142857,}, + [5]={["y"]=760295.71428572,["x"]=-125685.71428572,}, + [6]={["y"]=759444.28571429,["x"]=-125734.28571429,}, + [7]={["y"]=759375.71428572,["x"]=-125511.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=759454.28571429,["x"]=-125551.42857143,}, + [2]={["y"]=759492.85714286,["x"]=-125610.85714286,}, + [3]={["y"]=761406.28571429,["x"]=-124304.28571429,}, + [4]={["y"]=761361.14285714,["x"]=-124239.71428572,}, + [5]={["y"]=759456,["x"]=-125552.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Novorossiysk = { + PointsBoundary = { + [1]={["y"]=278677.71428573,["x"]=-41656.571428572,}, + [2]={["y"]=278446.2857143,["x"]=-41453.714285715,}, + [3]={["y"]=278989.14285716,["x"]=-40188.000000001,}, + [4]={["y"]=279717.71428573,["x"]=-39968.000000001,}, + [5]={["y"]=280020.57142859,["x"]=-40208.000000001,}, + [6]={["y"]=278674.85714287,["x"]=-41660.857142858,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=278673.14285716,["x"]=-41615.142857144,}, + [2]={["y"]=278625.42857144,["x"]=-41570.571428572,}, + [3]={["y"]=279835.42857144,["x"]=-40226.000000001,}, + [4]={["y"]=279882.2857143,["x"]=-40270.000000001,}, + [5]={["y"]=278672.00000001,["x"]=-41614.857142858,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SenakiKolkhi = { + PointsBoundary = { + [1]={["y"]=646036.57142857,["x"]=-281778.85714286,}, + [2]={["y"]=646045.14285714,["x"]=-281191.71428571,}, + [3]={["y"]=647032.28571429,["x"]=-280598.85714285,}, + [4]={["y"]=647669.42857143,["x"]=-281273.14285714,}, + [5]={["y"]=648323.71428571,["x"]=-281370.28571428,}, + [6]={["y"]=648520.85714286,["x"]=-281978.85714285,}, + [7]={["y"]=646039.42857143,["x"]=-281783.14285714,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=646060.85714285,["x"]=-281736,}, + [2]={["y"]=646056.57142857,["x"]=-281631.71428571,}, + [3]={["y"]=648442.28571428,["x"]=-281840.28571428,}, + [4]={["y"]=648432.28571428,["x"]=-281918.85714286,}, + [5]={["y"]=646063.71428571,["x"]=-281738.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SochiAdler = { + PointsBoundary = { + [1]={["y"]=460642.28571428,["x"]=-164861.71428571,}, + [2]={["y"]=462820.85714285,["x"]=-163368.85714286,}, + [3]={["y"]=463649.42857142,["x"]=-163340.28571429,}, + [4]={["y"]=463835.14285714,["x"]=-164040.28571429,}, + [5]={["y"]=462535.14285714,["x"]=-165654.57142857,}, + [6]={["y"]=460678,["x"]=-165247.42857143,}, + [7]={["y"]=460635.14285714,["x"]=-164876,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=460831.42857143,["x"]=-165180,}, + [2]={["y"]=460878.57142857,["x"]=-165257.14285714,}, + [3]={["y"]=463663.71428571,["x"]=-163793.14285714,}, + [4]={["y"]=463612.28571428,["x"]=-163697.42857143,}, + [5]={["y"]=460831.42857143,["x"]=-165177.14285714,}, + }, + [2] = { + [1]={["y"]=460831.42857143,["x"]=-165180,}, + [2]={["y"]=460878.57142857,["x"]=-165257.14285714,}, + [3]={["y"]=463663.71428571,["x"]=-163793.14285714,}, + [4]={["y"]=463612.28571428,["x"]=-163697.42857143,}, + [5]={["y"]=460831.42857143,["x"]=-165177.14285714,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Soganlug = { + PointsBoundary = { + [1]={["y"]=894530.85714286,["x"]=-316928.28571428,}, + [2]={["y"]=896422.28571428,["x"]=-318622.57142857,}, + [3]={["y"]=896090.85714286,["x"]=-318934,}, + [4]={["y"]=894019.42857143,["x"]=-317119.71428571,}, + [5]={["y"]=894533.71428571,["x"]=-316925.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=894525.71428571,["x"]=-316964,}, + [2]={["y"]=896363.14285714,["x"]=-318634.28571428,}, + [3]={["y"]=896299.14285714,["x"]=-318702.85714286,}, + [4]={["y"]=894464,["x"]=-317031.71428571,}, + [5]={["y"]=894524.57142857,["x"]=-316963.71428571,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SukhumiBabushara = { + PointsBoundary = { + [1]={["y"]=562541.14285714,["x"]=-219852.28571429,}, + [2]={["y"]=562691.14285714,["x"]=-219395.14285714,}, + [3]={["y"]=564326.85714286,["x"]=-219523.71428571,}, + [4]={["y"]=566262.57142857,["x"]=-221166.57142857,}, + [5]={["y"]=566069.71428571,["x"]=-221580.85714286,}, + [6]={["y"]=562534,["x"]=-219873.71428571,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=562684,["x"]=-219779.71428571,}, + [2]={["y"]=562717.71428571,["x"]=-219718,}, + [3]={["y"]=566046.85714286,["x"]=-221376.57142857,}, + [4]={["y"]=566012.28571428,["x"]=-221446.57142857,}, + [5]={["y"]=562684.57142857,["x"]=-219782.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + TbilisiLochini = { + PointsBoundary = { + [1]={["y"]=895172.85714286,["x"]=-314667.42857143,}, + [2]={["y"]=895337.42857143,["x"]=-314143.14285714,}, + [3]={["y"]=895990.28571429,["x"]=-314036,}, + [4]={["y"]=897730.28571429,["x"]=-315284.57142857,}, + [5]={["y"]=897901.71428571,["x"]=-316284.57142857,}, + [6]={["y"]=897684.57142857,["x"]=-316618.85714286,}, + [7]={["y"]=895173.14285714,["x"]=-314667.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=895261.14285715,["x"]=-314652.28571428,}, + [2]={["y"]=897654.57142857,["x"]=-316523.14285714,}, + [3]={["y"]=897711.71428571,["x"]=-316450.28571429,}, + [4]={["y"]=895327.42857143,["x"]=-314568.85714286,}, + [5]={["y"]=895261.71428572,["x"]=-314656,}, + }, + [2] = { + [1]={["y"]=895605.71428572,["x"]=-314724.57142857,}, + [2]={["y"]=897639.71428572,["x"]=-316148,}, + [3]={["y"]=897683.42857143,["x"]=-316087.14285714,}, + [4]={["y"]=895650,["x"]=-314660,}, + [5]={["y"]=895606,["x"]=-314724.85714286,} + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Vaziani = { + PointsBoundary = { + [1]={["y"]=902122,["x"]=-318163.71428572,}, + [2]={["y"]=902678.57142857,["x"]=-317594,}, + [3]={["y"]=903275.71428571,["x"]=-317405.42857143,}, + [4]={["y"]=903418.57142857,["x"]=-317891.14285714,}, + [5]={["y"]=904292.85714286,["x"]=-318748.28571429,}, + [6]={["y"]=904542,["x"]=-319740.85714286,}, + [7]={["y"]=904042,["x"]=-320166.57142857,}, + [8]={["y"]=902121.42857143,["x"]=-318164.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=902239.14285714,["x"]=-318190.85714286,}, + [2]={["y"]=904014.28571428,["x"]=-319994.57142857,}, + [3]={["y"]=904064.85714285,["x"]=-319945.14285715,}, + [4]={["y"]=902294.57142857,["x"]=-318146,}, + [5]={["y"]=902247.71428571,["x"]=-318190.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + }, +} + +--- Creates a new AIRBASEPOLICE_CAUCASUS object. +-- @param #AIRBASEPOLICE_CAUCASUS self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @return #AIRBASEPOLICE_CAUCASUS self +function AIRBASEPOLICE_CAUCASUS:New( SetClient ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + + -- -- AnapaVityazevo + -- local AnapaVityazevoBoundary = GROUP:FindByName( "AnapaVityazevo Boundary" ) + -- self.Airbases.AnapaVityazevo.ZoneBoundary = ZONE_POLYGON:New( "AnapaVityazevo Boundary", AnapaVityazevoBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local AnapaVityazevoRunway1 = GROUP:FindByName( "AnapaVityazevo Runway 1" ) + -- self.Airbases.AnapaVityazevo.ZoneRunways[1] = ZONE_POLYGON:New( "AnapaVityazevo Runway 1", AnapaVityazevoRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Batumi + -- local BatumiBoundary = GROUP:FindByName( "Batumi Boundary" ) + -- self.Airbases.Batumi.ZoneBoundary = ZONE_POLYGON:New( "Batumi Boundary", BatumiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local BatumiRunway1 = GROUP:FindByName( "Batumi Runway 1" ) + -- self.Airbases.Batumi.ZoneRunways[1] = ZONE_POLYGON:New( "Batumi Runway 1", BatumiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Beslan + -- local BeslanBoundary = GROUP:FindByName( "Beslan Boundary" ) + -- self.Airbases.Beslan.ZoneBoundary = ZONE_POLYGON:New( "Beslan Boundary", BeslanBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local BeslanRunway1 = GROUP:FindByName( "Beslan Runway 1" ) + -- self.Airbases.Beslan.ZoneRunways[1] = ZONE_POLYGON:New( "Beslan Runway 1", BeslanRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Gelendzhik + -- local GelendzhikBoundary = GROUP:FindByName( "Gelendzhik Boundary" ) + -- self.Airbases.Gelendzhik.ZoneBoundary = ZONE_POLYGON:New( "Gelendzhik Boundary", GelendzhikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local GelendzhikRunway1 = GROUP:FindByName( "Gelendzhik Runway 1" ) + -- self.Airbases.Gelendzhik.ZoneRunways[1] = ZONE_POLYGON:New( "Gelendzhik Runway 1", GelendzhikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Gudauta + -- local GudautaBoundary = GROUP:FindByName( "Gudauta Boundary" ) + -- self.Airbases.Gudauta.ZoneBoundary = ZONE_POLYGON:New( "Gudauta Boundary", GudautaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local GudautaRunway1 = GROUP:FindByName( "Gudauta Runway 1" ) + -- self.Airbases.Gudauta.ZoneRunways[1] = ZONE_POLYGON:New( "Gudauta Runway 1", GudautaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Kobuleti + -- local KobuletiBoundary = GROUP:FindByName( "Kobuleti Boundary" ) + -- self.Airbases.Kobuleti.ZoneBoundary = ZONE_POLYGON:New( "Kobuleti Boundary", KobuletiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KobuletiRunway1 = GROUP:FindByName( "Kobuleti Runway 1" ) + -- self.Airbases.Kobuleti.ZoneRunways[1] = ZONE_POLYGON:New( "Kobuleti Runway 1", KobuletiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- KrasnodarCenter + -- local KrasnodarCenterBoundary = GROUP:FindByName( "KrasnodarCenter Boundary" ) + -- self.Airbases.KrasnodarCenter.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarCenter Boundary", KrasnodarCenterBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrasnodarCenterRunway1 = GROUP:FindByName( "KrasnodarCenter Runway 1" ) + -- self.Airbases.KrasnodarCenter.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarCenter Runway 1", KrasnodarCenterRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- KrasnodarPashkovsky + -- local KrasnodarPashkovskyBoundary = GROUP:FindByName( "KrasnodarPashkovsky Boundary" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarPashkovsky Boundary", KrasnodarPashkovskyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrasnodarPashkovskyRunway1 = GROUP:FindByName( "KrasnodarPashkovsky Runway 1" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 1", KrasnodarPashkovskyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- local KrasnodarPashkovskyRunway2 = GROUP:FindByName( "KrasnodarPashkovsky Runway 2" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[2] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 2", KrasnodarPashkovskyRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Krymsk + -- local KrymskBoundary = GROUP:FindByName( "Krymsk Boundary" ) + -- self.Airbases.Krymsk.ZoneBoundary = ZONE_POLYGON:New( "Krymsk Boundary", KrymskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrymskRunway1 = GROUP:FindByName( "Krymsk Runway 1" ) + -- self.Airbases.Krymsk.ZoneRunways[1] = ZONE_POLYGON:New( "Krymsk Runway 1", KrymskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Kutaisi + -- local KutaisiBoundary = GROUP:FindByName( "Kutaisi Boundary" ) + -- self.Airbases.Kutaisi.ZoneBoundary = ZONE_POLYGON:New( "Kutaisi Boundary", KutaisiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KutaisiRunway1 = GROUP:FindByName( "Kutaisi Runway 1" ) + -- self.Airbases.Kutaisi.ZoneRunways[1] = ZONE_POLYGON:New( "Kutaisi Runway 1", KutaisiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- MaykopKhanskaya + -- local MaykopKhanskayaBoundary = GROUP:FindByName( "MaykopKhanskaya Boundary" ) + -- self.Airbases.MaykopKhanskaya.ZoneBoundary = ZONE_POLYGON:New( "MaykopKhanskaya Boundary", MaykopKhanskayaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MaykopKhanskayaRunway1 = GROUP:FindByName( "MaykopKhanskaya Runway 1" ) + -- self.Airbases.MaykopKhanskaya.ZoneRunways[1] = ZONE_POLYGON:New( "MaykopKhanskaya Runway 1", MaykopKhanskayaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- MineralnyeVody + -- local MineralnyeVodyBoundary = GROUP:FindByName( "MineralnyeVody Boundary" ) + -- self.Airbases.MineralnyeVody.ZoneBoundary = ZONE_POLYGON:New( "MineralnyeVody Boundary", MineralnyeVodyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MineralnyeVodyRunway1 = GROUP:FindByName( "MineralnyeVody Runway 1" ) + -- self.Airbases.MineralnyeVody.ZoneRunways[1] = ZONE_POLYGON:New( "MineralnyeVody Runway 1", MineralnyeVodyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Mozdok + -- local MozdokBoundary = GROUP:FindByName( "Mozdok Boundary" ) + -- self.Airbases.Mozdok.ZoneBoundary = ZONE_POLYGON:New( "Mozdok Boundary", MozdokBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MozdokRunway1 = GROUP:FindByName( "Mozdok Runway 1" ) + -- self.Airbases.Mozdok.ZoneRunways[1] = ZONE_POLYGON:New( "Mozdok Runway 1", MozdokRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Nalchik + -- local NalchikBoundary = GROUP:FindByName( "Nalchik Boundary" ) + -- self.Airbases.Nalchik.ZoneBoundary = ZONE_POLYGON:New( "Nalchik Boundary", NalchikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local NalchikRunway1 = GROUP:FindByName( "Nalchik Runway 1" ) + -- self.Airbases.Nalchik.ZoneRunways[1] = ZONE_POLYGON:New( "Nalchik Runway 1", NalchikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Novorossiysk + -- local NovorossiyskBoundary = GROUP:FindByName( "Novorossiysk Boundary" ) + -- self.Airbases.Novorossiysk.ZoneBoundary = ZONE_POLYGON:New( "Novorossiysk Boundary", NovorossiyskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local NovorossiyskRunway1 = GROUP:FindByName( "Novorossiysk Runway 1" ) + -- self.Airbases.Novorossiysk.ZoneRunways[1] = ZONE_POLYGON:New( "Novorossiysk Runway 1", NovorossiyskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SenakiKolkhi + -- local SenakiKolkhiBoundary = GROUP:FindByName( "SenakiKolkhi Boundary" ) + -- self.Airbases.SenakiKolkhi.ZoneBoundary = ZONE_POLYGON:New( "SenakiKolkhi Boundary", SenakiKolkhiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SenakiKolkhiRunway1 = GROUP:FindByName( "SenakiKolkhi Runway 1" ) + -- self.Airbases.SenakiKolkhi.ZoneRunways[1] = ZONE_POLYGON:New( "SenakiKolkhi Runway 1", SenakiKolkhiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SochiAdler + -- local SochiAdlerBoundary = GROUP:FindByName( "SochiAdler Boundary" ) + -- self.Airbases.SochiAdler.ZoneBoundary = ZONE_POLYGON:New( "SochiAdler Boundary", SochiAdlerBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SochiAdlerRunway1 = GROUP:FindByName( "SochiAdler Runway 1" ) + -- self.Airbases.SochiAdler.ZoneRunways[1] = ZONE_POLYGON:New( "SochiAdler Runway 1", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- local SochiAdlerRunway2 = GROUP:FindByName( "SochiAdler Runway 2" ) + -- self.Airbases.SochiAdler.ZoneRunways[2] = ZONE_POLYGON:New( "SochiAdler Runway 2", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Soganlug + -- local SoganlugBoundary = GROUP:FindByName( "Soganlug Boundary" ) + -- self.Airbases.Soganlug.ZoneBoundary = ZONE_POLYGON:New( "Soganlug Boundary", SoganlugBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SoganlugRunway1 = GROUP:FindByName( "Soganlug Runway 1" ) + -- self.Airbases.Soganlug.ZoneRunways[1] = ZONE_POLYGON:New( "Soganlug Runway 1", SoganlugRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SukhumiBabushara + -- local SukhumiBabusharaBoundary = GROUP:FindByName( "SukhumiBabushara Boundary" ) + -- self.Airbases.SukhumiBabushara.ZoneBoundary = ZONE_POLYGON:New( "SukhumiBabushara Boundary", SukhumiBabusharaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SukhumiBabusharaRunway1 = GROUP:FindByName( "SukhumiBabushara Runway 1" ) + -- self.Airbases.SukhumiBabushara.ZoneRunways[1] = ZONE_POLYGON:New( "SukhumiBabushara Runway 1", SukhumiBabusharaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- TbilisiLochini + -- local TbilisiLochiniBoundary = GROUP:FindByName( "TbilisiLochini Boundary" ) + -- self.Airbases.TbilisiLochini.ZoneBoundary = ZONE_POLYGON:New( "TbilisiLochini Boundary", TbilisiLochiniBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local TbilisiLochiniRunway1 = GROUP:FindByName( "TbilisiLochini Runway 1" ) + -- self.Airbases.TbilisiLochini.ZoneRunways[1] = ZONE_POLYGON:New( "TbilisiLochini Runway 1", TbilisiLochiniRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- local TbilisiLochiniRunway2 = GROUP:FindByName( "TbilisiLochini Runway 2" ) + -- self.Airbases.TbilisiLochini.ZoneRunways[2] = ZONE_POLYGON:New( "TbilisiLochini Runway 2", TbilisiLochiniRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Vaziani + -- local VazianiBoundary = GROUP:FindByName( "Vaziani Boundary" ) + -- self.Airbases.Vaziani.ZoneBoundary = ZONE_POLYGON:New( "Vaziani Boundary", VazianiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local VazianiRunway1 = GROUP:FindByName( "Vaziani Runway 1" ) + -- self.Airbases.Vaziani.ZoneRunways[1] = ZONE_POLYGON:New( "Vaziani Runway 1", VazianiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + + + -- Template + -- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) + -- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) + -- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + + return self + +end + + + + +--- @type AIRBASEPOLICE_NEVADA +-- @extends Functional.AirbasePolice#AIRBASEPOLICE_BASE +AIRBASEPOLICE_NEVADA = { + ClassName = "AIRBASEPOLICE_NEVADA", + Airbases = { + Nellis = { + PointsBoundary = { + [1]={["y"]=-17814.714285714,["x"]=-399823.14285714,}, + [2]={["y"]=-16875.857142857,["x"]=-398763.14285714,}, + [3]={["y"]=-16251.571428571,["x"]=-398988.85714286,}, + [4]={["y"]=-16163,["x"]=-398693.14285714,}, + [5]={["y"]=-16328.714285714,["x"]=-398034.57142857,}, + [6]={["y"]=-15943,["x"]=-397571.71428571,}, + [7]={["y"]=-15711.571428571,["x"]=-397551.71428571,}, + [8]={["y"]=-15748.714285714,["x"]=-396806,}, + [9]={["y"]=-16288.714285714,["x"]=-396517.42857143,}, + [10]={["y"]=-16751.571428571,["x"]=-396308.85714286,}, + [11]={["y"]=-17263,["x"]=-396234.57142857,}, + [12]={["y"]=-17577.285714286,["x"]=-396640.28571429,}, + [13]={["y"]=-17614.428571429,["x"]=-397400.28571429,}, + [14]={["y"]=-19405.857142857,["x"]=-399428.85714286,}, + [15]={["y"]=-19234.428571429,["x"]=-399683.14285714,}, + [16]={["y"]=-18708.714285714,["x"]=-399408.85714286,}, + [17]={["y"]=-18397.285714286,["x"]=-399657.42857143,}, + [18]={["y"]=-17814.428571429,["x"]=-399823.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-18687,["x"]=-399380.28571429,}, + [2]={["y"]=-18620.714285714,["x"]=-399436.85714286,}, + [3]={["y"]=-16217.857142857,["x"]=-396596.85714286,}, + [4]={["y"]=-16300.142857143,["x"]=-396530,}, + [5]={["y"]=-18687,["x"]=-399380.85714286,}, + }, + [2] = { + [1]={["y"]=-18451.571428572,["x"]=-399580.57142857,}, + [2]={["y"]=-18392.142857143,["x"]=-399628.57142857,}, + [3]={["y"]=-16011,["x"]=-396806.85714286,}, + [4]={["y"]=-16074.714285714,["x"]=-396751.71428572,}, + [5]={["y"]=-18451.571428572,["x"]=-399580.85714285,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + McCarran = { + PointsBoundary = { + [1]={["y"]=-29455.285714286,["x"]=-416277.42857142,}, + [2]={["y"]=-28860.142857143,["x"]=-416492,}, + [3]={["y"]=-25044.428571429,["x"]=-416344.85714285,}, + [4]={["y"]=-24580.142857143,["x"]=-415959.14285714,}, + [5]={["y"]=-25073,["x"]=-415630.57142857,}, + [6]={["y"]=-25087.285714286,["x"]=-415130.57142857,}, + [7]={["y"]=-25830.142857143,["x"]=-414866.28571428,}, + [8]={["y"]=-26658.714285715,["x"]=-414880.57142857,}, + [9]={["y"]=-26973,["x"]=-415273.42857142,}, + [10]={["y"]=-27380.142857143,["x"]=-415187.71428571,}, + [11]={["y"]=-27715.857142857,["x"]=-414144.85714285,}, + [12]={["y"]=-27551.571428572,["x"]=-413473.42857142,}, + [13]={["y"]=-28630.142857143,["x"]=-413201.99999999,}, + [14]={["y"]=-29494.428571429,["x"]=-415437.71428571,}, + [15]={["y"]=-29455.571428572,["x"]=-416277.71428571,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-29408.428571429,["x"]=-416016.28571428,}, + [2]={["y"]=-29408.142857144,["x"]=-416105.42857142,}, + [3]={["y"]=-24680.714285715,["x"]=-416003.14285713,}, + [4]={["y"]=-24681.857142858,["x"]=-415926.57142856,}, + [5]={["y"]=-29408.42857143,["x"]=-416016.57142856,}, + }, + [2] = { + [1]={["y"]=-28575.571428572,["x"]=-416303.14285713,}, + [2]={["y"]=-28575.571428572,["x"]=-416382.57142856,}, + [3]={["y"]=-25111.000000001,["x"]=-416309.7142857,}, + [4]={["y"]=-25111.000000001,["x"]=-416249.14285713,}, + [5]={["y"]=-28575.571428572,["x"]=-416303.7142857,}, + }, + [3] = { + [1]={["y"]=-29331.000000001,["x"]=-416275.42857141,}, + [2]={["y"]=-29259.000000001,["x"]=-416306.85714284,}, + [3]={["y"]=-28005.571428572,["x"]=-413449.7142857,}, + [4]={["y"]=-28068.714285715,["x"]=-413422.85714284,}, + [5]={["y"]=-29331.000000001,["x"]=-416275.7142857,}, + }, + [4] = { + [1]={["y"]=-29073.285714286,["x"]=-416386.57142856,}, + [2]={["y"]=-28997.285714286,["x"]=-416417.42857141,}, + [3]={["y"]=-27697.571428572,["x"]=-413464.57142856,}, + [4]={["y"]=-27767.857142858,["x"]=-413434.28571427,}, + [5]={["y"]=-29073.000000001,["x"]=-416386.85714284,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Creech = { + PointsBoundary = { + [1]={["y"]=-74522.714285715,["x"]=-360887.99999998,}, + [2]={["y"]=-74197,["x"]=-360556.57142855,}, + [3]={["y"]=-74402.714285715,["x"]=-359639.42857141,}, + [4]={["y"]=-74637,["x"]=-359279.42857141,}, + [5]={["y"]=-75759.857142857,["x"]=-359005.14285712,}, + [6]={["y"]=-75834.142857143,["x"]=-359045.14285712,}, + [7]={["y"]=-75902.714285714,["x"]=-359782.28571427,}, + [8]={["y"]=-76099.857142857,["x"]=-360399.42857141,}, + [9]={["y"]=-77314.142857143,["x"]=-360219.42857141,}, + [10]={["y"]=-77728.428571429,["x"]=-360445.14285713,}, + [11]={["y"]=-77585.571428571,["x"]=-360585.14285713,}, + [12]={["y"]=-76471.285714286,["x"]=-360819.42857141,}, + [13]={["y"]=-76325.571428571,["x"]=-360942.28571427,}, + [14]={["y"]=-74671.857142857,["x"]=-360927.7142857,}, + [15]={["y"]=-74522.714285714,["x"]=-360888.85714284,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-74237.571428571,["x"]=-360591.7142857,}, + [2]={["y"]=-74234.428571429,["x"]=-360493.71428571,}, + [3]={["y"]=-77605.285714286,["x"]=-360399.14285713,}, + [4]={["y"]=-77608.714285715,["x"]=-360498.85714285,}, + [5]={["y"]=-74237.857142857,["x"]=-360591.7142857,}, + }, + [2] = { + [1]={["y"]=-75807.571428572,["x"]=-359073.42857142,}, + [2]={["y"]=-74770.142857144,["x"]=-360581.71428571,}, + [3]={["y"]=-74641.285714287,["x"]=-360585.42857142,}, + [4]={["y"]=-75734.142857144,["x"]=-359023.14285714,}, + [5]={["y"]=-75807.285714287,["x"]=-359073.42857142,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + GroomLake = { + PointsBoundary = { + [1]={["y"]=-88916.714285714,["x"]=-289102.28571425,}, + [2]={["y"]=-87023.571428572,["x"]=-290388.57142857,}, + [3]={["y"]=-85916.428571429,["x"]=-290674.28571428,}, + [4]={["y"]=-87645.000000001,["x"]=-286567.14285714,}, + [5]={["y"]=-88380.714285715,["x"]=-286388.57142857,}, + [6]={["y"]=-89670.714285715,["x"]=-283524.28571428,}, + [7]={["y"]=-89797.857142858,["x"]=-283567.14285714,}, + [8]={["y"]=-88635.000000001,["x"]=-286749.99999999,}, + [9]={["y"]=-89177.857142858,["x"]=-287207.14285714,}, + [10]={["y"]=-89092.142857144,["x"]=-288892.85714285,}, + [11]={["y"]=-88917.000000001,["x"]=-289102.85714285,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-86039.000000001,["x"]=-290606.28571428,}, + [2]={["y"]=-85965.285714287,["x"]=-290573.99999999,}, + [3]={["y"]=-87692.714285715,["x"]=-286634.85714285,}, + [4]={["y"]=-87756.714285715,["x"]=-286663.99999999,}, + [5]={["y"]=-86038.714285715,["x"]=-290606.85714285,}, + }, + [2] = { + [1]={["y"]=-86808.428571429,["x"]=-290375.7142857,}, + [2]={["y"]=-86732.714285715,["x"]=-290344.28571427,}, + [3]={["y"]=-89672.714285714,["x"]=-283546.57142855,}, + [4]={["y"]=-89772.142857143,["x"]=-283587.71428569,}, + [5]={["y"]=-86808.142857143,["x"]=-290375.7142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + }, +} + +--- Creates a new AIRBASEPOLICE_NEVADA object. +-- @param #AIRBASEPOLICE_NEVADA self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @return #AIRBASEPOLICE_NEVADA self +function AIRBASEPOLICE_NEVADA:New( SetClient ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + +-- -- Nellis +-- local NellisBoundary = GROUP:FindByName( "Nellis Boundary" ) +-- self.Airbases.Nellis.ZoneBoundary = ZONE_POLYGON:New( "Nellis Boundary", NellisBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local NellisRunway1 = GROUP:FindByName( "Nellis Runway 1" ) +-- self.Airbases.Nellis.ZoneRunways[1] = ZONE_POLYGON:New( "Nellis Runway 1", NellisRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local NellisRunway2 = GROUP:FindByName( "Nellis Runway 2" ) +-- self.Airbases.Nellis.ZoneRunways[2] = ZONE_POLYGON:New( "Nellis Runway 2", NellisRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- McCarran +-- local McCarranBoundary = GROUP:FindByName( "McCarran Boundary" ) +-- self.Airbases.McCarran.ZoneBoundary = ZONE_POLYGON:New( "McCarran Boundary", McCarranBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local McCarranRunway1 = GROUP:FindByName( "McCarran Runway 1" ) +-- self.Airbases.McCarran.ZoneRunways[1] = ZONE_POLYGON:New( "McCarran Runway 1", McCarranRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway2 = GROUP:FindByName( "McCarran Runway 2" ) +-- self.Airbases.McCarran.ZoneRunways[2] = ZONE_POLYGON:New( "McCarran Runway 2", McCarranRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway3 = GROUP:FindByName( "McCarran Runway 3" ) +-- self.Airbases.McCarran.ZoneRunways[3] = ZONE_POLYGON:New( "McCarran Runway 3", McCarranRunway3 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway4 = GROUP:FindByName( "McCarran Runway 4" ) +-- self.Airbases.McCarran.ZoneRunways[4] = ZONE_POLYGON:New( "McCarran Runway 4", McCarranRunway4 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- Creech +-- local CreechBoundary = GROUP:FindByName( "Creech Boundary" ) +-- self.Airbases.Creech.ZoneBoundary = ZONE_POLYGON:New( "Creech Boundary", CreechBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local CreechRunway1 = GROUP:FindByName( "Creech Runway 1" ) +-- self.Airbases.Creech.ZoneRunways[1] = ZONE_POLYGON:New( "Creech Runway 1", CreechRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local CreechRunway2 = GROUP:FindByName( "Creech Runway 2" ) +-- self.Airbases.Creech.ZoneRunways[2] = ZONE_POLYGON:New( "Creech Runway 2", CreechRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- Groom Lake +-- local GroomLakeBoundary = GROUP:FindByName( "GroomLake Boundary" ) +-- self.Airbases.GroomLake.ZoneBoundary = ZONE_POLYGON:New( "GroomLake Boundary", GroomLakeBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local GroomLakeRunway1 = GROUP:FindByName( "GroomLake Runway 1" ) +-- self.Airbases.GroomLake.ZoneRunways[1] = ZONE_POLYGON:New( "GroomLake Runway 1", GroomLakeRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local GroomLakeRunway2 = GROUP:FindByName( "GroomLake Runway 2" ) +-- self.Airbases.GroomLake.ZoneRunways[2] = ZONE_POLYGON:New( "GroomLake Runway 2", GroomLakeRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + +end + + + + + + --- **Functional** - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods. +-- +-- ![Banner Image](..\Presentations\DETECTION\Dia1.JPG) +-- +-- === +-- +-- DETECTION classes facilitate the detection of enemy units within the battle zone executed by FACs (Forward Air Controllers) or RECCEs (Reconnassance Units). +-- DETECTION uses the in-built detection capabilities of DCS World, but adds new functionalities. +-- +-- Please watch this [youtube video](https://youtu.be/C7p81dUwP-E) that explains the detection concepts. +-- +-- +-- ### Contributions: +-- +-- * Mechanist : Early concept of DETECTION_AREAS. +-- +-- ### Authors: +-- +-- * FlightControl : Analysis, Design, Programming, Testing +-- +-- @module Detection + + +do -- DETECTION_BASE + + --- # 1) DETECTION_BASE class, extends @{Fsm#FSM} + -- + -- The DETECTION_BASE class defines the core functions to administer detected objects. + -- The DETECTION_BASE class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). + -- + -- ## 1.1) DETECTION_BASE constructor + -- + -- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. + -- + -- ## 1.2) DETECTION_BASE initialization + -- + -- By default, detection will return detected objects with all the detection sensors available. + -- However, you can ask how the objects were found with specific detection methods. + -- If you use one of the below methods, the detection will work with the detection method specified. + -- You can specify to apply multiple detection methods. + -- + -- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: + -- + -- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. + -- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. + -- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. + -- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. + -- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. + -- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. + -- + -- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list + -- + -- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later + -- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains + -- a SET_UNIT object that contains the detected units that belong to that group. + -- + -- Derived classes will apply different methods to group the detected units. + -- Examples are per area, per quadrant, per distance, per type. + -- See further the derived DETECTION classes on which grouping methods are currently supported. + -- + -- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: + -- + -- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. + -- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). + -- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + -- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. + -- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). + -- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). + -- + -- ## 1.4) Apply additional Filters to fine-tune the detected objects + -- + -- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. + -- That being said, the DCS World detection algorithm can sometimes be unrealistic. + -- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. + -- Additionally, trees and other obstacles are not accounted during the DCS World detection. + -- + -- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. + -- For electronic detection, this filtering is not applied, only for visually detected targets. + -- + -- The following additional filtering can be applied for visual filtering: + -- + -- * A probability factor per kilometer distance. + -- * A probability factor based on the alpha angle between the detected object and the unit detecting. + -- A detection from a higher altitude allows for better detection than when on the ground. + -- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + -- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. + -- + -- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. + -- Only when you experience unrealistic behaviour in your missions, these filters could be applied. + -- + -- ### 1.4.1 ) Distance visual detection probability + -- + -- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- + -- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! + -- + -- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. + -- + -- ### 1.4.2 ) Alpha Angle visual detection probability + -- + -- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- + -- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. + -- + -- ### 1.4.3 ) Cloudy Zones detection probability + -- + -- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- + -- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. + -- + -- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take + -- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. + -- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! + -- + -- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for + -- AI not to detect so easily targets within a forrest or village rich area. + -- + -- ## 1.5 ) Accept / Reject detected units + -- + -- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, + -- if it is located in range or located inside or outside of specific zones. + -- + -- ### 1.5.1 ) Detection acceptance of within range limit + -- + -- A range can be set that will limit a successful detection for a unit. + -- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units if the range is below 5000 meters. + -- Detection:SetAcceptRange( 5000 ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- + -- ### 1.5.2 ) Detection acceptance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be accepted. + -- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) + -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. + -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ### 1.5.3 ) Detection rejectance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. + -- An example of how to use the method is shown below. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be rejected. + -- local ZoneReject1 = ZONE:New( "RejectZone1" ) + -- local ZoneReject2 = ZONE:New( "RejectZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. + -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ## 1.6) DETECTION_BASE is a Finite State Machine + -- + -- Various Events and State Transitions can be tailored using DETECTION_BASE. + -- + -- ### 1.6.1) DETECTION_BASE States + -- + -- * **Detecting**: The detection is running. + -- * **Stopped**: The detection is stopped. + -- + -- ### 1.6.2) DETECTION_BASE Events + -- + -- * **Start**: Start the detection process. + -- * **Detect**: Detect new units. + -- * **Detected**: New units have been detected. + -- * **Stop**: Stop the detection process. + -- + -- @type DETECTION_BASE + -- @field Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are accepted to be detected. + -- @field #DETECTION_BASE.DetectedObjects DetectedObjects The list of detected objects. + -- @field #table DetectedObjectsIdentified Map of the DetectedObjects identified. + -- @field #number DetectionRun + -- @extends Core.Fsm#FSM + DETECTION_BASE = { + ClassName = "DETECTION_BASE", + DetectionSetGroup = nil, + DetectionRange = nil, + DetectedObjects = {}, + DetectionRun = 0, + DetectedObjectsIdentified = {}, + DetectedItems = {}, + } + + --- @type DETECTION_BASE.DetectedObjects + -- @list <#DETECTION_BASE.DetectedObject> + + --- @type DETECTION_BASE.DetectedObject + -- @field #string Name + -- @field #boolean Visible + -- @field #string Type + -- @field #number Distance + -- @field #boolean Identified + + --- @type DETECTION_BASE.DetectedItems + -- @list <#DETECTION_BASE.DetectedItem> + + --- @type DETECTION_BASE.DetectedItem + -- @field Core.Set#SET_UNIT Set + -- @field Core.Set#SET_UNIT Set -- The Set of Units in the detected area. + -- @field Core.Zone#ZONE_UNIT Zone -- The Zone of the detected area. + -- @field #boolean Changed Documents if the detected area has changes. + -- @field #table Changes A list of the changes reported on the detected area. (It is up to the user of the detected area to consume those changes). + -- @field #number ItemID -- The identifier of the detected area. + -- @field #boolean FriendliesNearBy Indicates if there are friendlies within the detected area. + -- @field Wrapper.Unit#UNIT NearestFAC The nearest FAC near the Area. + + + --- DETECTION constructor. + -- @param #DETECTION_BASE self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @return #DETECTION_BASE self + function DETECTION_BASE:New( DetectionSetGroup ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_BASE + + self.DetectedItemCount = 0 + self.DetectedItemMax = 0 + self.DetectedItems = {} + + self.DetectionSetGroup = DetectionSetGroup + + self.DetectionInterval = 30 + + self:InitDetectVisual( true ) + self:InitDetectOptical( false ) + self:InitDetectRadar( false ) + self:InitDetectRWR( false ) + self:InitDetectIRST( false ) + self:InitDetectDLINK( false ) + + -- Create FSM transitions. + + self:SetStartState( "Stopped" ) + self.CountryID = DetectionSetGroup:GetFirst():GetCountry() + + self:AddTransition( "Stopped", "Start", "Detecting") + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnLeaveStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnEnterStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Start. + -- @function [parent=#DETECTION_BASE] OnBeforeStart + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Start. + -- @function [parent=#DETECTION_BASE] OnAfterStart + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Start. + -- @function [parent=#DETECTION_BASE] Start + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Start. + -- @function [parent=#DETECTION_BASE] __Start + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Detecting. + -- @function [parent=#DETECTION_BASE] OnLeaveDetecting + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Detecting. + -- @function [parent=#DETECTION_BASE] OnEnterDetecting + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + self:AddTransition( "Detecting", "Detect", "Detecting" ) + self:AddTransition( "Detecting", "DetectionGroup", "Detecting" ) + + --- OnBefore Transition Handler for Event Detect. + -- @function [parent=#DETECTION_BASE] OnBeforeDetect + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Detect. + -- @function [parent=#DETECTION_BASE] OnAfterDetect + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Detect. + -- @function [parent=#DETECTION_BASE] Detect + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Detect. + -- @function [parent=#DETECTION_BASE] __Detect + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Detecting", "Detected", "Detecting" ) + + --- OnBefore Transition Handler for Event Detected. + -- @function [parent=#DETECTION_BASE] OnBeforeDetected + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Detected. + -- @function [parent=#DETECTION_BASE] OnAfterDetected + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Detected. + -- @function [parent=#DETECTION_BASE] Detected + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Detected. + -- @function [parent=#DETECTION_BASE] __Detected + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "*", "Stop", "Stopped" ) + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#DETECTION_BASE] OnBeforeStop + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#DETECTION_BASE] OnAfterStop + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#DETECTION_BASE] Stop + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#DETECTION_BASE] __Stop + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnLeaveStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnEnterStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + return self + end + + do -- State Transition Handling + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function DETECTION_BASE:onafterStart(From,Event,To) + self:__Detect(0.1) + end + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function DETECTION_BASE:onafterDetect(From,Event,To) + self:E( {From,Event,To}) + + local DetectDelay = 0.1 + self.DetectionCount = 0 + self.DetectionRun = 0 + self:UnIdentifyAllDetectedObjects() -- Resets the DetectedObjectsIdentified table + + self.DetectionSetGroup:Flush() + + for DetectionGroupID, DetectionGroupData in pairs( self.DetectionSetGroup:GetSet() ) do + self:E( {DetectionGroupData}) + self:__DetectionGroup( DetectDelay, DetectionGroupData ) -- Process each detection asynchronously. + self.DetectionCount = self.DetectionCount + 1 + DetectDelay = DetectDelay + 0.1 + end + end + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @param Wrapper.Group#GROUP DetectionGroup The Group detecting. + function DETECTION_BASE:onafterDetectionGroup( From, Event, To, DetectionGroup ) + self:E( {From,Event,To}) + + self.DetectionRun = self.DetectionRun + 1 + + local HasDetectedObjects = false + + if DetectionGroup:IsAlive() then + + self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } ) + + local DetectionGroupName = DetectionGroup:GetName() + + local DetectedUnits = {} + + local DetectedTargets = DetectionGroup:GetDetectedTargets( + self.DetectVisual, + self.DetectOptical, + self.DetectRadar, + self.DetectIRST, + self.DetectRWR, + self.DetectDLINK + ) + + self:T( DetectedTargets ) + + for DetectionObjectID, Detection in pairs( DetectedTargets ) do + local DetectedObject = Detection.object -- Dcs.DCSWrapper.Object#Object + self:T2( DetectedObject ) + + if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then + + local DetectionAccepted = true + + local DetectedObjectName = DetectedObject:getName() + + local DetectedObjectVec3 = DetectedObject:getPoint() + local DetectedObjectVec2 = { x = DetectedObjectVec3.x, y = DetectedObjectVec3.z } + local DetectionGroupVec3 = DetectionGroup:GetVec3() + local DetectionGroupVec2 = { x = DetectionGroupVec3.x, y = DetectionGroupVec3.z } + + local Distance = ( ( DetectedObjectVec3.x - DetectionGroupVec3.x )^2 + + ( DetectedObjectVec3.y - DetectionGroupVec3.y )^2 + + ( DetectedObjectVec3.z - DetectionGroupVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { "Detected Target", DetectionGroupName, DetectedObjectName, Distance } ) + + -- Calculate Acceptance + + if self.AcceptRange and Distance > self.AcceptRange then + DetectionAccepted = false + end + + if self.AcceptZones then + for AcceptZoneID, AcceptZone in pairs( self.AcceptZones ) do + local AcceptZone = AcceptZone -- Core.Zone#ZONE_BASE + if AcceptZone:IsPointVec2InZone( DetectedObjectVec2 ) == false then + DetectionAccepted = false + end + end + end + + if self.RejectZones then + for RejectZoneID, RejectZone in pairs( self.RejectZones ) do + local RejectZone = RejectZone -- Core.Zone#ZONE_BASE + if RejectZone:IsPointVec2InZone( DetectedObjectVec2 ) == true then + DetectionAccepted = false + end + end + end + + -- Calculate additional probabilities + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.DistanceProbability then + local DistanceFactor = Distance / 4 + local DistanceProbabilityReversed = ( 1 - self.DistanceProbability ) * DistanceFactor + local DistanceProbability = 1 - DistanceProbabilityReversed + DistanceProbability = DistanceProbability * 30 / 300 + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, DistanceProbability } ) + if Probability > DistanceProbability then + DetectionAccepted = false + end + end + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.AlphaAngleProbability then + local NormalVec2 = { x = DetectedObjectVec2.x - DetectionGroupVec2.x, y = DetectedObjectVec2.y - DetectionGroupVec2.y } + local AlphaAngle = math.atan2( NormalVec2.y, NormalVec2.x ) + local Sinus = math.sin( AlphaAngle ) + local AlphaAngleProbabilityReversed = ( 1 - self.AlphaAngleProbability ) * ( 1 - Sinus ) + local AlphaAngleProbability = 1 - AlphaAngleProbabilityReversed + + AlphaAngleProbability = AlphaAngleProbability * 30 / 300 + + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, AlphaAngleProbability } ) + if Probability > AlphaAngleProbability then + DetectionAccepted = false + end + + end + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.ZoneProbability then + + for ZoneDataID, ZoneData in pairs( self.ZoneProbability ) do + self:E({ZoneData}) + local ZoneObject = ZoneData[1] -- Core.Zone#ZONE_BASE + local ZoneProbability = ZoneData[2] -- #number + ZoneProbability = ZoneProbability * 30 / 300 + + if ZoneObject:IsPointVec2InZone( DetectedObjectVec2 ) == true then + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, ZoneProbability } ) + if Probability > ZoneProbability then + DetectionAccepted = false + break + end + end + end + end + + if DetectionAccepted then + + HasDetectedObjects = true + + if not self.DetectedObjects[DetectedObjectName] then + self.DetectedObjects[DetectedObjectName] = {} + end + self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName + self.DetectedObjects[DetectedObjectName].Visible = Detection.visible + self.DetectedObjects[DetectedObjectName].Type = Detection.type + self.DetectedObjects[DetectedObjectName].Distance = Distance + + local DetectedUnit = UNIT:FindByName( DetectedObjectName ) + + DetectedUnits[DetectedObjectName] = DetectedUnit + else + -- if beyond the DetectionRange then nullify... + if self.DetectedObjects[DetectedObjectName] then + self.DetectedObjects[DetectedObjectName] = nil + end + end + end + + self:T2( self.DetectedObjects ) + end + + if HasDetectedObjects then + self:__Detected( 0.1, DetectedUnits ) + end + + end + + if self.DetectionCount > 0 and self.DetectionRun == self.DetectionCount then + self:__Detect( self.DetectionInterval ) + + self:T( "--> Create Detection Sets" ) + self:CreateDetectionSets() + end + + end + + + end + + do -- Initialization methods + + --- Detect Visual. + -- @param #DETECTION_BASE self + -- @param #boolean DetectVisual + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectVisual( DetectVisual ) + + self.DetectVisual = DetectVisual + end + + --- Detect Optical. + -- @param #DETECTION_BASE self + -- @param #boolean DetectOptical + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectOptical( DetectOptical ) + self:F2() + + self.DetectOptical = DetectOptical + end + + --- Detect Radar. + -- @param #DETECTION_BASE self + -- @param #boolean DetectRadar + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectRadar( DetectRadar ) + self:F2() + + self.DetectRadar = DetectRadar + end + + --- Detect IRST. + -- @param #DETECTION_BASE self + -- @param #boolean DetectIRST + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectIRST( DetectIRST ) + self:F2() + + self.DetectIRST = DetectIRST + end + + --- Detect RWR. + -- @param #DETECTION_BASE self + -- @param #boolean DetectRWR + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectRWR( DetectRWR ) + self:F2() + + self.DetectRWR = DetectRWR + end + + --- Detect DLINK. + -- @param #DETECTION_BASE self + -- @param #boolean DetectDLINK + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectDLINK( DetectDLINK ) + self:F2() + + self.DetectDLINK = DetectDLINK + end + + end + + do + + --- Set the detection interval time in seconds. + -- @param #DETECTION_BASE self + -- @param #number DetectionInterval Interval in seconds. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetDetectionInterval( DetectionInterval ) + self:F2() + + self.DetectionInterval = DetectionInterval + + return self + end + + end + + do -- Accept / Reject detected units + + --- Accept detections if within a range in meters. + -- @param #DETECTION_BASE self + -- @param #number AcceptRange Accept a detection if the unit is within the AcceptRange in meters. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAcceptRange( AcceptRange ) + self:F2() + + self.AcceptRange = AcceptRange + + return self + end + + --- Accept detections if within the specified zone(s). + -- @param #DETECTION_BASE self + -- @param AcceptZones Can be a list or ZONE_BASE objects, or a single ZONE_BASE object. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAcceptZones( AcceptZones ) + self:F2() + + if type( AcceptZones ) == "table" then + self.AcceptZones = AcceptZones + else + self.AcceptZones = { AcceptZones } + end + + return self + end + + --- Reject detections if within the specified zone(s). + -- @param #DETECTION_BASE self + -- @param RejectZones Can be a list or ZONE_BASE objects, or a single ZONE_BASE object. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetRejectZones( RejectZones ) + self:F2() + + if type( RejectZones ) == "table" then + self.RejectZones = RejectZones + else + self.RejectZones = { RejectZones } + end + + return self + end + + end + + do -- Probability methods + + --- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- @param #DETECTION_BASE self + -- @param DistanceProbability The probability factor. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetDistanceProbability( DistanceProbability ) + self:F2() + + self.DistanceProbability = DistanceProbability + + return self + end + + + --- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- @param #DETECTION_BASE self + -- @param AlphaAngleProbability The probability factor. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAlphaAngleProbability( AlphaAngleProbability ) + self:F2() + + self.AlphaAngleProbability = AlphaAngleProbability + + return self + end + + --- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- @param #DETECTION_BASE self + -- @param ZoneArray Aray of a The ZONE_BASE object and a ZoneProbability pair.. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetZoneProbability( ZoneArray ) + self:F2() + + self.ZoneProbability = ZoneArray + + return self + end + + + end + + do -- Change processing + + --- Accepts changes from the detected item. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #DETECTION_BASE self + function DETECTION_BASE:AcceptChanges( DetectedItem ) + + DetectedItem.Changed = false + DetectedItem.Changes = {} + + return self + end + + --- Add a change to the detected zone. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @param #string ChangeCode + -- @return #DETECTION_BASE self + function DETECTION_BASE:AddChangeItem( DetectedItem, ChangeCode, ItemUnitType ) + + DetectedItem.Changed = true + local ItemID = DetectedItem.ItemID + + DetectedItem.Changes = DetectedItem.Changes or {} + DetectedItem.Changes[ChangeCode] = DetectedItem.Changes[ChangeCode] or {} + DetectedItem.Changes[ChangeCode].ItemID = ItemID + DetectedItem.Changes[ChangeCode].ItemUnitType = ItemUnitType + + self:T( { "Change on Detection Item:", DetectedItem.ItemID, ChangeCode, ItemUnitType } ) + + return self + end + + + --- Add a change to the detected zone. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @param #string ChangeCode + -- @param #string ChangeUnitType + -- @return #DETECTION_BASE self + function DETECTION_BASE:AddChangeUnit( DetectedItem, ChangeCode, ChangeUnitType ) + + DetectedItem.Changed = true + local ItemID = DetectedItem.ItemID + + DetectedItem.Changes = DetectedItem.Changes or {} + DetectedItem.Changes[ChangeCode] = DetectedItem.Changes[ChangeCode] or {} + DetectedItem.Changes[ChangeCode][ChangeUnitType] = DetectedItem.Changes[ChangeCode][ChangeUnitType] or 0 + DetectedItem.Changes[ChangeCode][ChangeUnitType] = DetectedItem.Changes[ChangeCode][ChangeUnitType] + 1 + DetectedItem.Changes[ChangeCode].ItemID = ItemID + + self:T( { "Change on Detection Item:", DetectedItem.ItemID, ChangeCode, ChangeUnitType } ) + + return self + end + + + end + + do -- Threat + + --- Returns if there are friendlies nearby the FAC units ... + -- @param #DETECTION_BASE self + -- @return #boolean trhe if there are friendlies nearby + function DETECTION_BASE:IsFriendliesNearBy( DetectedItem ) + + self:T3( DetectedItem.FriendliesNearBy ) + return DetectedItem.FriendliesNearBy or false + end + + --- Background worker function to determine if there are friendlies nearby ... + -- @param #DETECTION_BASE self + function DETECTION_BASE:ReportFriendliesNearBy( ReportGroupData ) + self:F2() + + local DetectedItem = ReportGroupData.DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = ReportGroupData.DetectedItem.Set + local DetectedUnit = DetectedSet:GetFirst() + + DetectedItem.FriendliesNearBy = false + + if DetectedUnit then + + + local SphereSearch = { + id = world.VolumeType.SPHERE, + params = { + point = DetectedUnit:GetVec3(), + radius = 6000, + } + + } + + --- @param Dcs.DCSWrapper.Unit#Unit FoundDCSUnit + -- @param Wrapper.Group#GROUP ReportGroup + -- @param Set#SET_GROUP ReportSetGroup + local FindNearByFriendlies = function( FoundDCSUnit, ReportGroupData ) + + local DetectedItem = ReportGroupData.DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = ReportGroupData.DetectedItem.Set + local DetectedUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT + local ReportSetGroup = ReportGroupData.ReportSetGroup + + local EnemyCoalition = DetectedUnit:GetCoalition() + + local FoundUnitCoalition = FoundDCSUnit:getCoalition() + local FoundUnitName = FoundDCSUnit:getName() + local FoundUnitGroupName = FoundDCSUnit:getGroup():getName() + local EnemyUnitName = DetectedUnit:GetName() + local FoundUnitInReportSetGroup = ReportSetGroup:FindGroup( FoundUnitGroupName ) ~= nil + + self:T3( { "Friendlies search:", FoundUnitName, FoundUnitCoalition, EnemyUnitName, EnemyCoalition, FoundUnitInReportSetGroup } ) + + if FoundUnitCoalition ~= EnemyCoalition and FoundUnitInReportSetGroup == false then + DetectedItem.FriendliesNearBy = true + return false + end + + return true + end + + world.searchObjects( Object.Category.UNIT, SphereSearch, FindNearByFriendlies, ReportGroupData ) + end + end + + end + + --- Determines if a detected object has already been identified during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + -- @return #boolean true if already identified. + function DETECTION_BASE:IsDetectedObjectIdentified( DetectedObject ) + self:F3( DetectedObject.Name ) + + local DetectedObjectName = DetectedObject.Name + local DetectedObjectIdentified = self.DetectedObjectsIdentified[DetectedObjectName] == true + self:T3( DetectedObjectIdentified ) + return DetectedObjectIdentified + end + + --- Identifies a detected object during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + function DETECTION_BASE:IdentifyDetectedObject( DetectedObject ) + self:F( { "Identified:", DetectedObject.Name } ) + + local DetectedObjectName = DetectedObject.Name + self.DetectedObjectsIdentified[DetectedObjectName] = true + end + + --- UnIdentify a detected object during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + function DETECTION_BASE:UnIdentifyDetectedObject( DetectedObject ) + + local DetectedObjectName = DetectedObject.Name + self.DetectedObjectsIdentified[DetectedObjectName] = false + end + + --- UnIdentify all detected objects during detection processing. + -- @param #DETECTION_BASE self + function DETECTION_BASE:UnIdentifyAllDetectedObjects() + + self.DetectedObjectsIdentified = {} -- Table will be garbage collected. + end + + --- Gets a detected object with a given name. + -- @param #DETECTION_BASE self + -- @param #string ObjectName + -- @return #DETECTION_BASE.DetectedObject + function DETECTION_BASE:GetDetectedObject( ObjectName ) + self:F( ObjectName ) + + if ObjectName then + local DetectedObject = self.DetectedObjects[ObjectName] + + -- Only return detected objects that are alive! + local DetectedUnit = UNIT:FindByName( ObjectName ) + if DetectedUnit and DetectedUnit:IsAlive() then + if self:IsDetectedObjectIdentified( DetectedObject ) == false then + return DetectedObject + end + end + end + + return nil + end + + + --- Adds a new DetectedItem to the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #string DetectedItemIndex The index of the DetectedItem. + -- @param Core.Set#SET_UNIT Set (optional) The Set of Units to be added. + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:AddDetectedItem( DetectedItemIndex, Set ) + + local DetectedItem = {} + self.DetectedItemCount = self.DetectedItemCount + 1 + self.DetectedItemMax = self.DetectedItemMax + 1 + + if DetectedItemIndex then + self.DetectedItems[DetectedItemIndex] = DetectedItem + else + self.DetectedItems[self.DetectedItemCount] = DetectedItem + end + + DetectedItem.Set = Set or SET_UNIT:New() + DetectedItem.ItemID = self.DetectedItemMax + DetectedItem.Removed = false + + return DetectedItem + end + + --- Adds a new DetectedItem to the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #string DetectedItemIndex The index of the DetectedItem. + -- @param Core.Set#SET_UNIT Set (optional) The Set of Units to be added. + -- @param Core.Zone#ZONE_UNIT Zone (optional) The Zone to be added where the Units are located. + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:AddDetectedItemZone( DetectedItemIndex, Set, Zone ) + + local DetectedItem = self:AddDetectedItem( DetectedItemIndex, Set ) + + DetectedItem.Zone = Zone + + return DetectedItem + end + + --- Removes an existing DetectedItem from the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #number DetectedItemIndex The index or position in the DetectedItems list where the item needs to be removed. + function DETECTION_BASE:RemoveDetectedItem( DetectedItemIndex ) + + self.DetectedItemCount = self.DetectedItemCount - 1 + self.DetectedItems[DetectedItemIndex] = nil + end + + + --- Get the detected @{Set#SET_BASE}s. + -- @param #DETECTION_BASE self + -- @return #DETECTION_BASE.DetectedItems + function DETECTION_BASE:GetDetectedItems() + + return self.DetectedItems + end + + --- Get the amount of SETs with detected objects. + -- @param #DETECTION_BASE self + -- @return #number Count + function DETECTION_BASE:GetDetectedItemsCount() + + local DetectedCount = self.DetectedItemCount + return DetectedCount + end + + --- Get a detected item using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:GetDetectedItem( Index ) + + local DetectedItem = self.DetectedItems[Index] + if DetectedItem then + return DetectedItem + end + + return nil + end + + --- Get the @{Set#SET_UNIT} of a detecttion area using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return Core.Set#SET_UNIT DetectedSet + function DETECTION_BASE:GetDetectedSet( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + local DetectedSetUnit = DetectedItem.Set + if DetectedSetUnit then + return DetectedSetUnit + end + + return nil + end + + do -- Zones + + --- Get the @{Zone#ZONE_UNIT} of a detection area using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return Core.Zone#ZONE_UNIT DetectedZone + function DETECTION_BASE:GetDetectedZone( Index ) + + local DetectedZone = self.DetectedItems[Index].Zone + if DetectedZone then + return DetectedZone + end + + return nil + end + + end + + + --- Report summary of a detected item using a given numeric index. + -- @param #DETECTION_BASE self + -- @param Index + -- @return #string + function DETECTION_BASE:DetectedItemReportSummary( Index ) + self:F( Index ) + return nil + end + + --- Report detailed of a detectedion result. + -- @param #DETECTION_BASE self + -- @return #string + function DETECTION_BASE:DetectedReportDetailed() + self:F() + return nil + end + + --- Get the detection Groups. + -- @param #DETECTION_BASE self + -- @return Wrapper.Group#GROUP + function DETECTION_BASE:GetDetectionSetGroup() + + local DetectionSetGroup = self.DetectionSetGroup + return DetectionSetGroup + end + + --- Make a DetectionSet table. This function will be overridden in the derived clsses. + -- @param #DETECTION_BASE self + -- @return #DETECTION_BASE self + function DETECTION_BASE:CreateDetectionSets() + self:F2() + + self:E( "Error, in DETECTION_BASE class..." ) + + end + + + --- Schedule the DETECTION construction. + -- @param #DETECTION_BASE self + -- @param #number DelayTime The delay in seconds to wait the reporting. + -- @param #number RepeatInterval The repeat interval in seconds for the reporting to happen repeatedly. + -- @return #DETECTION_BASE self + function DETECTION_BASE:Schedule( DelayTime, RepeatInterval ) + self:F2() + + self.ScheduleDelayTime = DelayTime + self.ScheduleRepeatInterval = RepeatInterval + + self.DetectionScheduler = SCHEDULER:New( self, self._DetectionScheduler, { self, "Detection" }, DelayTime, RepeatInterval ) + return self + end + +end + +do -- DETECTION_UNITS + + --- # 2) DETECTION_UNITS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_UNITS class will detect units within the battle zone. + -- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of units detected is large, the DetectedItems list will be large also. + -- + -- @type DETECTION_UNITS + -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are detected. + -- @extends #DETECTION_BASE + DETECTION_UNITS = { + ClassName = "DETECTION_UNITS", + DetectionRange = nil, + } + + --- DETECTION_UNITS constructor. + -- @param Functional.Detection#DETECTION_UNITS self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @return Functional.Detection#DETECTION_UNITS self + function DETECTION_UNITS:New( DetectionSetGroup ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) -- #DETECTION_UNITS + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_UNITS self + -- @param #DETECTION_UNITS.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_UNITS:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " New target(s) detected: " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " Invisible or destroyed target(s): " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Create the DetectedItems list from the DetectedObjects table. + -- For each DetectedItem, a one field array is created containing the Unit detected. + -- @param #DETECTION_UNITS self + -- @return #DETECTION_UNITS self + function DETECTION_UNITS:CreateDetectionSets() + self:F2( #self.DetectedObjects ) + + -- Loop the current detected items, and check if each object still exists and is detected. + + for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do + + local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT + local DetectedTypeName = DetectedItem.Type + + for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + + local DetectedObject = nil + self:E( DetectedUnit ) + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Yes, the DetectedUnit is still detected or exists. Flag as identified. + self:IdentifyDetectedObject( DetectedObject ) + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) + DetectedItemSet:Remove( DetectedUnitName ) + end + end + end + + + -- Now we need to loop through the unidentified detected units and add these... These are all new items. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + if DetectedObject then + self:T( { "Detected Unit #", DetectedUnitName } ) + + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + if DetectedUnit then + local DetectedTypeName = DetectedUnit:GetTypeName() + local DetectedItem = self:GetDetectedItem( DetectedUnitName ) + if not DetectedItem then + self:T( "Added new DetectedItem" ) + DetectedItem = self:AddDetectedItem( DetectedUnitName ) + DetectedItem.Type = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObjectData.Name + DetectedItem.Visible = DetectedObjectData.Visible + DetectedItem.Distance = DetectedObjectData.Distance + end + + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeUnit( DetectedItem, "AU", DetectedTypeName ) + end + end + end + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + --self:NearestFAC( DetectedItem ) + end + + end + + --- Report summary of a DetectedItem using a given numeric index. + -- @param #DETECTION_UNITS self + -- @param Index + -- @return #string + function DETECTION_UNITS:DetectedItemReportSummary( Index ) + self:F( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + local DetectedSet = self:GetDetectedSet( Index ) + + self:T( DetectedSet ) + if DetectedSet then + local ReportSummary = "" + local UnitDistanceText = "" + local UnitCategoryText = "" + + local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT + + if DetectedItemUnit and DetectedItemUnit:IsAlive() then + self:T(DetectedItemUnit) + + local UnitCategoryName = DetectedItemUnit:GetCategoryName() or "" + local UnitCategoryType = DetectedItemUnit:GetTypeName() or "" + + if DetectedItem.Type and UnitCategoryName and UnitCategoryType then + UnitCategoryText = UnitCategoryName .. " (" .. UnitCategoryType .. ") at " + else + UnitCategoryText = "Unknown target at " + end + + if DetectedItem.Visible == false then + UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " estimated km" + else + UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, visual contact" + end + + local DetectedItemPointVec3 = DetectedItemUnit:GetPointVec3() + local DetectedItemPointLL = DetectedItemPointVec3:ToStringLL( 3, true ) + + local ThreatLevelA2G = DetectedItemUnit:GetThreatLevel( DetectedItem ) + + ReportSummary = string.format( + "%s - Threat [%s] (%2d) - %s%s", + DetectedItemPointLL, + string.rep( "â– ", ThreatLevelA2G ), + ThreatLevelA2G, + UnitCategoryText, + UnitDistanceText + ) + end + + self:T( ReportSummary ) + + return ReportSummary + end + end + + --- Report detailed of a detection result. + -- @param #DETECTION_UNITS self + -- @return #string + function DETECTION_UNITS:DetectedReportDetailed() + self:F() + + local Report = REPORT:New( "Detected units:" ) + for DetectedItemID, DetectedItem in ipairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemID ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + +end + +do -- DETECTION_TYPES + + --- # 3) DETECTION_TYPES class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_TYPES class will detect units within the battle zone. + -- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. + -- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. + -- + -- @type DETECTION_TYPES + -- @extends #DETECTION_BASE + DETECTION_TYPES = { + ClassName = "DETECTION_TYPES", + DetectionRange = nil, + } + + --- DETECTION_TYPES constructor. + -- @param Functional.Detection#DETECTION_TYPES self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Recce role. + -- @return Functional.Detection#DETECTION_TYPES self + function DETECTION_TYPES:New( DetectionSetGroup ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) -- #DETECTION_TYPES + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_TYPES self + -- @param #DETECTION_TYPES.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_TYPES:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " New target(s) detected: " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " Invisible or destroyed target(s): " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Create the DetectedItems list from the DetectedObjects table. + -- For each DetectedItem, a one field array is created containing the Unit detected. + -- @param #DETECTION_TYPES self + -- @return #DETECTION_TYPES self + function DETECTION_TYPES:CreateDetectionSets() + self:F2( #self.DetectedObjects ) + + -- Loop the current detected items, and check if each object still exists and is detected. + + for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do + + local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT + local DetectedTypeName = DetectedItem.Type + + for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + + local DetectedObject = nil + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Yes, the DetectedUnit is still detected or exists. Flag as identified. + self:IdentifyDetectedObject( DetectedObject ) + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) + DetectedItemSet:Remove( DetectedUnitName ) + end + end + end + + + -- Now we need to loop through the unidentified detected units and add these... These are all new items. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + if DetectedObject then + self:T( { "Detected Unit #", DetectedUnitName } ) + + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + if DetectedUnit then + local DetectedTypeName = DetectedUnit:GetTypeName() + local DetectedItem = self:GetDetectedItem( DetectedTypeName ) + if not DetectedItem then + DetectedItem = self:AddDetectedItem( DetectedTypeName ) + DetectedItem.Type = DetectedUnit:GetTypeName() + end + + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeUnit( DetectedItem, "AU", DetectedTypeName ) + end + end + end + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + --self:NearestFAC( DetectedItem ) + end + + end + + --- Report summary of a DetectedItem using a given numeric index. + -- @param #DETECTION_TYPES self + -- @param Index + -- @return #string + function DETECTION_TYPES:DetectedItemReportSummary( DetectedTypeName ) + self:F( DetectedTypeName ) + + local DetectedItem = self:GetDetectedItem( DetectedTypeName ) + local DetectedSet = self:GetDetectedSet( DetectedTypeName ) + + self:T( DetectedItem ) + if DetectedItem then + + local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G() + local DetectedItemsCount = DetectedSet:Count() + local DetectedItemType = DetectedItem.Type + + local ReportSummary = string.format( + "Threat [%s] (%2d) - %2d of %s", + string.rep( "â– ", ThreatLevelA2G ), + ThreatLevelA2G, + DetectedItemsCount, + DetectedItemType + ) + self:T( ReportSummary ) + + return ReportSummary + end + end + + --- Report detailed of a detection result. + -- @param #DETECTION_TYPES self + -- @return #string + function DETECTION_TYPES:DetectedReportDetailed() + self:F() + + local Report = REPORT:New( "Detected types:" ) + for DetectedItemTypeName, DetectedItem in pairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemTypeName ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + +end + + +do -- DETECTION_AREAS + + --- # 4) DETECTION_AREAS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_AREAS class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), + -- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. + -- The class is group the detected units within zones given a DetectedZoneRange parameter. + -- A set with multiple detected zones will be created as there are groups of units detected. + -- + -- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones + -- + -- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and + -- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. + -- + -- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. + -- + -- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). + -- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). + -- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. + -- + -- ## 4.4) Flare or Smoke detected units + -- + -- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. + -- + -- ## 4.5) Flare or Smoke or Bound detected zones + -- + -- Use the methods: + -- + -- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag + -- + -- the detected zones when a new detection has taken place. + -- + -- @type DETECTION_AREAS + -- @field Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. + -- @field #DETECTION_BASE.DetectedItems DetectedItems A list of areas containing the set of @{Unit}s, @{Zone}s, the center @{Unit} within the zone, and ID of each area that was detected within a DetectionZoneRange. + -- @extends #DETECTION_BASE + DETECTION_AREAS = { + ClassName = "DETECTION_AREAS", + DetectionZoneRange = nil, + } + + + --- DETECTION_AREAS constructor. + -- @param #DETECTION_AREAS self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @param Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. + -- @return #DETECTION_AREAS + function DETECTION_AREAS:New( DetectionSetGroup, DetectionZoneRange ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) + + self.DetectionZoneRange = DetectionZoneRange + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Report summary of a detected item using a given numeric index. + -- @param #DETECTION_AREAS self + -- @param Index + -- @return #string + function DETECTION_AREAS:DetectedItemReportSummary( Index ) + self:F( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + if DetectedItem then + local DetectedSet = self:GetDetectedSet( Index ) + local ReportSummaryItem + + local DetectedZone = self:GetDetectedZone( Index ) + local DetectedItemPointVec3 = DetectedZone:GetPointVec3() + local DetectedItemPointLL = DetectedItemPointVec3:ToStringLL( 3, true ) + + local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem ) + local DetectedItemsCount = DetectedSet:Count() + local DetectedItemsTypes = DetectedSet:GetTypeNames() + + local ReportSummary = string.format( + "%s - Threat [%s] (%2d) - %2d of %s", + DetectedItemPointLL, + string.rep( "â– ", ThreatLevelA2G ), + ThreatLevelA2G, + DetectedItemsCount, + DetectedItemsTypes + ) + + return ReportSummary + end + + return nil + end + + + --- Returns if there are friendlies nearby the FAC units ... + -- @param #DETECTION_AREAS self + -- @return #boolean trhe if there are friendlies nearby + function DETECTION_AREAS:IsFriendliesNearBy( DetectedItem ) + + self:T3( DetectedItem.FriendliesNearBy ) + return DetectedItem.FriendliesNearBy or false + end + + --- Calculate the maxium A2G threat level of the DetectedItem. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + function DETECTION_AREAS:CalculateThreatLevelA2G( DetectedItem ) + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( DetectedItem.Set:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + DetectedItem.MaxThreatLevelA2G = MaxThreatLevelA2G + + end + + --- Find the nearest FAC of the DetectedItem. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return Wrapper.Unit#UNIT The nearest FAC unit + function DETECTION_AREAS:NearestFAC( DetectedItem ) + + local NearestFAC = nil + local MinDistance = 1000000000 -- Units are not further than 1000000 km away from an area :-) + + for FACGroupName, FACGroupData in pairs( self.DetectionSetGroup:GetSet() ) do + for FACUnit, FACUnitData in pairs( FACGroupData:GetUnits() ) do + local FACUnit = FACUnitData -- Wrapper.Unit#UNIT + if FACUnit:IsActive() then + local Vec3 = FACUnit:GetVec3() + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + local Distance = PointVec3:Get2DDistance(POINT_VEC3:NewFromVec3( FACUnit:GetVec3() ) ) + if Distance < MinDistance then + MinDistance = Distance + NearestFAC = FACUnit + end + end + end + end + + DetectedItem.NearestFAC = NearestFAC + + end + + --- Returns the A2G threat level of the units in the DetectedItem + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #number a scale from 0 to 10. + function DETECTION_AREAS:GetTreatLevelA2G( DetectedItem ) + + self:T3( DetectedItem.MaxThreatLevelA2G ) + return DetectedItem.MaxThreatLevelA2G + end + + + + --- Smoke the detected units + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:SmokeDetectedUnits() + self:F2() + + self._SmokeDetectedUnits = true + return self + end + + --- Flare the detected units + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:FlareDetectedUnits() + self:F2() + + self._FlareDetectedUnits = true + return self + end + + --- Smoke the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:SmokeDetectedZones() + self:F2() + + self._SmokeDetectedZones = true + return self + end + + --- Flare the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:FlareDetectedZones() + self:F2() + + self._FlareDetectedZones = true + return self + end + + --- Bound the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:BoundDetectedZones() + self:F2() + + self._BoundDetectedZones = true + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_AREAS:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AA" then + MT[#MT+1] = "Detected new area " .. ChangeData.ItemID .. ". The center target is a " .. ChangeData.ItemUnitType .. "." + end + + if ChangeCode == "RAU" then + MT[#MT+1] = "Changed area " .. ChangeData.ItemID .. ". Removed the center target." + end + + if ChangeCode == "AAU" then + MT[#MT+1] = "Changed area " .. ChangeData.ItemID .. ". The new center target is a " .. ChangeData.ItemUnitType "." + end + + if ChangeCode == "RA" then + MT[#MT+1] = "Removed old area " .. ChangeData.ItemID .. ". No more targets in this area." + end + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = "Detected for area " .. ChangeData.ItemID .. " new target(s) " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = "Removed for area " .. ChangeData.ItemID .. " invisible or destroyed target(s) " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Make a DetectionSet table. This function will be overridden in the derived clsses. + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:CreateDetectionSets() + self:F2() + + + self:T( "Checking Detected Items for new Detected Units ..." ) + -- First go through all detected sets, and check if there are new detected units, match all existing detected units and identify undetected units. + -- Regroup when needed, split groups when needed. + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + if DetectedItem then + + self:T( { "Detected Item ID:", DetectedItemID } ) + + + local DetectedSet = DetectedItem.Set + + local AreaExists = false -- This flag will determine of the detected area is still existing. + + -- First test if the center unit is detected in the detection area. + self:T3( { "Zone Center Unit:", DetectedItem.Zone.ZoneUNIT.UnitName } ) + local DetectedZoneObject = self:GetDetectedObject( DetectedItem.Zone.ZoneUNIT.UnitName ) + self:T3( { "Detected Zone Object:", DetectedItem.Zone:GetName(), DetectedZoneObject } ) + + if DetectedZoneObject then + + --self:IdentifyDetectedObject( DetectedZoneObject ) + AreaExists = true + + + + else + -- The center object of the detected area has not been detected. Find an other unit of the set to become the center of the area. + -- First remove the center unit from the set. + DetectedSet:RemoveUnitsByName( DetectedItem.Zone.ZoneUNIT.UnitName ) + + self:AddChangeItem( DetectedItem, 'RAU', "Dummy" ) + + -- Then search for a new center area unit within the set. Note that the new area unit candidate must be within the area range. + for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + local DetectedObject = self:GetDetectedObject( DetectedUnit.UnitName ) + + -- The DetectedObject can be nil when the DetectedUnit is not alive anymore or it is not in the DetectedObjects map. + -- If the DetectedUnit was already identified, DetectedObject will be nil. + if DetectedObject then + self:IdentifyDetectedObject( DetectedObject ) + AreaExists = true + + DetectedItem.Zone:BoundZone( 12, self.CountryID, true) + + -- Assign the Unit as the new center unit of the detected area. + DetectedItem.Zone = ZONE_UNIT:New( DetectedUnit:GetName(), DetectedUnit, self.DetectionZoneRange ) + + self:AddChangeItem( DetectedItem, "AAU", DetectedItem.Zone.ZoneUNIT:GetTypeName() ) + + -- We don't need to add the DetectedObject to the area set, because it is already there ... + break + end + end + end + + -- Now we've determined the center unit of the area, now we can iterate the units in the detected area. + -- Note that the position of the area may have moved due to the center unit repositioning. + -- If no center unit was identified, then the detected area does not exist anymore and should be deleted, as there are no valid units that can be the center unit. + if AreaExists then + + -- ok, we found the center unit of the area, now iterate through the detected area set and see which units are still within the center unit zone ... + -- Those units within the zone are flagged as Identified. + -- If a unit was not found in the set, remove it from the set. This may be added later to other existing or new sets. + for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + local DetectedObject = nil + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Check if the DetectedUnit is within the DetectedItem.Zone + if DetectedUnit:IsInZone( DetectedItem.Zone ) then + + -- Yes, the DetectedUnit is within the DetectedItem.Zone, no changes, DetectedUnit can be kept within the Set. + self:IdentifyDetectedObject( DetectedObject ) + + else + -- No, the DetectedUnit is not within the DetectedItem.Zone, remove DetectedUnit from the Set. + DetectedSet:Remove( DetectedUnitName ) + self:AddChangeUnit( DetectedItem, "RU", DetectedUnit:GetTypeName() ) + end + + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", "destroyed target" ) + DetectedSet:Remove( DetectedUnitName ) + + -- The DetectedObject has been identified, because it does not exist ... + -- self:IdentifyDetectedObject( DetectedObject ) + end + end + else + DetectedItem.Zone:BoundZone( 12, self.CountryID, true) + self:RemoveDetectedItem( DetectedItemID ) + self:AddChangeItem( DetectedItem, "RA" ) + end + end + end + + -- We iterated through the existing detection areas and: + -- - We checked which units are still detected in each detection area. Those units were flagged as Identified. + -- - We recentered the detection area to new center units where it was needed. + -- + -- Now we need to loop through the unidentified detected units and see where they belong: + -- - They can be added to a new detection area and become the new center unit. + -- - They can be added to a new detection area. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + + if DetectedObject then + + -- We found an unidentified unit outside of any existing detection area. + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + local AddedToDetectionArea = false + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + if DetectedItem then + self:T( "Detection Area #" .. DetectedItem.ItemID ) + local DetectedSet = DetectedItem.Set + if not self:IsDetectedObjectIdentified( DetectedObject ) and DetectedUnit:IsInZone( DetectedItem.Zone ) then + self:IdentifyDetectedObject( DetectedObject ) + DetectedSet:AddUnit( DetectedUnit ) + AddedToDetectionArea = true + self:AddChangeUnit( DetectedItem, "AU", DetectedUnit:GetTypeName() ) + end + end + end + + if AddedToDetectionArea == false then + + -- New detection area + local DetectedItem = self:AddDetectedItemZone( nil, + SET_UNIT:New(), + ZONE_UNIT:New( DetectedUnitName, DetectedUnit, self.DetectionZoneRange ) + ) + --self:E( DetectedItem.Zone.ZoneUNIT.UnitName ) + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeItem( DetectedItem, "AA", DetectedUnit:GetTypeName() ) + end + end + end + + -- Now all the tests should have been build, now make some smoke and flares... + -- We also report here the friendlies within the detected areas. + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + self:CalculateThreatLevelA2G( DetectedItem ) -- Calculate A2G threat level + self:NearestFAC( DetectedItem ) + + if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then + DetectedZone.ZoneUNIT:SmokeRed() + end + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit ) + if DetectedUnit:IsAlive() then + self:T( "Detected Set #" .. DetectedItem.ItemID .. ":" .. DetectedUnit:GetName() ) + if DETECTION_AREAS._FlareDetectedUnits or self._FlareDetectedUnits then + DetectedUnit:FlareGreen() + end + if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then + DetectedUnit:SmokeGreen() + end + end + end + ) + if DETECTION_AREAS._FlareDetectedZones or self._FlareDetectedZones then + DetectedZone:FlareZone( SMOKECOLOR.White, 30, math.random( 0,90 ) ) + end + if DETECTION_AREAS._SmokeDetectedZones or self._SmokeDetectedZones then + DetectedZone:SmokeZone( SMOKECOLOR.White, 30 ) + end + + if DETECTION_AREAS._BoundDetectedZones or self._BoundDetectedZones then + DetectedZone:BoundZone( 12, self.CountryID ) + end + end + + end + +end +--- Single-Player:**No** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**All** -- **AI Balancing will replace in multi player missions +-- non-occupied human slots with AI groups, in order to provide an engaging simulation environment, +-- even when there are hardly any players in the mission.** +-- +-- ![Banner Image](..\Presentations\AI_Balancer\Dia1.JPG) +-- +-- === +-- +-- # 1) @{AI_Balancer#AI_BALANCER} class, extends @{Fsm#FSM_SET} +-- +-- The @{AI_Balancer#AI_BALANCER} class monitors and manages as many replacement AI groups as there are +-- CLIENTS in a SET_CLIENT collection, which are not occupied by human players. +-- In other words, use AI_BALANCER to simulate human behaviour by spawning in replacement AI in multi player missions. +-- +-- The parent class @{Fsm#FSM_SET} manages the functionality to control the Finite State Machine (FSM). +-- The mission designer can tailor the behaviour of the AI_BALANCER, by defining event and state transition methods. +-- An explanation about state and event transition methods can be found in the @{FSM} module documentation. +-- +-- The mission designer can tailor the AI_BALANCER behaviour, by implementing a state or event handling method for the following: +-- +-- * **@{#AI_BALANCER.OnAfterSpawned}**( AISet, From, Event, To, AIGroup ): Define to add extra logic when an AI is spawned. +-- +-- ## 1.1) AI_BALANCER construction +-- +-- Create a new AI_BALANCER object with the @{#AI_BALANCER.New}() method: +-- +-- ## 1.2) AI_BALANCER is a FSM +-- +-- ![Process](..\Presentations\AI_Balancer\Dia13.JPG) +-- +-- ### 1.2.1) AI_BALANCER States +-- +-- * **Monitoring** ( Set ): Monitoring the Set if all AI is spawned for the Clients. +-- * **Spawning** ( Set, ClientName ): There is a new AI group spawned with ClientName as the name of reference. +-- * **Spawned** ( Set, AIGroup ): A new AI has been spawned. You can handle this event to customize the AI behaviour with other AI FSMs or own processes. +-- * **Destroying** ( Set, AIGroup ): The AI is being destroyed. +-- * **Returning** ( Set, AIGroup ): The AI is returning to the airbase specified by the ReturnToAirbase methods. Handle this state to customize the return behaviour of the AI, if any. +-- +-- ### 1.2.2) AI_BALANCER Events +-- +-- * **Monitor** ( Set ): Every 10 seconds, the Monitor event is triggered to monitor the Set. +-- * **Spawn** ( Set, ClientName ): Triggers when there is a new AI group to be spawned with ClientName as the name of reference. +-- * **Spawned** ( Set, AIGroup ): Triggers when a new AI has been spawned. You can handle this event to customize the AI behaviour with other AI FSMs or own processes. +-- * **Destroy** ( Set, AIGroup ): The AI is being destroyed. +-- * **Return** ( Set, AIGroup ): The AI is returning to the airbase specified by the ReturnToAirbase methods. +-- +-- ## 1.3) AI_BALANCER spawn interval for replacement AI +-- +-- Use the method @{#AI_BALANCER.InitSpawnInterval}() to set the earliest and latest interval in seconds that is waited until a new replacement AI is spawned. +-- +-- ## 1.4) AI_BALANCER returns AI to Airbases +-- +-- By default, When a human player joins a slot that is AI_BALANCED, the AI group will be destroyed by default. +-- However, there are 2 additional options that you can use to customize the destroy behaviour. +-- When a human player joins a slot, you can configure to let the AI return to: +-- +-- * @{#AI_BALANCER.ReturnToHomeAirbase}: Returns the AI to the **home** @{Airbase#AIRBASE}. +-- * @{#AI_BALANCER.ReturnToNearestAirbases}: Returns the AI to the **nearest friendly** @{Airbase#AIRBASE}. +-- +-- Note that when AI returns to an airbase, the AI_BALANCER will trigger the **Return** event and the AI will return, +-- otherwise the AI_BALANCER will trigger a **Destroy** event, and the AI will be destroyed. +-- +-- === +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-17: There is still a problem with AI being destroyed, but not respawned. Need to check further upon that. +-- +-- 2017-01-08: AI_BALANCER:**InitSpawnInterval( Earliest, Latest )** added. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Dutch_Baron](https://forums.eagle.ru/member.php?u=112075)**: Working together with James has resulted in the creation of the AI_BALANCER class. James has shared his ideas on balancing AI with air units, and together we made a first design which you can use now :-) +-- * **SNAFU**: Had a couple of mails with the guys to validate, if the same concept in the GCI/CAP script could be reworked within MOOSE. None of the script code has been used however within the new AI_BALANCER moose class. +-- +-- ### Authors: +-- +-- * FlightControl: Framework Design & Programming and Documentation. +-- +-- @module AI_Balancer + +--- AI_BALANCER class +-- @type AI_BALANCER +-- @field Core.Set#SET_CLIENT SetClient +-- @field Functional.Spawn#SPAWN SpawnAI +-- @field Wrapper.Group#GROUP Test +-- @extends Core.Fsm#FSM_SET +AI_BALANCER = { + ClassName = "AI_BALANCER", + PatrolZones = {}, + AIGroups = {}, + Earliest = 5, -- Earliest a new AI can be spawned is in 5 seconds. + Latest = 60, -- Latest a new AI can be spawned is in 60 seconds. +} + + + +--- Creates a new AI_BALANCER object +-- @param #AI_BALANCER self +-- @param Core.Set#SET_CLIENT SetClient A SET\_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). +-- @param Functional.Spawn#SPAWN SpawnAI The default Spawn object to spawn new AI Groups when needed. +-- @return #AI_BALANCER +function AI_BALANCER:New( SetClient, SpawnAI ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_SET:New( SET_GROUP:New() ) ) -- AI.AI_Balancer#AI_BALANCER + + -- TODO: Define the OnAfterSpawned event + self:SetStartState( "None" ) + self:AddTransition( "*", "Monitor", "Monitoring" ) + self:AddTransition( "*", "Spawn", "Spawning" ) + self:AddTransition( "Spawning", "Spawned", "Spawned" ) + self:AddTransition( "*", "Destroy", "Destroying" ) + self:AddTransition( "*", "Return", "Returning" ) + + self.SetClient = SetClient + self.SetClient:FilterOnce() + self.SpawnAI = SpawnAI + + self.SpawnQueue = {} + + self.ToNearestAirbase = false + self.ToHomeAirbase = false + + self:__Monitor( 1 ) + + return self +end + +--- Sets the earliest to the latest interval in seconds how long AI_BALANCER will wait to spawn a new AI. +-- Provide 2 identical seconds if the interval should be a fixed amount of seconds. +-- @param #AI_BALANCER self +-- @param #number Earliest The earliest a new AI can be spawned in seconds. +-- @param #number Latest The latest a new AI can be spawned in seconds. +-- @return self +function AI_BALANCER:InitSpawnInterval( Earliest, Latest ) + + self.Earliest = Earliest + self.Latest = Latest + + return self +end + +--- Returns the AI to the nearest friendly @{Airbase#AIRBASE}. +-- @param #AI_BALANCER self +-- @param Dcs.DCSTypes#Distance ReturnTresholdRange If there is an enemy @{Client#CLIENT} within the ReturnTresholdRange given in meters, the AI will not return to the nearest @{Airbase#AIRBASE}. +-- @param Core.Set#SET_AIRBASE ReturnAirbaseSet The SET of @{Set#SET_AIRBASE}s to evaluate where to return to. +function AI_BALANCER:ReturnToNearestAirbases( ReturnTresholdRange, ReturnAirbaseSet ) + + self.ToNearestAirbase = true + self.ReturnTresholdRange = ReturnTresholdRange + self.ReturnAirbaseSet = ReturnAirbaseSet +end + +--- Returns the AI to the home @{Airbase#AIRBASE}. +-- @param #AI_BALANCER self +-- @param Dcs.DCSTypes#Distance ReturnTresholdRange If there is an enemy @{Client#CLIENT} within the ReturnTresholdRange given in meters, the AI will not return to the nearest @{Airbase#AIRBASE}. +function AI_BALANCER:ReturnToHomeAirbase( ReturnTresholdRange ) + + self.ToHomeAirbase = true + self.ReturnTresholdRange = ReturnTresholdRange +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param #string ClientName +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterSpawning( SetGroup, From, Event, To, ClientName ) + + -- OK, Spawn a new group from the default SpawnAI object provided. + local AIGroup = self.SpawnAI:Spawn() -- Wrapper.Group#GROUP + if AIGroup then + AIGroup:E( "Spawning new AIGroup" ) + --TODO: need to rework UnitName thing ... + + SetGroup:Add( ClientName, AIGroup ) + self.SpawnQueue[ClientName] = nil + + -- Fire the Spawned event. The first parameter is the AIGroup just Spawned. + -- Mission designers can catch this event to bind further actions to the AIGroup. + self:Spawned( AIGroup ) + end +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterDestroying( SetGroup, From, Event, To, ClientName, AIGroup ) + + AIGroup:Destroy() + SetGroup:Flush() + SetGroup:Remove( ClientName ) + SetGroup:Flush() +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterReturning( SetGroup, From, Event, To, AIGroup ) + + local AIGroupTemplate = AIGroup:GetTemplate() + if self.ToHomeAirbase == true then + local WayPointCount = #AIGroupTemplate.route.points + local SwitchWayPointCommand = AIGroup:CommandSwitchWayPoint( 1, WayPointCount, 1 ) + AIGroup:SetCommand( SwitchWayPointCommand ) + AIGroup:MessageToRed( "Returning to home base ...", 30 ) + else + -- Okay, we need to send this Group back to the nearest base of the Coalition of the AI. + --TODO: i need to rework the POINT_VEC2 thing. + local PointVec2 = POINT_VEC2:New( AIGroup:GetVec2().x, AIGroup:GetVec2().y ) + local ClosestAirbase = self.ReturnAirbaseSet:FindNearestAirbaseFromPointVec2( PointVec2 ) + self:T( ClosestAirbase.AirbaseName ) + AIGroup:MessageToRed( "Returning to " .. ClosestAirbase:GetName().. " ...", 30 ) + local RTBRoute = AIGroup:RouteReturnToAirbase( ClosestAirbase ) + AIGroupTemplate.route = RTBRoute + AIGroup:Respawn( AIGroupTemplate ) + end + +end + + +--- @param #AI_BALANCER self +function AI_BALANCER:onenterMonitoring( SetGroup ) + + self:T2( { self.SetClient:Count() } ) + --self.SetClient:Flush() + + self.SetClient:ForEachClient( + --- @param Wrapper.Client#CLIENT Client + function( Client ) + self:T3(Client.ClientName) + + local AIGroup = self.Set:Get( Client.UnitName ) -- Wrapper.Group#GROUP + if Client:IsAlive() then + + if AIGroup and AIGroup:IsAlive() == true then + + if self.ToNearestAirbase == false and self.ToHomeAirbase == false then + self:Destroy( Client.UnitName, AIGroup ) + else + -- We test if there is no other CLIENT within the self.ReturnTresholdRange of the first unit of the AI group. + -- If there is a CLIENT, the AI stays engaged and will not return. + -- If there is no CLIENT within the self.ReturnTresholdRange, then the unit will return to the Airbase return method selected. + + local PlayerInRange = { Value = false } + local RangeZone = ZONE_RADIUS:New( 'RangeZone', AIGroup:GetVec2(), self.ReturnTresholdRange ) + + self:T2( RangeZone ) + + _DATABASE:ForEachPlayer( + --- @param Wrapper.Unit#UNIT RangeTestUnit + function( RangeTestUnit, RangeZone, AIGroup, PlayerInRange ) + self:T2( { PlayerInRange, RangeTestUnit.UnitName, RangeZone.ZoneName } ) + if RangeTestUnit:IsInZone( RangeZone ) == true then + self:T2( "in zone" ) + if RangeTestUnit:GetCoalition() ~= AIGroup:GetCoalition() then + self:T2( "in range" ) + PlayerInRange.Value = true + end + end + end, + + --- @param Core.Zone#ZONE_RADIUS RangeZone + -- @param Wrapper.Group#GROUP AIGroup + function( RangeZone, AIGroup, PlayerInRange ) + if PlayerInRange.Value == false then + self:Return( AIGroup ) + end + end + , RangeZone, AIGroup, PlayerInRange + ) + + end + self.Set:Remove( Client.UnitName ) + end + else + if not AIGroup or not AIGroup:IsAlive() == true then + self:T( "Client " .. Client.UnitName .. " not alive." ) + if not self.SpawnQueue[Client.UnitName] then + -- Spawn a new AI taking into account the spawn interval Earliest, Latest + self:__Spawn( math.random( self.Earliest, self.Latest ), Client.UnitName ) + self.SpawnQueue[Client.UnitName] = true + self:E( "New AI Spawned for Client " .. Client.UnitName ) + end + end + end + return true + end + ) + + self:__Monitor( 10 ) +end + + + +--- **AI** -- **Air Patrolling or Staging.** +-- +-- ![Banner Image](..\Presentations\AI_PATROL\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_PATROL_ZONE} class, extends @{Fsm#FSM_CONTROLLABLE} +-- +-- The @{#AI_PATROL_ZONE} class implements the core functions to patrol a @{Zone} by an AI @{Controllable} or @{Group}. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia3.JPG) +-- +-- The AI_PATROL_ZONE is assigned a @{Group} and this must be done before the AI_PATROL_ZONE process can be started using the **Start** event. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia4.JPG) +-- +-- The AI will fly towards the random 3D point within the patrol zone, using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia5.JPG) +-- +-- This cycle will continue. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia6.JPG) +-- +-- During the patrol, the AI will detect enemy targets, which are reported through the **Detected** event. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia9.JPG) +-- +---- Note that the enemy is not engaged! To model enemy engagement, either tailor the **Detected** event, or +-- use derived AI_ classes to model AI offensive or defensive behaviour. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia10.JPG) +-- +-- Until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia11.JPG) +-- +-- ## 1.1) AI_PATROL_ZONE constructor +-- +-- * @{#AI_PATROL_ZONE.New}(): Creates a new AI_PATROL_ZONE object. +-- +-- ## 1.2) AI_PATROL_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_PATROL\Dia2.JPG) +-- +-- ### 1.2.1) AI_PATROL_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Returning** ( Group ): The AI is returning to Base. +-- * **Stopped** ( Group ): The process is stopped. +-- * **Crashed** ( Group ): The AI has crashed or is dead. +-- +-- ### 1.2.2) AI_PATROL_ZONE Events +-- +-- * **Start** ( Group ): Start the process. +-- * **Stop** ( Group ): Stop the process. +-- * **Route** ( Group ): Route the AI to a new random 3D point within the Patrol Zone. +-- * **RTB** ( Group ): Route the AI to the home base. +-- * **Detect** ( Group ): The AI is detecting targets. +-- * **Detected** ( Group ): The AI has detected new targets. +-- * **Status** ( Group ): The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ## 1.3) Set or Get the AI controllable +-- +-- * @{#AI_PATROL_ZONE.SetControllable}(): Set the AIControllable. +-- * @{#AI_PATROL_ZONE.GetControllable}(): Get the AIControllable. +-- +-- ## 1.4) Set the Speed and Altitude boundaries of the AI controllable +-- +-- * @{#AI_PATROL_ZONE.SetSpeed}(): Set the patrol speed boundaries of the AI, for the next patrol. +-- * @{#AI_PATROL_ZONE.SetAltitude}(): Set altitude boundaries of the AI, for the next patrol. +-- +-- ## 1.5) Manage the detection process of the AI controllable +-- +-- The detection process of the AI controllable can be manipulated. +-- Detection requires an amount of CPU power, which has an impact on your mission performance. +-- Only put detection on when absolutely necessary, and the frequency of the detection can also be set. +-- +-- * @{#AI_PATROL_ZONE.SetDetectionOn}(): Set the detection on. The AI will detect for targets. +-- * @{#AI_PATROL_ZONE.SetDetectionOff}(): Set the detection off, the AI will not detect for targets. The existing target list will NOT be erased. +-- +-- The detection frequency can be set with @{#AI_PATROL_ZONE.SetDetectionInterval}( seconds ), where the amount of seconds specify how much seconds will be waited before the next detection. +-- Use the method @{#AI_PATROL_ZONE.GetDetectedUnits}() to obtain a list of the @{Unit}s detected by the AI. +-- +-- The detection can be filtered to potential targets in a specific zone. +-- Use the method @{#AI_PATROL_ZONE.SetDetectionZone}() to set the zone where targets need to be detected. +-- Note that when the zone is too far away, or the AI is not heading towards the zone, or the AI is too high, no targets may be detected +-- according the weather conditions. +-- +-- ## 1.6) Manage the "out of fuel" in the AI_PATROL_ZONE +-- +-- When the AI is out of fuel, it is required that a new AI is started, before the old AI can return to the home base. +-- Therefore, with a parameter and a calculation of the distance to the home base, the fuel treshold is calculated. +-- When the fuel treshold is reached, the AI will continue for a given time its patrol task in orbit, +-- while a new AI is targetted to the AI_PATROL_ZONE. +-- Once the time is finished, the old AI will return to the base. +-- Use the method @{#AI_PATROL_ZONE.ManageFuel}() to have this proces in place. +-- +-- ## 1.7) Manage "damage" behaviour of the AI in the AI_PATROL_ZONE +-- +-- When the AI is damaged, it is required that a new AIControllable is started. However, damage cannon be foreseen early on. +-- Therefore, when the damage treshold is reached, the AI will return immediately to the home base (RTB). +-- Use the method @{#AI_PATROL_ZONE.ManageDamage}() to have this proces in place. +-- +-- ==== +-- +-- # **OPEN ISSUES** +-- +-- 2017-01-17: When Spawned AI is located at an airbase, it will be routed first back to the airbase after take-off. +-- +-- 2016-01-17: +-- -- Fixed problem with AI returning to base too early and unexpected. +-- -- ReSpawning of AI will reset the AI_PATROL and derived classes. +-- -- Checked the correct workings of SCHEDULER, and it DOES work correctly. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-17: Rename of class: **AI\_PATROL\_ZONE** is the new name for the old _AI\_PATROLZONE_. +-- +-- 2017-01-15: Complete revision. AI_PATROL_ZONE is the base class for other AI_PATROL like classes. +-- +-- 2016-09-01: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Dutch_Baron](https://forums.eagle.ru/member.php?u=112075)**: Working together with James has resulted in the creation of the AI_BALANCER class. James has shared his ideas on balancing AI with air units, and together we made a first design which you can use now :-) +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Testing and API concept review. +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming. +-- +-- @module AI_Patrol + +--- AI_PATROL_ZONE class +-- @type AI_PATROL_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @field Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @field Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @field Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @field Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @field Functional.Spawn#SPAWN CoordTest +-- @extends Core.Fsm#FSM_CONTROLLABLE +AI_PATROL_ZONE = { + ClassName = "AI_PATROL_ZONE", +} + +--- Creates a new AI_PATROL_ZONE object +-- @param #AI_PATROL_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_PATROL_ZONE self +-- @usage +-- -- Define a new AI_PATROL_ZONE Object. This PatrolArea will patrol an AIControllable within PatrolZone between 3000 and 6000 meters, with a variying speed between 600 and 900 km/h. +-- PatrolZone = ZONE:New( 'PatrolZone' ) +-- PatrolSpawn = SPAWN:New( 'Patrol Group' ) +-- PatrolArea = AI_PATROL_ZONE:New( PatrolZone, 3000, 6000, 600, 900 ) +function AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- #AI_PATROL_ZONE + + + self.PatrolZone = PatrolZone + self.PatrolFloorAltitude = PatrolFloorAltitude + self.PatrolCeilingAltitude = PatrolCeilingAltitude + self.PatrolMinSpeed = PatrolMinSpeed + self.PatrolMaxSpeed = PatrolMaxSpeed + + -- defafult PatrolAltType to "RADIO" if not specified + self.PatrolAltType = PatrolAltType or "RADIO" + + self:SetDetectionInterval( 30 ) + + self.CheckStatus = true + + self:ManageFuel( .2, 60 ) + self:ManageDamage( 1 ) + + + self.DetectedUnits = {} -- This table contains the targets detected during patrol. + + self:SetStartState( "None" ) + + self:AddTransition( "*", "Stop", "Stopped" ) + +--- OnLeave Transition Handler for State Stopped. +-- @function [parent=#AI_PATROL_ZONE] OnLeaveStopped +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Stopped. +-- @function [parent=#AI_PATROL_ZONE] OnEnterStopped +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- OnBefore Transition Handler for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStop +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStop +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] Stop +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] __Stop +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "None", "Start", "Patrolling" ) + +--- OnBefore Transition Handler for Event Start. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStart +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Start. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStart +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Start. +-- @function [parent=#AI_PATROL_ZONE] Start +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Start. +-- @function [parent=#AI_PATROL_ZONE] __Start +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Patrolling. +-- @function [parent=#AI_PATROL_ZONE] OnLeavePatrolling +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Patrolling. +-- @function [parent=#AI_PATROL_ZONE] OnEnterPatrolling +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Patrolling", "Route", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Route. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeRoute +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Route. +-- @function [parent=#AI_PATROL_ZONE] OnAfterRoute +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Route. +-- @function [parent=#AI_PATROL_ZONE] Route +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Route. +-- @function [parent=#AI_PATROL_ZONE] __Route +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Status", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Status. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStatus +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Status. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStatus +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Status. +-- @function [parent=#AI_PATROL_ZONE] Status +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Status. +-- @function [parent=#AI_PATROL_ZONE] __Status +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Detect", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeDetect +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] OnAfterDetect +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] Detect +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] __Detect +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Detected", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeDetected +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] OnAfterDetected +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] Detected +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] __Detected +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "RTB", "Returning" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeRTB +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] OnAfterRTB +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] RTB +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] __RTB +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Returning. +-- @function [parent=#AI_PATROL_ZONE] OnLeaveReturning +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Returning. +-- @function [parent=#AI_PATROL_ZONE] OnEnterReturning +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "*", "Reset", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + + self:AddTransition( "*", "Eject", "*" ) + self:AddTransition( "*", "Crash", "Crashed" ) + self:AddTransition( "*", "PilotDead", "*" ) + + return self +end + + + + +--- Sets (modifies) the minimum and maximum speed of the patrol. +-- @param #AI_PATROL_ZONE self +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetSpeed( PatrolMinSpeed, PatrolMaxSpeed ) + self:F2( { PatrolMinSpeed, PatrolMaxSpeed } ) + + self.PatrolMinSpeed = PatrolMinSpeed + self.PatrolMaxSpeed = PatrolMaxSpeed +end + + + +--- Sets the floor and ceiling altitude of the patrol. +-- @param #AI_PATROL_ZONE self +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetAltitude( PatrolFloorAltitude, PatrolCeilingAltitude ) + self:F2( { PatrolFloorAltitude, PatrolCeilingAltitude } ) + + self.PatrolFloorAltitude = PatrolFloorAltitude + self.PatrolCeilingAltitude = PatrolCeilingAltitude +end + +-- * @{#AI_PATROL_ZONE.SetDetectionOn}(): Set the detection on. The AI will detect for targets. +-- * @{#AI_PATROL_ZONE.SetDetectionOff}(): Set the detection off, the AI will not detect for targets. The existing target list will NOT be erased. + +--- Set the detection on. The AI will detect for targets. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionOn() + self:F2() + + self.DetectOn = true +end + +--- Set the detection off. The AI will NOT detect for targets. +-- However, the list of already detected targets will be kept and can be enquired! +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionOff() + self:F2() + + self.DetectOn = false +end + +--- Set the status checking off. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetStatusOff() + self:F2() + + self.CheckStatus = false +end + +--- Activate the detection. The AI will detect for targets if the Detection is switched On. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionActivated() + self:F2() + + self:ClearDetectedUnits() + self.DetectActivated = true + self:__Detect( -self.DetectInterval ) +end + +--- Deactivate the detection. The AI will NOT detect for targets. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionDeactivated() + self:F2() + + self:ClearDetectedUnits() + self.DetectActivated = false +end + +--- Set the interval in seconds between each detection executed by the AI. +-- The list of already detected targets will be kept and updated. +-- Newly detected targets will be added, but already detected targets that were +-- not detected in this cycle, will NOT be removed! +-- The default interval is 30 seconds. +-- @param #AI_PATROL_ZONE self +-- @param #number Seconds The interval in seconds. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionInterval( Seconds ) + self:F2() + + if Seconds then + self.DetectInterval = Seconds + else + self.DetectInterval = 30 + end +end + +--- Set the detection zone where the AI is detecting targets. +-- @param #AI_PATROL_ZONE self +-- @param Core.Zone#ZONE DetectionZone The zone where to detect targets. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionZone( DetectionZone ) + self:F2() + + if DetectionZone then + self.DetectZone = DetectionZone + else + self.DetectZone = nil + end +end + +--- Gets a list of @{Unit#UNIT}s that were detected by the AI. +-- No filtering is applied, so, ANY detected UNIT can be in this list. +-- It is up to the mission designer to use the @{Unit} class and methods to filter the targets. +-- @param #AI_PATROL_ZONE self +-- @return #table The list of @{Unit#UNIT}s +function AI_PATROL_ZONE:GetDetectedUnits() + self:F2() + + return self.DetectedUnits +end + +--- Clears the list of @{Unit#UNIT}s that were detected by the AI. +-- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ClearDetectedUnits() + self:F2() + self.DetectedUnits = {} +end + +--- When the AI is out of fuel, it is required that a new AI is started, before the old AI can return to the home base. +-- Therefore, with a parameter and a calculation of the distance to the home base, the fuel treshold is calculated. +-- When the fuel treshold is reached, the AI will continue for a given time its patrol task in orbit, while a new AIControllable is targetted to the AI_PATROL_ZONE. +-- Once the time is finished, the old AI will return to the base. +-- @param #AI_PATROL_ZONE self +-- @param #number PatrolFuelTresholdPercentage The treshold in percentage (between 0 and 1) when the AIControllable is considered to get out of fuel. +-- @param #number PatrolOutOfFuelOrbitTime The amount of seconds the out of fuel AIControllable will orbit before returning to the base. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ManageFuel( PatrolFuelTresholdPercentage, PatrolOutOfFuelOrbitTime ) + + self.PatrolManageFuel = true + self.PatrolFuelTresholdPercentage = PatrolFuelTresholdPercentage + self.PatrolOutOfFuelOrbitTime = PatrolOutOfFuelOrbitTime + + return self +end + +--- When the AI is damaged beyond a certain treshold, it is required that the AI returns to the home base. +-- However, damage cannot be foreseen early on. +-- Therefore, when the damage treshold is reached, +-- the AI will return immediately to the home base (RTB). +-- Note that for groups, the average damage of the complete group will be calculated. +-- So, in a group of 4 airplanes, 2 lost and 2 with damage 0.2, the damage treshold will be 0.25. +-- @param #AI_PATROL_ZONE self +-- @param #number PatrolDamageTreshold The treshold in percentage (between 0 and 1) when the AI is considered to be damaged. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ManageDamage( PatrolDamageTreshold ) + + self.PatrolManageDamage = true + self.PatrolDamageTreshold = PatrolDamageTreshold + + return self +end + +--- Defines a new patrol route using the @{Process_PatrolZone} parameters and settings. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_PATROL_ZONE:onafterStart( Controllable, From, Event, To ) + self:F2() + + self:__Route( 1 ) -- Route to the patrol point. The asynchronous trigger is important, because a spawned group and units takes at least one second to come live. + self:__Status( 60 ) -- Check status status every 30 seconds. + self:SetDetectionActivated() + + self:HandleEvent( EVENTS.PilotDead, self.OnPilotDead ) + self:HandleEvent( EVENTS.Crash, self.OnCrash ) + self:HandleEvent( EVENTS.Ejection, self.OnEjection ) + + Controllable:OptionROEHoldFire() + Controllable:OptionROTVertical() + + self.Controllable:OnReSpawn( + function( PatrolGroup ) + self:E( "ReSpawn" ) + self:__Reset( 1 ) + self:__Route( 5 ) + end + ) + + self:SetDetectionOn() + +end + + +--- @param #AI_PATROL_ZONE self +--- @param Wrapper.Controllable#CONTROLLABLE Controllable +function AI_PATROL_ZONE:onbeforeDetect( Controllable, From, Event, To ) + + return self.DetectOn and self.DetectActivated +end + +--- @param #AI_PATROL_ZONE self +--- @param Wrapper.Controllable#CONTROLLABLE Controllable +function AI_PATROL_ZONE:onafterDetect( Controllable, From, Event, To ) + + local Detected = false + + local DetectedTargets = Controllable:GetDetectedTargets() + for TargetID, Target in pairs( DetectedTargets or {} ) do + local TargetObject = Target.object + + if TargetObject and TargetObject:isExist() and TargetObject.id_ < 50000000 then + + local TargetUnit = UNIT:Find( TargetObject ) + local TargetUnitName = TargetUnit:GetName() + + if self.DetectionZone then + if TargetUnit:IsInZone( self.DetectionZone ) then + self:T( {"Detected ", TargetUnit } ) + if self.DetectedUnits[TargetUnit] == nil then + self.DetectedUnits[TargetUnit] = true + end + Detected = true + end + else + if self.DetectedUnits[TargetUnit] == nil then + self.DetectedUnits[TargetUnit] = true + end + Detected = true + end + end + end + + self:__Detect( -self.DetectInterval ) + + if Detected == true then + self:__Detected( 1.5 ) + end + +end + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +-- This statis method is called from the route path within the last task at the last waaypoint of the Controllable. +-- Note that this method is required, as triggers the next route when patrolling for the Controllable. +function AI_PATROL_ZONE:_NewPatrolRoute( AIControllable ) + + local PatrolZone = AIControllable:GetState( AIControllable, "PatrolZone" ) -- PatrolCore.Zone#AI_PATROL_ZONE + PatrolZone:__Route( 1 ) +end + + +--- Defines a new patrol route using the @{Process_PatrolZone} parameters and settings. +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_PATROL_ZONE:onafterRoute( Controllable, From, Event, To ) + + self:F2() + + -- When RTB, don't allow anymore the routing. + if From == "RTB" then + return + end + + + if self.Controllable:IsAlive() then + -- Determine if the AIControllable is within the PatrolZone. + -- If not, make a waypoint within the to that the AIControllable will fly at maximum speed to that point. + + local PatrolRoute = {} + + -- Calculate the current route point of the controllable as the start point of the route. + -- However, when the controllable is not in the air, + -- the controllable current waypoint is probably the airbase... + -- Thus, if we would take the current waypoint as the startpoint, upon take-off, the controllable flies + -- immediately back to the airbase, and this is not correct. + -- Therefore, when on a runway, get as the current route point a random point within the PatrolZone. + -- This will make the plane fly immediately to the patrol zone. + + if self.Controllable:InAir() == false then + self:E( "Not in the air, finding route path within PatrolZone" ) + local CurrentVec2 = self.Controllable:GetVec2() + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TakeOffParking, + POINT_VEC3.RoutePointAction.FromParkingArea, + ToPatrolZoneSpeed, + true + ) + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + else + self:E( "In the air, finding route path within PatrolZone" ) + local CurrentVec2 = self.Controllable:GetVec2() + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToPatrolZoneSpeed, + true + ) + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + end + + + --- Define a random point in the @{Zone}. The AI will fly to that point within the zone. + + --- Find a random 2D point in PatrolZone. + local ToTargetVec2 = self.PatrolZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Define Speed and Altitude. + local ToTargetAltitude = math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ) + local ToTargetSpeed = math.random( self.PatrolMinSpeed, self.PatrolMaxSpeed ) + self:T2( { self.PatrolMinSpeed, self.PatrolMaxSpeed, ToTargetSpeed } ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, ToTargetAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToTargetRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToTargetSpeed, + true + ) + + --self.CoordTest:SpawnFromVec3( ToTargetPointVec3:GetVec3() ) + + --ToTargetPointVec3:SmokeRed() + + PatrolRoute[#PatrolRoute+1] = ToTargetRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( PatrolRoute ) + + --- Do a trick, link the NewPatrolRoute function of the PATROLGROUP object to the AIControllable in a temporary variable ... + self.Controllable:SetState( self.Controllable, "PatrolZone", self ) + self.Controllable:WayPointFunction( #PatrolRoute, 1, "AI_PATROL_ZONE:_NewPatrolRoute" ) + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 2 ) + end + +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onbeforeStatus() + + return self.CheckStatus +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterStatus() + self:F2() + + if self.Controllable and self.Controllable:IsAlive() then + + local RTB = false + + local Fuel = self.Controllable:GetUnit(1):GetFuel() + if Fuel < self.PatrolFuelTresholdPercentage then + self:E( self.Controllable:GetName() .. " is out of fuel:" .. Fuel .. ", RTB!" ) + local OldAIControllable = self.Controllable + local AIControllableTemplate = self.Controllable:GetTemplate() + + local OrbitTask = OldAIControllable:TaskOrbitCircle( math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ), self.PatrolMinSpeed ) + local TimedOrbitTask = OldAIControllable:TaskControlled( OrbitTask, OldAIControllable:TaskCondition(nil,nil,nil,nil,self.PatrolOutOfFuelOrbitTime,nil ) ) + OldAIControllable:SetTask( TimedOrbitTask, 10 ) + + RTB = true + else + end + + -- TODO: Check GROUP damage function. + local Damage = self.Controllable:GetLife() + if Damage <= self.PatrolDamageTreshold then + self:E( self.Controllable:GetName() .. " is damaged:" .. Damage .. ", RTB!" ) + RTB = true + end + + if RTB == true then + self:RTB() + else + self:__Status( 60 ) -- Execute the Patrol event after 30 seconds. + end + end +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterRTB() + self:F2() + + if self.Controllable and self.Controllable:IsAlive() then + + self:SetDetectionOff() + self.CheckStatus = false + + local PatrolRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToPatrolZoneSpeed, + true + ) + + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( PatrolRoute ) + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 1 ) + + end + +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterDead() + self:SetDetectionOff() + self:SetStatusOff() +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnCrash( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:E( self.Controllable:GetUnits() ) + if #self.Controllable:GetUnits() == 1 then + self:__Crash( 1, EventData ) + end + end +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnEjection( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:__Eject( 1, EventData ) + end +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnPilotDead( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:__PilotDead( 1, EventData ) + end +end +--- **AI** -- **Provide Close Air Support to friendly ground troops.** +-- +-- ![Banner Image](..\Presentations\AI_CAS\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_CAS_ZONE} class, extends @{AI_Patrol#AI_PATROL_ZONE} +-- +-- @{#AI_CAS_ZONE} derives from the @{AI_Patrol#AI_PATROL_ZONE}, inheriting its methods and behaviour. +-- +-- The @{#AI_CAS_ZONE} class implements the core functions to provide Close Air Support in an Engage @{Zone} by an AIR @{Controllable} or @{Group}. +-- The AI_CAS_ZONE runs a process. It holds an AI in a Patrol Zone and when the AI is commanded to engage, it will fly to an Engage Zone. +-- +-- ![HoldAndEngage](..\Presentations\AI_CAS\Dia3.JPG) +-- +-- The AI_CAS_ZONE is assigned a @{Group} and this must be done before the AI_CAS_ZONE process can be started through the **Start** event. +-- +-- ![Start Event](..\Presentations\AI_CAS\Dia4.JPG) +-- +-- Upon started, The AI will **Route** itself towards the random 3D point within a patrol zone, +-- using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- This cycle will continue until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- +-- ![Route Event](..\Presentations\AI_CAS\Dia5.JPG) +-- +-- When the AI is commanded to provide Close Air Support (through the event **Engage**), the AI will fly towards the Engage Zone. +-- Any target that is detected in the Engage Zone will be reported and will be destroyed by the AI. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia6.JPG) +-- +-- The AI will detect the targets and will only destroy the targets within the Engage Zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia7.JPG) +-- +-- Every target that is destroyed, is reported< by the AI. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia8.JPG) +-- +-- Note that the AI does not know when the Engage Zone is cleared, and therefore will keep circling in the zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia9.JPG) +-- +-- Until it is notified through the event **Accomplish**, which is to be triggered by an observing party: +-- +-- * a FAC +-- * a timed event +-- * a menu option selected by a human +-- * a condition +-- * others ... +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia10.JPG) +-- +-- When the AI has accomplished the CAS, it will fly back to the Patrol Zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia11.JPG) +-- +-- It will keep patrolling there, until it is notified to RTB or move to another CAS Zone. +-- It can be notified to go RTB through the **RTB** event. +-- +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia12.JPG) +-- +-- # 1.1) AI_CAS_ZONE constructor +-- +-- * @{#AI_CAS_ZONE.New}(): Creates a new AI_CAS_ZONE object. +-- +-- ## 1.2) AI_CAS_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_CAS\Dia2.JPG) +-- +-- ### 1.2.1) AI_CAS_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Engaging** ( Group ): The AI is engaging the targets in the Engage Zone, executing CAS. +-- * **Returning** ( Group ): The AI is returning to Base.. +-- +-- ### 1.2.2) AI_CAS_ZONE Events +-- +-- * **@{AI_Patrol#AI_PATROL_ZONE.Start}**: Start the process. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Route}**: Route the AI to a new random 3D point within the Patrol Zone. +-- * **@{#AI_CAS_ZONE.Engage}**: Engage the AI to provide CAS in the Engage Zone, destroying any target it finds. +-- * **@{#AI_CAS_ZONE.Abort}**: Aborts the engagement and return patrolling in the patrol zone. +-- * **@{AI_Patrol#AI_PATROL_ZONE.RTB}**: Route the AI to the home base. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detect}**: The AI is detecting targets. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detected}**: The AI has detected new targets. +-- * **@{#AI_CAS_ZONE.Destroy}**: The AI has destroyed a target @{Unit}. +-- * **@{#AI_CAS_ZONE.Destroyed}**: The AI has destroyed all target @{Unit}s assigned in the CAS task. +-- * **Status**: The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-15: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Quax](https://forums.eagle.ru/member.php?u=90530)**: Concept, Advice & Testing. +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Concept, Advice & Testing. +-- * **[Gunterlund](http://forums.eagle.ru:8080/member.php?u=75036)**: Test case revision. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module AI_Cas + + +--- AI_CAS_ZONE class +-- @type AI_CAS_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE TargetZone The @{Zone} where the patrol needs to be executed. +-- @extends AI.AI_Patrol#AI_PATROL_ZONE +AI_CAS_ZONE = { + ClassName = "AI_CAS_ZONE", +} + + + +--- Creates a new AI_CAS_ZONE object +-- @param #AI_CAS_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Core.Zone#ZONE_BASE EngageZone The zone where the engage will happen. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_CAS_ZONE self +function AI_CAS_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageZone, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) ) -- #AI_CAS_ZONE + + self.EngageZone = EngageZone + self.Accomplished = false + + self:SetDetectionZone( self.EngageZone ) + + self:AddTransition( { "Patrolling", "Engaging" }, "Engage", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Engage. + -- @function [parent=#AI_CAS_ZONE] OnBeforeEngage + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Engage. + -- @function [parent=#AI_CAS_ZONE] OnAfterEngage + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAS_ZONE] Engage + -- @param #AI_CAS_ZONE self + -- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. + -- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. + -- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. + -- If parameter is not defined the unit / controllable will choose expend on its own discretion. + -- Use the structure @{DCSTypes#AI.Task.WeaponExpend} to define the amount of weapons to be release at each attack. + -- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. + -- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. + + --- Asynchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAS_ZONE] __Engage + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + -- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. + -- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. + -- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. + -- If parameter is not defined the unit / controllable will choose expend on its own discretion. + -- Use the structure @{DCSTypes#AI.Task.WeaponExpend} to define the amount of weapons to be release at each attack. + -- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. + -- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. + +--- OnLeave Transition Handler for State Engaging. +-- @function [parent=#AI_CAS_ZONE] OnLeaveEngaging +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Engaging. +-- @function [parent=#AI_CAS_ZONE] OnEnterEngaging +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Engaging", "Target", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + self:AddTransition( "Engaging", "Fired", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Fired. + -- @function [parent=#AI_CAS_ZONE] OnBeforeFired + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fired. + -- @function [parent=#AI_CAS_ZONE] OnAfterFired + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAS_ZONE] Fired + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAS_ZONE] __Fired + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Destroy", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] OnBeforeDestroy + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] OnAfterDestroy + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] Destroy + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] __Destroy + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Engaging", "Abort", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Abort. + -- @function [parent=#AI_CAS_ZONE] OnBeforeAbort + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Abort. + -- @function [parent=#AI_CAS_ZONE] OnAfterAbort + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAS_ZONE] Abort + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAS_ZONE] __Abort + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Engaging", "Accomplish", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] OnBeforeAccomplish + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] OnAfterAccomplish + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] Accomplish + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] __Accomplish + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + return self +end + + +--- Set the Engage Zone where the AI is performing CAS. Note that if the EngageZone is changed, the AI needs to re-detect targets. +-- @param #AI_CAS_ZONE self +-- @param Core.Zone#ZONE EngageZone The zone where the AI is performing CAS. +-- @return #AI_CAS_ZONE self +function AI_CAS_ZONE:SetEngageZone( EngageZone ) + self:F2() + + if EngageZone then + self.EngageZone = EngageZone + else + self.EngageZone = nil + end +end + + + +--- onafter State Transition for Event Start. +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterStart( Controllable, From, Event, To ) + + -- Call the parent Start event handler + self:GetParent(self).onafterStart( self, Controllable, From, Event, To ) + self:HandleEvent( EVENTS.Dead ) + + self:SetDetectionDeactivated() -- When not engaging, set the detection off. +end + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +function _NewEngageRoute( AIControllable ) + + AIControllable:T( "NewEngageRoute" ) + local EngageZone = AIControllable:GetState( AIControllable, "EngageZone" ) -- AI.AI_Cas#AI_CAS_ZONE + EngageZone:__Engage( 1, EngageZone.EngageSpeed, EngageZone.EngageAltitude, EngageZone.EngageWeaponExpend, EngageZone.EngageAttackQty, EngageZone.EngageDirection ) +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onbeforeEngage( Controllable, From, Event, To ) + + if self.Accomplished == true then + return false + end +end + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterTarget( Controllable, From, Event, To ) + self:E("onafterTarget") + + if Controllable:IsAlive() then + + local AttackTasks = {} + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + if DetectedUnit:IsAlive() then + if DetectedUnit:IsInZone( self.EngageZone ) then + if Detected == true then + self:E( {"Target: ", DetectedUnit } ) + self.DetectedUnits[DetectedUnit] = false + local AttackTask = Controllable:TaskAttackUnit( DetectedUnit, false, self.EngageWeaponExpend, self.EngageAttackQty, self.EngageDirection, self.EngageAltitude, nil ) + self.Controllable:PushTask( AttackTask, 1 ) + end + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + self:__Target( -10 ) + + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterAbort( Controllable, From, Event, To ) + Controllable:ClearTasks() + self:__Route( 1 ) +end + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. +-- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +function AI_CAS_ZONE:onafterEngage( Controllable, From, Event, To, + EngageSpeed, + EngageAltitude, + EngageWeaponExpend, + EngageAttackQty, + EngageDirection ) + self:F("onafterEngage") + + self.EngageSpeed = EngageSpeed or 400 + self.EngageAltitude = EngageAltitude or 2000 + self.EngageWeaponExpend = EngageWeaponExpend + self.EngageAttackQty = EngageAttackQty + self.EngageDirection = EngageDirection + + if Controllable:IsAlive() then + + local EngageRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToEngageZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + self.EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = CurrentRoutePoint + + local AttackTasks = {} + + for DetectedUnitID, DetectedUnit in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( DetectedUnit ) + if DetectedUnit:IsAlive() then + if DetectedUnit:IsInZone( self.EngageZone ) then + self:E( {"Engaging ", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit, + true, + EngageWeaponExpend, + EngageAttackQty, + EngageDirection + ) + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + EngageRoute[1].task = Controllable:TaskCombo( AttackTasks ) + + --- Define a random point in the @{Zone}. The AI will fly to that point within the zone. + + --- Find a random 2D point in EngageZone. + local ToTargetVec2 = self.EngageZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, self.EngageAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToTargetRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + self.EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = ToTargetRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + Controllable:WayPointInitialize( EngageRoute ) + + --- Do a trick, link the NewEngageRoute function of the object to the AIControllable in a temporary variable ... + Controllable:SetState( Controllable, "EngageZone", self ) + + Controllable:WayPointFunction( #EngageRoute, 1, "_NewEngageRoute" ) + + --- NOW ROUTE THE GROUP! + Controllable:WayPointExecute( 1 ) + + Controllable:OptionROEOpenFire() + Controllable:OptionROTVertical() + + self:SetDetectionInterval( 2 ) + self:SetDetectionActivated() + self:__Target( -2 ) -- Start Targetting + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterAccomplish( Controllable, From, Event, To ) + self.Accomplished = true + self:SetDetectionDeactivated() +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param Core.Event#EVENTDATA EventData +function AI_CAS_ZONE:onafterDestroy( Controllable, From, Event, To, EventData ) + + if EventData.IniUnit then + self.DetectedUnits[EventData.IniUnit] = nil + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_CAS_ZONE:OnEventDead( EventData ) + self:F( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit] then + self:__Destroy( 1, EventData ) + end + end +end + + +--- **AI** - **Execute Combat Air Patrol (CAP).** +-- +-- ![Banner Image](..\Presentations\AI_CAP\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_CAP_ZONE} class, extends @{AI_CAP#AI_PATROL_ZONE} +-- +-- The @{#AI_CAP_ZONE} class implements the core functions to patrol a @{Zone} by an AI @{Controllable} or @{Group} +-- and automatically engage any airborne enemies that are within a certain range or within a certain zone. +-- +-- ![Process](..\Presentations\AI_CAP\Dia3.JPG) +-- +-- The AI_CAP_ZONE is assigned a @{Group} and this must be done before the AI_CAP_ZONE process can be started using the **Start** event. +-- +-- ![Process](..\Presentations\AI_CAP\Dia4.JPG) +-- +-- The AI will fly towards the random 3D point within the patrol zone, using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- +-- ![Process](..\Presentations\AI_CAP\Dia5.JPG) +-- +-- This cycle will continue. +-- +-- ![Process](..\Presentations\AI_CAP\Dia6.JPG) +-- +-- During the patrol, the AI will detect enemy targets, which are reported through the **Detected** event. +-- +-- ![Process](..\Presentations\AI_CAP\Dia9.JPG) +-- +-- When enemies are detected, the AI will automatically engage the enemy. +-- +-- ![Process](..\Presentations\AI_CAP\Dia10.JPG) +-- +-- Until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Process](..\Presentations\AI_CAP\Dia13.JPG) +-- +-- ## 1.1) AI_CAP_ZONE constructor +-- +-- * @{#AI_CAP_ZONE.New}(): Creates a new AI_CAP_ZONE object. +-- +-- ## 1.2) AI_CAP_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_CAP\Dia2.JPG) +-- +-- ### 1.2.1) AI_CAP_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Engaging** ( Group ): The AI is engaging the bogeys. +-- * **Returning** ( Group ): The AI is returning to Base.. +-- +-- ### 1.2.2) AI_CAP_ZONE Events +-- +-- * **@{AI_Patrol#AI_PATROL_ZONE.Start}**: Start the process. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Route}**: Route the AI to a new random 3D point within the Patrol Zone. +-- * **@{#AI_CAP_ZONE.Engage}**: Let the AI engage the bogeys. +-- * **@{#AI_CAP_ZONE.Abort}**: Aborts the engagement and return patrolling in the patrol zone. +-- * **@{AI_Patrol#AI_PATROL_ZONE.RTB}**: Route the AI to the home base. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detect}**: The AI is detecting targets. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detected}**: The AI has detected new targets. +-- * **@{#AI_CAP_ZONE.Destroy}**: The AI has destroyed a bogey @{Unit}. +-- * **@{#AI_CAP_ZONE.Destroyed}**: The AI has destroyed all bogeys @{Unit}s assigned in the CAS task. +-- * **Status** ( Group ): The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ## 1.3) Set the Range of Engagement +-- +-- ![Range](..\Presentations\AI_CAP\Dia11.JPG) +-- +-- An optional range can be set in meters, +-- that will define when the AI will engage with the detected airborne enemy targets. +-- The range can be beyond or smaller than the range of the Patrol Zone. +-- The range is applied at the position of the AI. +-- Use the method @{AI_CAP#AI_CAP_ZONE.SetEngageRange}() to define that range. +-- +-- ## 1.4) Set the Zone of Engagement +-- +-- ![Zone](..\Presentations\AI_CAP\Dia12.JPG) +-- +-- An optional @{Zone} can be set, +-- that will define when the AI will engage with the detected airborne enemy targets. +-- Use the method @{AI_Cap#AI_CAP_ZONE.SetEngageZone}() to define that Zone. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-15: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Quax](https://forums.eagle.ru/member.php?u=90530)**: Concept, Advice & Testing. +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Concept, Advice & Testing. +-- * **[Gunterlund](http://forums.eagle.ru:8080/member.php?u=75036)**: Test case revision. +-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing. +-- * **[Delta99](https://forums.eagle.ru/member.php?u=125166): Testing. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module AI_Cap + + +--- AI_CAP_ZONE class +-- @type AI_CAP_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE TargetZone The @{Zone} where the patrol needs to be executed. +-- @extends AI.AI_Patrol#AI_PATROL_ZONE +AI_CAP_ZONE = { + ClassName = "AI_CAP_ZONE", +} + + + +--- Creates a new AI_CAP_ZONE object +-- @param #AI_CAP_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) ) -- #AI_CAP_ZONE + + self.Accomplished = false + self.Engaging = false + + self:AddTransition( { "Patrolling", "Engaging" }, "Engage", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Engage. + -- @function [parent=#AI_CAP_ZONE] OnBeforeEngage + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Engage. + -- @function [parent=#AI_CAP_ZONE] OnAfterEngage + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAP_ZONE] Engage + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAP_ZONE] __Engage + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Engaging. +-- @function [parent=#AI_CAP_ZONE] OnLeaveEngaging +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Engaging. +-- @function [parent=#AI_CAP_ZONE] OnEnterEngaging +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Engaging", "Fired", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Fired. + -- @function [parent=#AI_CAP_ZONE] OnBeforeFired + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fired. + -- @function [parent=#AI_CAP_ZONE] OnAfterFired + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAP_ZONE] Fired + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAP_ZONE] __Fired + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Destroy", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] OnBeforeDestroy + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] OnAfterDestroy + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] Destroy + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] __Destroy + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Engaging", "Abort", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Abort. + -- @function [parent=#AI_CAP_ZONE] OnBeforeAbort + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Abort. + -- @function [parent=#AI_CAP_ZONE] OnAfterAbort + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAP_ZONE] Abort + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAP_ZONE] __Abort + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Engaging", "Accomplish", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] OnBeforeAccomplish + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] OnAfterAccomplish + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] Accomplish + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] __Accomplish + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + return self +end + + +--- Set the Engage Zone which defines where the AI will engage bogies. +-- @param #AI_CAP_ZONE self +-- @param Core.Zone#ZONE EngageZone The zone where the AI is performing CAP. +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:SetEngageZone( EngageZone ) + self:F2() + + if EngageZone then + self.EngageZone = EngageZone + else + self.EngageZone = nil + end +end + +--- Set the Engage Range when the AI will engage with airborne enemies. +-- @param #AI_CAP_ZONE self +-- @param #number EngageRange The Engage Range. +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:SetEngageRange( EngageRange ) + self:F2() + + if EngageRange then + self.EngageRange = EngageRange + else + self.EngageRange = nil + end +end + +--- onafter State Transition for Event Start. +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterStart( Controllable, From, Event, To ) + + -- Call the parent Start event handler + self:GetParent(self).onafterStart( self, Controllable, From, Event, To ) + self:HandleEvent( EVENTS.Dead ) + +end + +-- todo: need to fix this global function + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +function _NewEngageCapRoute( AIControllable ) + + AIControllable:T( "NewEngageRoute" ) + local EngageZone = AIControllable:GetState( AIControllable, "EngageZone" ) -- AI.AI_Cap#AI_CAP_ZONE + EngageZone:__Engage( 1 ) +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onbeforeEngage( Controllable, From, Event, To ) + + if self.Accomplished == true then + return false + end +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterDetected( Controllable, From, Event, To ) + + if From ~= "Engaging" then + + local Engage = false + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( DetectedUnit ) + if DetectedUnit:IsAlive() and DetectedUnit:IsAir() then + Engage = true + break + end + end + + if Engage == true then + self:E( 'Detected -> Engaging' ) + self:__Engage( 1 ) + end + end +end + + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterAbort( Controllable, From, Event, To ) + Controllable:ClearTasks() + self:__Route( 1 ) +end + + + + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterEngage( Controllable, From, Event, To ) + + if Controllable:IsAlive() then + + local EngageRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToEngageZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToEngageZoneSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = CurrentRoutePoint + + + --- Find a random 2D point in PatrolZone. + local ToTargetVec2 = self.PatrolZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Define Speed and Altitude. + local ToTargetAltitude = math.random( self.EngageFloorAltitude, self.EngageCeilingAltitude ) + local ToTargetSpeed = math.random( self.PatrolMinSpeed, self.PatrolMaxSpeed ) + self:T2( { self.PatrolMinSpeed, self.PatrolMaxSpeed, ToTargetSpeed } ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, ToTargetAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToPatrolRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToTargetSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = ToPatrolRoutePoint + + Controllable:OptionROEOpenFire() + Controllable:OptionROTPassiveDefense() + + local AttackTasks = {} + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( { DetectedUnit, DetectedUnit:IsAlive(), DetectedUnit:IsAir() } ) + if DetectedUnit:IsAlive() and DetectedUnit:IsAir() then + if self.EngageZone then + if DetectedUnit:IsInZone( self.EngageZone ) then + self:E( {"Within Zone and Engaging ", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + else + if self.EngageRange then + if DetectedUnit:GetPointVec3():Get2DDistance(Controllable:GetPointVec3() ) <= self.EngageRange then + self:E( {"Within Range and Engaging", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + else + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( EngageRoute ) + + + if #AttackTasks == 0 then + self:E("No targets found -> Going back to Patrolling") + self:__Abort( 1 ) + self:__Route( 1 ) + self:SetDetectionActivated() + else + EngageRoute[1].task = Controllable:TaskCombo( AttackTasks ) + + --- Do a trick, link the NewEngageRoute function of the object to the AIControllable in a temporary variable ... + self.Controllable:SetState( self.Controllable, "EngageZone", self ) + + self.Controllable:WayPointFunction( #EngageRoute, 1, "_NewEngageCapRoute" ) + + self:SetDetectionDeactivated() + end + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 2 ) + + end +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterAccomplish( Controllable, From, Event, To ) + self.Accomplished = true + self:SetDetectionOff() +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param Core.Event#EVENTDATA EventData +function AI_CAP_ZONE:onafterDestroy( Controllable, From, Event, To, EventData ) + + if EventData.IniUnit then + self.DetectedUnits[EventData.IniUnit] = nil + end +end + +--- @param #AI_CAP_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_CAP_ZONE:OnEventDead( EventData ) + self:F( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit] then + self:__Destroy( 1, EventData ) + end + end +end +---Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Ground** -- +-- **Management of logical cargo objects, that can be transported from and to transportation carriers.** +-- +-- ![Banner Image](..\Presentations\AI_CARGO\CARGO.JPG) +-- +-- === +-- +-- Cargo can be of various forms, always are composed out of ONE object ( one unit or one static or one slingload crate ): +-- +-- * AI_CARGO_UNIT, represented by a @{Unit} in a @{Group}: Cargo can be represented by a Unit in a Group. Destruction of the Unit will mean that the cargo is lost. +-- * CARGO_STATIC, represented by a @{Static}: Cargo can be represented by a Static. Destruction of the Static will mean that the cargo is lost. +-- * AI_CARGO_PACKAGE, contained in a @{Unit} of a @{Group}: Cargo can be contained within a Unit of a Group. The cargo can be **delivered** by the @{Unit}. If the Unit is destroyed, the cargo will be destroyed also. +-- * AI_CARGO_PACKAGE, Contained in a @{Static}: Cargo can be contained within a Static. The cargo can be **collected** from the @Static. If the @{Static} is destroyed, the cargo will be destroyed. +-- * CARGO_SLINGLOAD, represented by a @{Cargo} that is transportable: Cargo can be represented by a Cargo object that is transportable. Destruction of the Cargo will mean that the cargo is lost. +-- +-- * AI_CARGO_GROUPED, represented by a Group of CARGO_UNITs. +-- +-- # 1) @{#AI_CARGO} class, extends @{Fsm#FSM_PROCESS} +-- +-- The @{#AI_CARGO} class defines the core functions that defines a cargo object within MOOSE. +-- A cargo is a logical object defined that is available for transport, and has a life status within a simulation. +-- +-- The AI_CARGO is a state machine: it manages the different events and states of the cargo. +-- All derived classes from AI_CARGO follow the same state machine, expose the same cargo event functions, and provide the same cargo states. +-- +-- ## 1.2.1) AI_CARGO Events: +-- +-- * @{#AI_CARGO.Board}( ToCarrier ): Boards the cargo to a carrier. +-- * @{#AI_CARGO.Load}( ToCarrier ): Loads the cargo into a carrier, regardless of its position. +-- * @{#AI_CARGO.UnBoard}( ToPointVec2 ): UnBoard the cargo from a carrier. This will trigger a movement of the cargo to the option ToPointVec2. +-- * @{#AI_CARGO.UnLoad}( ToPointVec2 ): UnLoads the cargo from a carrier. +-- * @{#AI_CARGO.Dead}( Controllable ): The cargo is dead. The cargo process will be ended. +-- +-- ## 1.2.2) AI_CARGO States: +-- +-- * **UnLoaded**: The cargo is unloaded from a carrier. +-- * **Boarding**: The cargo is currently boarding (= running) into a carrier. +-- * **Loaded**: The cargo is loaded into a carrier. +-- * **UnBoarding**: The cargo is currently unboarding (=running) from a carrier. +-- * **Dead**: The cargo is dead ... +-- * **End**: The process has come to an end. +-- +-- ## 1.2.3) AI_CARGO state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Leaving** the state. +-- The state transition method needs to start with the name **OnLeave + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **Entering** the state. +-- The state transition method needs to start with the name **OnEnter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- # 2) #AI_CARGO_UNIT class +-- +-- The AI_CARGO_UNIT class defines a cargo that is represented by a UNIT object within the simulator, and can be transported by a carrier. +-- Use the event functions as described above to Load, UnLoad, Board, UnBoard the AI_CARGO_UNIT objects to and from carriers. +-- +-- # 5) #AI_CARGO_GROUPED class +-- +-- The AI_CARGO_GROUPED class defines a cargo that is represented by a group of UNIT objects within the simulator, and can be transported by a carrier. +-- Use the event functions as described above to Load, UnLoad, Board, UnBoard the AI_CARGO_UNIT objects to and from carriers. +-- +-- This module is still under construction, but is described above works already, and will keep working ... +-- +-- @module Cargo + +-- Events + +-- Board + +--- Boards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo to the Carrier. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] Board +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + +--- Boards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo to the Carrier. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] __Board +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + + +-- UnBoard + +--- UnBoards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo from the Carrier. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] UnBoard +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo should run after onboarding. If not provided, the cargo will run to 60 meters behind the Carrier location. + +--- UnBoards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo from the Carrier. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] __UnBoard +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo should run after onboarding. If not provided, the cargo will run to 60 meters behind the Carrier location. + + +-- Load + +--- Loads the cargo to a Carrier. The event will load the cargo into the Carrier regardless of its position. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] Load +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + +--- Loads the cargo to a Carrier. The event will load the cargo into the Carrier regardless of its position. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] __Load +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + + +-- UnLoad + +--- UnLoads the cargo to a Carrier. The event will unload the cargo from the Carrier. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] UnLoad +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo will be placed after unloading. If not provided, the cargo will be placed 60 meters behind the Carrier location. + +--- UnLoads the cargo to a Carrier. The event will unload the cargo from the Carrier. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] __UnLoad +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo will be placed after unloading. If not provided, the cargo will be placed 60 meters behind the Carrier location. + +-- State Transition Functions + +-- UnLoaded + +--- @function [parent=#AI_CARGO] OnLeaveUnLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterUnLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- Loaded + +--- @function [parent=#AI_CARGO] OnLeaveLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- Boarding + +--- @function [parent=#AI_CARGO] OnLeaveBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- UnBoarding + +--- @function [parent=#AI_CARGO] OnLeaveUnBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterUnBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + + +-- TODO: Find all Carrier objects and make the type of the Carriers Wrapper.Unit#UNIT in the documentation. + +CARGOS = {} + +do -- AI_CARGO + + --- @type AI_CARGO + -- @extends Core.Fsm#FSM_PROCESS + -- @field #string Type A string defining the type of the cargo. eg. Engineers, Equipment, Screwdrivers. + -- @field #string Name A string defining the name of the cargo. The name is the unique identifier of the cargo. + -- @field #number Weight A number defining the weight of the cargo. The weight is expressed in kg. + -- @field #number ReportRadius (optional) A number defining the radius in meters when the cargo is signalling or reporting to a Carrier. + -- @field #number NearRadius (optional) A number defining the radius in meters when the cargo is near to a Carrier, so that it can be loaded. + -- @field Wrapper.Controllable#CONTROLLABLE CargoObject The alive DCS object representing the cargo. This value can be nil, meaning, that the cargo is not represented anywhere... + -- @field Wrapper.Controllable#CONTROLLABLE CargoCarrier The alive DCS object carrying the cargo. This value can be nil, meaning, that the cargo is not contained anywhere... + -- @field #boolean Slingloadable This flag defines if the cargo can be slingloaded. + -- @field #boolean Moveable This flag defines if the cargo is moveable. + -- @field #boolean Representable This flag defines if the cargo can be represented by a DCS Unit. + -- @field #boolean Containable This flag defines if the cargo can be contained within a DCS Unit. + AI_CARGO = { + ClassName = "AI_CARGO", + Type = nil, + Name = nil, + Weight = nil, + CargoObject = nil, + CargoCarrier = nil, + Representable = false, + Slingloadable = false, + Moveable = false, + Containable = false, + } + +--- @type AI_CARGO.CargoObjects +-- @map < #string, Wrapper.Positionable#POSITIONABLE > The alive POSITIONABLE objects representing the the cargo. + + +--- AI_CARGO Constructor. This class is an abstract class and should not be instantiated. +-- @param #AI_CARGO self +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO +function AI_CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) + + local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM_CONTROLLABLE + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:SetStartState( "UnLoaded" ) + self:AddTransition( "UnLoaded", "Board", "Boarding" ) + self:AddTransition( "Boarding", "Boarding", "Boarding" ) + self:AddTransition( "Boarding", "Load", "Loaded" ) + self:AddTransition( "UnLoaded", "Load", "Loaded" ) + self:AddTransition( "Loaded", "UnBoard", "UnBoarding" ) + self:AddTransition( "UnBoarding", "UnBoarding", "UnBoarding" ) + self:AddTransition( "UnBoarding", "UnLoad", "UnLoaded" ) + self:AddTransition( "Loaded", "UnLoad", "UnLoaded" ) + + + self.Type = Type + self.Name = Name + self.Weight = Weight + self.ReportRadius = ReportRadius + self.NearRadius = NearRadius + self.CargoObject = nil + self.CargoCarrier = nil + self.Representable = false + self.Slingloadable = false + self.Moveable = false + self.Containable = false + + + self.CargoScheduler = SCHEDULER:New() + + CARGOS[self.Name] = self + + return self +end + + +--- Template method to spawn a new representation of the AI_CARGO in the simulator. +-- @param #AI_CARGO self +-- @return #AI_CARGO +function AI_CARGO:Spawn( PointVec2 ) + self:F() + +end + + +--- Check if CargoCarrier is near the Cargo to be Loaded. +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 PointVec2 +-- @return #boolean +function AI_CARGO:IsNear( PointVec2 ) + self:F( { PointVec2 } ) + + local Distance = PointVec2:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) + self:T( Distance ) + + if Distance <= self.NearRadius then + return true + else + return false + end +end + +end + +do -- AI_CARGO_REPRESENTABLE + + --- @type AI_CARGO_REPRESENTABLE + -- @extends #AI_CARGO + AI_CARGO_REPRESENTABLE = { + ClassName = "AI_CARGO_REPRESENTABLE" + } + +--- AI_CARGO_REPRESENTABLE Constructor. +-- @param #AI_CARGO_REPRESENTABLE self +-- @param Wrapper.Controllable#Controllable CargoObject +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_REPRESENTABLE +function AI_CARGO_REPRESENTABLE:New( CargoObject, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + return self +end + +--- Route a cargo unit to a PointVec2. +-- @param #AI_CARGO_REPRESENTABLE self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #number Speed +-- @return #AI_CARGO_REPRESENTABLE +function AI_CARGO_REPRESENTABLE:RouteTo( ToPointVec2, Speed ) + self:F2( ToPointVec2 ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = ToPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 2 ) + return self +end + +end -- AI_CARGO + +do -- AI_CARGO_UNIT + + --- @type AI_CARGO_UNIT + -- @extends #AI_CARGO_REPRESENTABLE + AI_CARGO_UNIT = { + ClassName = "AI_CARGO_UNIT" + } + +--- AI_CARGO_UNIT Constructor. +-- @param #AI_CARGO_UNIT self +-- @param Wrapper.Unit#UNIT CargoUnit +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_UNIT +function AI_CARGO_UNIT:New( CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_REPRESENTABLE:New( CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO_UNIT + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoUnit ) + self.CargoObject = CargoUnit + + self:T( self.ClassName ) + + return self +end + +--- Enter UnBoarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2 ) + self:F() + + local Angle = 180 + local Speed = 10 + local DeployDistance = 5 + local RouteDistance = 60 + + if From == "Loaded" then + + local CargoCarrierPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( DeployDistance, CargoDeployHeading ) + local CargoRoutePointVec2 = CargoCarrierPointVec2:Translate( RouteDistance, CargoDeployHeading ) + + -- if there is no ToPointVec2 given, then use the CargoRoutePointVec2 + ToPointVec2 = ToPointVec2 or CargoRoutePointVec2 + + local FromPointVec2 = CargoCarrierPointVec2 + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) + self.CargoCarrier = nil + + local Points = {} + Points[#Points+1] = FromPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = ToPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 1 ) + + self:__UnBoarding( 1, ToPointVec2 ) + end + end + +end + +--- Leave UnBoarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onleaveUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + if self:IsNear( ToPointVec2 ) then + return true + else + self:__UnBoarding( 1, ToPointVec2 ) + end + return false + end + +end + +--- UnBoard Event. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onafterUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + self.CargoInAir = self.CargoObject:InAir() + + self:T( self.CargoInAir ) + + -- Only unboard the cargo when the carrier 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 + + end + + self:__UnLoad( 1, ToPointVec2 ) + +end + + + +--- Enter UnLoaded State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 +function AI_CARGO_UNIT:onenterUnLoaded( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "Loaded" then + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) + + ToPointVec2 = ToPointVec2 or POINT_VEC2:New( CargoDeployPointVec2:GetX(), CargoDeployPointVec2:GetY() ) + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( ToPointVec2:GetVec3(), 0 ) + self.CargoCarrier = nil + end + + end + + if self.OnUnLoadedCallBack then + self.OnUnLoadedCallBack( self, unpack( self.OnUnLoadedParameters ) ) + self.OnUnLoadedCallBack = nil + end + +end + + + +--- Enter Boarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onenterBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local Speed = 10 + local Angle = 180 + local Distance = 5 + + if From == "UnLoaded" then + local CargoCarrierPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( Distance, CargoDeployHeading ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 2 ) + end + +end + +--- Leave Boarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onleaveBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if self:IsNear( CargoCarrier:GetPointVec2() ) then + self:__Load( 1, CargoCarrier ) + return true + else + self:__Boarding( 1, CargoCarrier ) + end + return false +end + +--- Loaded State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onenterLoaded( From, Event, To, CargoCarrier ) + self:F() + + self.CargoCarrier = CargoCarrier + + -- Only destroy the CargoObject is if there is a CargoObject (packages don't have CargoObjects). + if self.CargoObject then + self:T("Destroying") + self.CargoObject:Destroy() + end +end + + +--- Board Event. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_UNIT:onafterBoard( From, Event, To, CargoCarrier ) + self:F() + + self.CargoInAir = self.CargoObject: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 + self:Load( CargoCarrier ) + end + +end + +end + +do -- AI_CARGO_PACKAGE + + --- @type AI_CARGO_PACKAGE + -- @extends #AI_CARGO_REPRESENTABLE + AI_CARGO_PACKAGE = { + ClassName = "AI_CARGO_PACKAGE" + } + +--- AI_CARGO_PACKAGE Constructor. +-- @param #AI_CARGO_PACKAGE self +-- @param Wrapper.Unit#UNIT CargoCarrier The UNIT carrying the package. +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_PACKAGE +function AI_CARGO_PACKAGE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_REPRESENTABLE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO_PACKAGE + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoCarrier ) + self.CargoCarrier = CargoCarrier + + return self +end + +--- Board Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #number Speed +-- @param #number BoardDistance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterOnBoard( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only move the CargoCarrier to the New CargoCarrier when the New CargoCarrier is not in the air. + if not self.CargoInAir then + + local Points = {} + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = CargoCarrier:GetPointVec2():Translate( BoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:Boarded( CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + +end + +--- Check if CargoCarrier is near the Cargo to be Loaded. +-- @param #AI_CARGO_PACKAGE self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @return #boolean +function AI_CARGO_PACKAGE:IsNear( CargoCarrier ) + self:F() + + local CargoCarrierPoint = CargoCarrier:GetPointVec2() + + local Distance = CargoCarrierPoint:DistanceFromPointVec2( self.CargoCarrier:GetPointVec2() ) + self:T( Distance ) + + if Distance <= self.NearRadius then + return true + else + return false + end +end + +--- Boarded Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_PACKAGE:onafterOnBoarded( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:__Load( 1, CargoCarrier, Speed, LoadDistance, Angle ) + else + self:__Boarded( 1, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + end +end + +--- UnBoard Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Speed +-- @param #number UnLoadDistance +-- @param #number UnBoardDistance +-- @param #number Radius +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterUnBoard( From, Event, To, CargoCarrier, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only unboard the cargo when the carrier 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 + + self:_Next( self.FsmP.UnLoad, UnLoadDistance, Angle ) + + local Points = {} + + local StartPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = StartPointVec2:Translate( UnBoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = CargoCarrier:TaskRoute( Points ) + CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:__UnBoarded( 1 , CargoCarrier, Speed ) + +end + +--- UnBoarded Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_PACKAGE:onafterUnBoarded( From, Event, To, CargoCarrier, Speed ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:__UnLoad( 1, CargoCarrier, Speed ) + else + self:__UnBoarded( 1, CargoCarrier, Speed ) + end +end + +--- Load Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #number Speed +-- @param #number LoadDistance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterLoad( From, Event, To, CargoCarrier, Speed, LoadDistance, Angle ) + self:F() + + self.CargoCarrier = CargoCarrier + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( LoadDistance, CargoDeployHeading ) + + local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + +end + +--- UnLoad Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Distance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterUnLoad( From, Event, To, CargoCarrier, Speed, Distance, Angle ) + self:F() + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) + + self.CargoCarrier = CargoCarrier + + local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + +end + + +end + +do -- AI_CARGO_GROUP + + --- @type AI_CARGO_GROUP + -- @extends AI.AI_Cargo#AI_CARGO + -- @field Set#SET_BASE CargoSet A set of cargo objects. + -- @field #string Name A string defining the name of the cargo group. The name is the unique identifier of the cargo. + AI_CARGO_GROUP = { + ClassName = "AI_CARGO_GROUP", + } + +--- AI_CARGO_GROUP constructor. +-- @param #AI_CARGO_GROUP self +-- @param Core.Set#Set_BASE CargoSet +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_GROUP +function AI_CARGO_GROUP:New( CargoSet, Type, Name, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO:New( Type, Name, 0, ReportRadius, NearRadius ) ) -- #AI_CARGO_GROUP + self:F( { Type, Name, ReportRadius, NearRadius } ) + + self.CargoSet = CargoSet + + + return self +end + +end -- AI_CARGO_GROUP + +do -- AI_CARGO_GROUPED + + --- @type AI_CARGO_GROUPED + -- @extends AI.AI_Cargo#AI_CARGO_GROUP + AI_CARGO_GROUPED = { + ClassName = "AI_CARGO_GROUPED", + } + +--- AI_CARGO_GROUPED constructor. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Set#Set_BASE CargoSet +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_GROUPED +function AI_CARGO_GROUPED:New( CargoSet, Type, Name, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_GROUP:New( CargoSet, Type, Name, ReportRadius, NearRadius ) ) -- #AI_CARGO_GROUPED + self:F( { Type, Name, ReportRadius, NearRadius } ) + + return self +end + +--- Enter Boarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if From == "UnLoaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:__Board( 1, CargoCarrier ) + end + ) + + self:__Boarding( 1, CargoCarrier ) + end + +end + +--- Enter Loaded State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterLoaded( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if From == "UnLoaded" then + -- For each Cargo object within the AI_CARGO_GROUPED, load each cargo to the CargoCarrier. + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + Cargo:Load( CargoCarrier ) + end + end +end + +--- Leave Boarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onleaveBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local Boarded = true + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( Cargo.current ) + if not Cargo:is( "Loaded" ) then + Boarded = false + end + end + + if not Boarded then + self:__Boarding( 1, CargoCarrier ) + else + self:__Load( 1, CargoCarrier ) + end + return Boarded +end + +--- Enter UnBoarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterUnBoarding( From, Event, To, ToPointVec2 ) + self:F() + + local Timer = 1 + + if From == "Loaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:__UnBoard( Timer, ToPointVec2 ) + Timer = Timer + 10 + end + ) + + self:__UnBoarding( 1, ToPointVec2 ) + end + +end + +--- Leave UnBoarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onleaveUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + local UnBoarded = true + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( Cargo.current ) + if not Cargo:is( "UnLoaded" ) then + UnBoarded = false + end + end + + if UnBoarded then + return true + else + self:__UnBoarding( 1, ToPointVec2 ) + end + + return false + end + +end + +--- UnBoard Event. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onafterUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + self:__UnLoad( 1, ToPointVec2 ) +end + + + +--- Enter UnLoaded State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterUnLoaded( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + if From == "Loaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:UnLoad( ToPointVec2 ) + end + ) + + end + +end + +end -- AI_CARGO_GROUPED + + + +--- (SP) (MP) (FSM) Accept or reject process for player (task) assignments. +-- +-- === +-- +-- # @{#ACT_ASSIGN} FSM template class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ASSIGN state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ASSIGN **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: Start the tasking acceptance process. +-- * **Assign**: Assign the task. +-- * **Reject**: Reject the task.. +-- +-- ### ACT_ASSIGN **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ASSIGN **States**: +-- +-- * **UnAssigned**: The player has not accepted the task. +-- * **Assigned (*)**: The player has accepted the task. +-- * **Rejected (*)**: The player has not accepted the task. +-- * **Waiting**: The process is awaiting player feedback. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ASSIGN state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ASSIGN_ACCEPT} class, extends @{Fsm.Assign#ACT_ASSIGN} +-- +-- The ACT_ASSIGN_ACCEPT class accepts by default a task for a player. No player intervention is allowed to reject the task. +-- +-- ## 1.1) ACT_ASSIGN_ACCEPT constructor: +-- +-- * @{#ACT_ASSIGN_ACCEPT.New}(): Creates a new ACT_ASSIGN_ACCEPT object. +-- +-- === +-- +-- # 2) @{#ACT_ASSIGN_MENU_ACCEPT} class, extends @{Fsm.Assign#ACT_ASSIGN} +-- +-- The ACT_ASSIGN_MENU_ACCEPT class accepts a task when the player accepts the task through an added menu option. +-- This assignment type is useful to conditionally allow the player to choose whether or not he would accept the task. +-- The assignment type also allows to reject the task. +-- +-- ## 2.1) ACT_ASSIGN_MENU_ACCEPT constructor: +-- ----------------------------------------- +-- +-- * @{#ACT_ASSIGN_MENU_ACCEPT.New}(): Creates a new ACT_ASSIGN_MENU_ACCEPT object. +-- +-- === +-- +-- @module Assign + + +do -- ACT_ASSIGN + + --- ACT_ASSIGN class + -- @type ACT_ASSIGN + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends Core.Fsm#FSM_PROCESS + ACT_ASSIGN = { + ClassName = "ACT_ASSIGN", + } + + + --- Creates a new task assignment state machine. The process will accept the task by default, no player intervention accepted. + -- @param #ACT_ASSIGN self + -- @return #ACT_ASSIGN The task acceptance process. + function ACT_ASSIGN:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ASSIGN" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "UnAssigned", "Start", "Waiting" ) + self:AddTransition( "Waiting", "Assign", "Assigned" ) + self:AddTransition( "Waiting", "Reject", "Rejected" ) + self:AddTransition( "*", "Fail", "Failed" ) + + self:AddEndState( "Assigned" ) + self:AddEndState( "Rejected" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "UnAssigned" ) + + return self + end + +end -- ACT_ASSIGN + + + +do -- ACT_ASSIGN_ACCEPT + + --- ACT_ASSIGN_ACCEPT class + -- @type ACT_ASSIGN_ACCEPT + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIGN + ACT_ASSIGN_ACCEPT = { + ClassName = "ACT_ASSIGN_ACCEPT", + } + + + --- Creates a new task assignment state machine. The process will accept the task by default, no player intervention accepted. + -- @param #ACT_ASSIGN_ACCEPT self + -- @param #string TaskBriefing + function ACT_ASSIGN_ACCEPT:New( TaskBriefing ) + + local self = BASE:Inherit( self, ACT_ASSIGN:New() ) -- #ACT_ASSIGN_ACCEPT + + self.TaskBriefing = TaskBriefing + + return self + end + + function ACT_ASSIGN_ACCEPT:Init( FsmAssign ) + + self.TaskBriefing = FsmAssign.TaskBriefing + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_ACCEPT self + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_ACCEPT:onafterStart( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:__Assign( 1 ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_ACCEPT self + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_ACCEPT:onenterAssigned( ProcessUnit, From, Event, To ) + env.info( "in here" ) + self:E( { ProcessUnit, From, Event, To } ) + + local ProcessGroup = ProcessUnit:GetGroup() + + self:Message( "You are assigned to the task " .. self.Task:GetName() ) + + self.Task:Assign( ProcessUnit, ProcessUnit:GetPlayerName() ) + end + +end -- ACT_ASSIGN_ACCEPT + + +do -- ACT_ASSIGN_MENU_ACCEPT + + --- ACT_ASSIGN_MENU_ACCEPT class + -- @type ACT_ASSIGN_MENU_ACCEPT + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIGN + ACT_ASSIGN_MENU_ACCEPT = { + ClassName = "ACT_ASSIGN_MENU_ACCEPT", + } + + --- Init. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param #string TaskName + -- @param #string TaskBriefing + -- @return #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:New( TaskName, TaskBriefing ) + + -- Inherits from BASE + local self = BASE:Inherit( self, ACT_ASSIGN:New() ) -- #ACT_ASSIGN_MENU_ACCEPT + + self.TaskName = TaskName + self.TaskBriefing = TaskBriefing + + return self + end + + function ACT_ASSIGN_MENU_ACCEPT:Init( FsmAssign ) + + self.TaskName = FsmAssign.TaskName + self.TaskBriefing = FsmAssign.TaskBriefing + end + + + --- Creates a new task assignment state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param #string TaskName + -- @param #string TaskBriefing + -- @return #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:Init( TaskName, TaskBriefing ) + + self.TaskBriefing = TaskBriefing + self.TaskName = TaskName + + return self + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterStart( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:Message( "Access the radio menu to accept the task. You have 30 seconds or the assignment will be cancelled." ) + + local ProcessGroup = ProcessUnit:GetGroup() + + self.Menu = MENU_GROUP:New( ProcessGroup, "Task " .. self.TaskName .. " acceptance" ) + self.MenuAcceptTask = MENU_GROUP_COMMAND:New( ProcessGroup, "Accept task " .. self.TaskName, self.Menu, self.MenuAssign, self ) + self.MenuRejectTask = MENU_GROUP_COMMAND:New( ProcessGroup, "Reject task " .. self.TaskName, self.Menu, self.MenuReject, self ) + end + + --- Menu function. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:MenuAssign() + self:E( ) + + self:__Assign( 1 ) + end + + --- Menu function. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:MenuReject() + self:E( ) + + self:__Reject( 1 ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterAssign( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit.UnitNameFrom, Event, To } ) + + self.Menu:Remove() + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterReject( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit.UnitName, From, Event, To } ) + + self.Menu:Remove() + --TODO: need to resolve this problem ... it has to do with the events ... + --self.Task:UnAssignFromUnit( ProcessUnit )needs to become a callback funtion call upon the event + ProcessUnit:Destroy() + end + +end -- ACT_ASSIGN_MENU_ACCEPT +--- (SP) (MP) (FSM) Route AI or players through waypoints or to zones. +-- +-- === +-- +-- # @{#ACT_ROUTE} FSM class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ROUTE state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ROUTE **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: The process is started. The process will go into the Report state. +-- * **Report**: The process is reporting to the player the route to be followed. +-- * **Route**: The process is routing the controllable. +-- * **Pause**: The process is pausing the route of the controllable. +-- * **Arrive**: The controllable has arrived at a route point. +-- * **More**: There are more route points that need to be followed. The process will go back into the Report state. +-- * **NoMore**: There are no more route points that need to be followed. The process will go into the Success state. +-- +-- ### ACT_ROUTE **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ROUTE **States**: +-- +-- * **None**: The controllable did not receive route commands. +-- * **Arrived (*)**: The controllable has arrived at a route point. +-- * **Aborted (*)**: The controllable has aborted the route path. +-- * **Routing**: The controllable is understay to the route point. +-- * **Pausing**: The process is pausing the routing. AI air will go into hover, AI ground will stop moving. Players can fly around. +-- * **Success (*)**: All route points were reached. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ROUTE state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ROUTE_ZONE} class, extends @{Fsm.Route#ACT_ROUTE} +-- +-- The ACT_ROUTE_ZONE class implements the core functions to route an AIR @{Controllable} player @{Unit} to a @{Zone}. +-- The player receives on perioding times messages with the coordinates of the route to follow. +-- Upon arrival at the zone, a confirmation of arrival is sent, and the process will be ended. +-- +-- # 1.1) ACT_ROUTE_ZONE constructor: +-- +-- * @{#ACT_ROUTE_ZONE.New}(): Creates a new ACT_ROUTE_ZONE object. +-- +-- === +-- +-- @module Route + + +do -- ACT_ROUTE + + --- ACT_ROUTE class + -- @type ACT_ROUTE + -- @field Tasking.Task#TASK TASK + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE Zone + -- @extends Core.Fsm#FSM_PROCESS + ACT_ROUTE = { + ClassName = "ACT_ROUTE", + } + + + --- Creates a new routing state machine. The process will route a CLIENT to a ZONE until the CLIENT is within that ZONE. + -- @param #ACT_ROUTE self + -- @return #ACT_ROUTE self + function ACT_ROUTE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ROUTE" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "None", "Start", "Routing" ) + self:AddTransition( "*", "Report", "Reporting" ) + self:AddTransition( "*", "Route", "Routing" ) + self:AddTransition( "Routing", "Pause", "Pausing" ) + self:AddTransition( "*", "Abort", "Aborted" ) + self:AddTransition( "Routing", "Arrive", "Arrived" ) + self:AddTransition( "Arrived", "Success", "Success" ) + self:AddTransition( "*", "Fail", "Failed" ) + self:AddTransition( "", "", "" ) + self:AddTransition( "", "", "" ) + + self:AddEndState( "Arrived" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "None" ) + + return self + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE:onafterStart( ProcessUnit, From, Event, To ) + + + self:__Route( 1 ) + end + + --- Check if the controllable has arrived. + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE:onfuncHasArrived( ProcessUnit ) + return false + end + + --- StateMachine callback function + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE:onbeforeRoute( ProcessUnit, From, Event, To ) + self:F( { "BeforeRoute 1", self.DisplayCount, self.DisplayInterval } ) + + if ProcessUnit:IsAlive() then + self:F( "BeforeRoute 2" ) + local HasArrived = self:onfuncHasArrived( ProcessUnit ) -- Polymorphic + if self.DisplayCount >= self.DisplayInterval then + self:T( { HasArrived = HasArrived } ) + if not HasArrived then + self:Report() + end + self.DisplayCount = 1 + else + self.DisplayCount = self.DisplayCount + 1 + end + + self:T( { DisplayCount = self.DisplayCount } ) + + if HasArrived then + self:__Arrive( 1 ) + else + self:__Route( 1 ) + end + + return HasArrived -- if false, then the event will not be executed... + end + + return false + + end + +end -- ACT_ROUTE + + +do -- ACT_ROUTE_POINT + + --- ACT_ROUTE_POINT class + -- @type ACT_ROUTE_POINT + -- @field Tasking.Task#TASK TASK + -- @extends #ACT_ROUTE + ACT_ROUTE_POINT = { + ClassName = "ACT_ROUTE_POINT", + } + + + --- Creates a new routing state machine. + -- The task will route a controllable to a PointVec2 until the controllable is within the Range. + -- @param #ACT_ROUTE_POINT self + -- @param Core.Point#POINT_VEC2 The PointVec2 to Target. + -- @param #number Range The Distance to Target. + -- @param Core.Zone#ZONE_BASE Zone + function ACT_ROUTE_POINT:New( PointVec2, Range ) + local self = BASE:Inherit( self, ACT_ROUTE:New() ) -- #ACT_ROUTE_POINT + + self.PointVec2 = PointVec2 + self.Range = Range or 0 + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + + return self + end + + function ACT_ROUTE_POINT:Init( FsmRoute ) + + self.PointVec2 = FsmRoute.PointVec2 + self.Range = FsmRoute.Range or 0 + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + end + + --- Set PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @param Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. + function ACT_ROUTE_POINT:SetPointVec2( PointVec2 ) + self:F2( { PointVec2 } ) + self.PointVec2 = PointVec2 + end + + --- Get PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @return Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. + function ACT_ROUTE_POINT:GetPointVec2() + self:F2( { self.PointVec2 } ) + return self.PointVec2 + end + + --- Set Range around PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @param #number Range The Range to consider the arrival. Default is 10000 meters. + function ACT_ROUTE_POINT:SetRange( Range ) + self:F2( { self.Range } ) + self.Range = Range or 10000 + end + + --- Get Range around PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @return #number The Range to consider the arrival. Default is 10000 meters. + function ACT_ROUTE_POINT:GetRange() + return self.Range + end + + --- Method override to check if the controllable has arrived. + -- @param #ACT_ROUTE_POINT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE_POINT:onfuncHasArrived( ProcessUnit ) + + if ProcessUnit:IsAlive() then + local Distance = self.PointVec2:Get2DDistance( ProcessUnit:GetPointVec2() ) + + if Distance <= self.Range then + local RouteText = "You have arrived." + self:Message( RouteText ) + return true + end + end + + return false + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE_POINT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE_POINT:onenterReporting( ProcessUnit, From, Event, To ) + + local TaskUnitPointVec2 = ProcessUnit:GetPointVec2() + local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( self.PointVec2 ) .. " km." + self:Message( RouteText ) + end + +end -- ACT_ROUTE_POINT + + +do -- ACT_ROUTE_ZONE + + --- ACT_ROUTE_ZONE class + -- @type ACT_ROUTE_ZONE + -- @field Tasking.Task#TASK TASK + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE Zone + -- @extends #ACT_ROUTE + ACT_ROUTE_ZONE = { + ClassName = "ACT_ROUTE_ZONE", + } + + + --- Creates a new routing state machine. The task will route a controllable to a ZONE until the controllable is within that ZONE. + -- @param #ACT_ROUTE_ZONE self + -- @param Core.Zone#ZONE_BASE Zone + function ACT_ROUTE_ZONE:New( Zone ) + local self = BASE:Inherit( self, ACT_ROUTE:New() ) -- #ACT_ROUTE_ZONE + + self.Zone = Zone + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + + return self + end + + function ACT_ROUTE_ZONE:Init( FsmRoute ) + + self.Zone = FsmRoute.Zone + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + end + + --- Set Zone + -- @param #ACT_ROUTE_ZONE self + -- @param Core.Zone#ZONE_BASE Zone The Zone object where to route to. + function ACT_ROUTE_ZONE:SetZone( Zone ) + self.Zone = Zone + end + + --- Get Zone + -- @param #ACT_ROUTE_ZONE self + -- @return Core.Zone#ZONE_BASE Zone The Zone object where to route to. + function ACT_ROUTE_ZONE:GetZone() + return self.Zone + end + + --- Method override to check if the controllable has arrived. + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE_ZONE:onfuncHasArrived( ProcessUnit ) + + if ProcessUnit:IsInZone( self.Zone ) then + local RouteText = "You have arrived within the zone." + self:Message( RouteText ) + end + + return ProcessUnit:IsInZone( self.Zone ) + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE_ZONE:onenterReporting( ProcessUnit, From, Event, To ) + + local ZoneVec2 = self.Zone:GetVec2() + local ZonePointVec2 = POINT_VEC2:New( ZoneVec2.x, ZoneVec2.y ) + local TaskUnitVec2 = ProcessUnit:GetVec2() + local TaskUnitPointVec2 = POINT_VEC2:New( TaskUnitVec2.x, TaskUnitVec2.y ) + local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( ZonePointVec2 ) .. " km." + self:Message( RouteText ) + end + +end -- ACT_ROUTE_ZONE +--- **Actions** - ACT_ACCOUNT_ classes **account for** (detect, count & report) various DCS events occuring on @{Unit}s. +-- +-- ![Banner Image](..\Presentations\ACT_ACCOUNT\Dia1.JPG) +-- +-- === +-- +-- @module Account + + +do -- ACT_ACCOUNT + + --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} + -- + -- ## ACT_ACCOUNT state machine: + -- + -- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. + -- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. + -- Each derived class follows exactly the same process, using the same events and following the same state transitions, + -- but will have **different implementation behaviour** upon each event or state transition. + -- + -- ### ACT_ACCOUNT States + -- + -- * **Asigned**: The player is assigned. + -- * **Waiting**: Waiting for an event. + -- * **Report**: Reporting. + -- * **Account**: Account for an event. + -- * **Accounted**: All events have been accounted for, end of the process. + -- * **Failed**: Failed the process. + -- + -- ### ACT_ACCOUNT Events + -- + -- * **Start**: Start the process. + -- * **Wait**: Wait for an event. + -- * **Report**: Report the status of the accounting. + -- * **Event**: An event happened, process the event. + -- * **More**: More targets. + -- * **NoMore (*)**: No more targets. + -- * **Fail (*)**: The action process has failed. + -- + -- (*) End states of the process. + -- + -- ### ACT_ACCOUNT state transition methods: + -- + -- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. + -- There are 2 moments when state transition methods will be called by the state machine: + -- + -- * **Before** the state transition. + -- The state transition method needs to start with the name **OnBefore + the name of the state**. + -- If the state transition method returns false, then the processing of the state transition will not be done! + -- If you want to change the behaviour of the AIControllable at this event, return false, + -- but then you'll need to specify your own logic using the AIControllable! + -- + -- * **After** the state transition. + -- The state transition method needs to start with the name **OnAfter + the name of the state**. + -- These state transition methods need to provide a return value, which is specified at the function description. + -- + -- @type ACT_ACCOUNT + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Core.Fsm#FSM_PROCESS + ACT_ACCOUNT = { + ClassName = "ACT_ACCOUNT", + TargetSetUnit = nil, + } + + --- Creates a new DESTROY process. + -- @param #ACT_ACCOUNT self + -- @return #ACT_ACCOUNT + function ACT_ACCOUNT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New() ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "Assigned", "Start", "Waiting") + self:AddTransition( "*", "Wait", "Waiting") + self:AddTransition( "*", "Report", "Report") + self:AddTransition( "*", "Event", "Account") + self:AddTransition( "Account", "More", "Wait") + self:AddTransition( "Account", "NoMore", "Accounted") + self:AddTransition( "*", "Fail", "Failed") + + self:AddEndState( "Accounted" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "Assigned" ) + + return self + end + + --- Process Events + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onafterStart( ProcessUnit, From, Event, To ) + + self:HandleEvent( EVENTS.Dead, self.onfuncEventDead ) + + self:__Wait( 1 ) + end + + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onenterWaiting( ProcessUnit, From, Event, To ) + + if self.DisplayCount >= self.DisplayInterval then + self:Report() + self.DisplayCount = 1 + else + self.DisplayCount = self.DisplayCount + 1 + end + + return true -- Process always the event. + end + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onafterEvent( ProcessUnit, From, Event, To, Event ) + + self:__NoMore( 1 ) + end + +end -- ACT_ACCOUNT + +do -- ACT_ACCOUNT_DEADS + + --- # @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} + -- + -- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. + -- The process is given a @{Set} of units that will be tracked upon successful destruction. + -- The process will end after each target has been successfully destroyed. + -- Each successful dead will trigger an Account state transition that can be scored, modified or administered. + -- + -- + -- ## ACT_ACCOUNT_DEADS constructor: + -- + -- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. + -- + -- @type ACT_ACCOUNT_DEADS + -- @field Set#SET_UNIT TargetSetUnit + -- @extends #ACT_ACCOUNT + ACT_ACCOUNT_DEADS = { + ClassName = "ACT_ACCOUNT_DEADS", + TargetSetUnit = nil, + } + + + --- Creates a new DESTROY process. + -- @param #ACT_ACCOUNT_DEADS self + -- @param Set#SET_UNIT TargetSetUnit + -- @param #string TaskName + function ACT_ACCOUNT_DEADS:New( TargetSetUnit, TaskName ) + -- Inherits from BASE + local self = BASE:Inherit( self, ACT_ACCOUNT:New() ) -- #ACT_ACCOUNT_DEADS + + self.TargetSetUnit = TargetSetUnit + self.TaskName = TaskName + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + self.DisplayCategory = "HQ" -- Targets is the default display category + + return self + end + + function ACT_ACCOUNT_DEADS:Init( FsmAccount ) + + self.TargetSetUnit = FsmAccount.TargetSetUnit + self.TaskName = FsmAccount.TaskName + end + + --- Process Events + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, Task, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:Message( "Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:GetUnitTypesText() .. " targets left to be destroyed." ) + end + + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Task, From, Event, To, EventData ) + self:T( { ProcessUnit, EventData, From, Event, To } ) + + self:T({self.Controllable}) + + self.TargetSetUnit:Flush() + + self:T( { "Before sending Message", EventData.IniUnitName, self.TargetSetUnit:FindUnit( EventData.IniUnitName ) } ) + if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then + self:T( "Sending Message" ) + local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:Remove( EventData.IniUnitName ) + self:Message( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed." ) + end + self:T( { "After sending Message" } ) + end + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Task, From, Event, To ) + + if self.TargetSetUnit:Count() > 0 then + self:__More( 1 ) + else + self:__NoMore( 1 ) + end + end + + --- DCS Events + + --- @param #ACT_ACCOUNT_DEADS self + -- @param Event#EVENTDATA EventData + function ACT_ACCOUNT_DEADS:onfuncEventDead( EventData ) + self:T( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + self:Event( EventData ) + end + end + +end -- ACT_ACCOUNT DEADS +--- (SP) (MP) (FSM) Route AI or players through waypoints or to zones. +-- +-- === +-- +-- # @{#ACT_ASSIST} FSM class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ASSIST state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ASSIST **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: The process is started. +-- * **Next**: The process is smoking the targets in the given zone. +-- +-- ### ACT_ASSIST **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ASSIST **States**: +-- +-- * **None**: The controllable did not receive route commands. +-- * **AwaitSmoke (*)**: The process is awaiting to smoke the targets in the zone. +-- * **Smoking (*)**: The process is smoking the targets in the zone. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ASSIST state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ASSIST_SMOKE_TARGETS_ZONE} class, extends @{Fsm.Route#ACT_ASSIST} +-- +-- The ACT_ASSIST_SMOKE_TARGETS_ZONE class implements the core functions to smoke targets in a @{Zone}. +-- The targets are smoked within a certain range around each target, simulating a realistic smoking behaviour. +-- At random intervals, a new target is smoked. +-- +-- # 1.1) ACT_ASSIST_SMOKE_TARGETS_ZONE constructor: +-- +-- * @{#ACT_ASSIST_SMOKE_TARGETS_ZONE.New}(): Creates a new ACT_ASSIST_SMOKE_TARGETS_ZONE object. +-- +-- === +-- +-- @module Smoke + +do -- ACT_ASSIST + + --- ACT_ASSIST class + -- @type ACT_ASSIST + -- @extends Core.Fsm#FSM_PROCESS + ACT_ASSIST = { + ClassName = "ACT_ASSIST", + } + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST self + -- @return #ACT_ASSIST + function ACT_ASSIST:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ASSIST" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "None", "Start", "AwaitSmoke" ) + self:AddTransition( "AwaitSmoke", "Next", "Smoking" ) + self:AddTransition( "Smoking", "Next", "AwaitSmoke" ) + self:AddTransition( "*", "Stop", "Success" ) + self:AddTransition( "*", "Fail", "Failed" ) + + self:AddEndState( "Failed" ) + self:AddEndState( "Success" ) + + self:SetStartState( "None" ) + + return self + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ASSIST self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST:onafterStart( ProcessUnit, From, Event, To ) + + local ProcessGroup = ProcessUnit:GetGroup() + local MissionMenu = self:GetMission():GetMenu( ProcessGroup ) + + local function MenuSmoke( MenuParam ) + self:E( MenuParam ) + local self = MenuParam.self + local SmokeColor = MenuParam.SmokeColor + self.SmokeColor = SmokeColor + self:__Next( 1 ) + end + + self.Menu = MENU_GROUP:New( ProcessGroup, "Target acquisition", MissionMenu ) + self.MenuSmokeBlue = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop blue smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Blue } ) + self.MenuSmokeGreen = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop green smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Green } ) + self.MenuSmokeOrange = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop Orange smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Orange } ) + self.MenuSmokeRed = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop Red smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Red } ) + self.MenuSmokeWhite = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop White smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.White } ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIST self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST:onafterStop( ProcessUnit, From, Event, To ) + + self.Menu:Remove() -- When stopped, remove the menus + end + +end + +do -- ACT_ASSIST_SMOKE_TARGETS_ZONE + + --- ACT_ASSIST_SMOKE_TARGETS_ZONE class + -- @type ACT_ASSIST_SMOKE_TARGETS_ZONE + -- @field Set#SET_UNIT TargetSetUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIST + ACT_ASSIST_SMOKE_TARGETS_ZONE = { + ClassName = "ACT_ASSIST_SMOKE_TARGETS_ZONE", + } + +-- function ACT_ASSIST_SMOKE_TARGETS_ZONE:_Destructor() +-- self:E("_Destructor") +-- +-- self.Menu:Remove() +-- self:EventRemoveAll() +-- end + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Set#SET_UNIT TargetSetUnit + -- @param Core.Zone#ZONE_BASE TargetZone + function ACT_ASSIST_SMOKE_TARGETS_ZONE:New( TargetSetUnit, TargetZone ) + local self = BASE:Inherit( self, ACT_ASSIST:New() ) -- #ACT_ASSIST + + self.TargetSetUnit = TargetSetUnit + self.TargetZone = TargetZone + + return self + end + + function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init( FsmSmoke ) + + self.TargetSetUnit = FsmSmoke.TargetSetUnit + self.TargetZone = FsmSmoke.TargetZone + end + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Set#SET_UNIT TargetSetUnit + -- @param Core.Zone#ZONE_BASE TargetZone + -- @return #ACT_ASSIST_SMOKE_TARGETS_ZONE self + function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init( TargetSetUnit, TargetZone ) + + self.TargetSetUnit = TargetSetUnit + self.TargetZone = TargetZone + + return self + end + + --- StateMachine callback function + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST_SMOKE_TARGETS_ZONE:onenterSmoking( ProcessUnit, From, Event, To ) + + self.TargetSetUnit:ForEachUnit( + --- @param Wrapper.Unit#UNIT SmokeUnit + function( SmokeUnit ) + if math.random( 1, ( 100 * self.TargetSetUnit:Count() ) / 4 ) <= 100 then + SCHEDULER:New( self, + function() + if SmokeUnit:IsAlive() then + SmokeUnit:Smoke( self.SmokeColor, 150 ) + end + end, {}, math.random( 10, 60 ) + ) + end + end + ) + + end + +end--- A COMMANDCENTER is the owner of multiple missions within MOOSE. +-- A COMMANDCENTER governs multiple missions, the tasking and the reporting. +-- @module CommandCenter + + + +--- The REPORT class +-- @type REPORT +-- @extends Core.Base#BASE +REPORT = { + ClassName = "REPORT", +} + +--- Create a new REPORT. +-- @param #REPORT self +-- @param #string Title +-- @return #REPORT +function REPORT:New( Title ) + + local self = BASE:Inherit( self, BASE:New() ) + + self.Report = {} + if Title then + self.Report[#self.Report+1] = Title + end + + return self +end + +--- Add a new line to a REPORT. +-- @param #REPORT self +-- @param #string Text +-- @return #REPORT +function REPORT:Add( Text ) + self.Report[#self.Report+1] = Text + return self.Report[#self.Report] +end + +--- Produces the text of the report, taking into account an optional delimeter, which is \n by default. +-- @param #REPORT self +-- @param #string Delimiter (optional) A delimiter text. +-- @return #string The report text. +function REPORT:Text( Delimiter ) + Delimiter = Delimiter or "\n" + local ReportText = table.concat( self.Report, Delimiter ) or "" + return ReportText +end + +--- The COMMANDCENTER class +-- @type COMMANDCENTER +-- @field Wrapper.Group#GROUP HQ +-- @field Dcs.DCSCoalitionWrapper.Object#coalition CommandCenterCoalition +-- @list Missions +-- @extends Core.Base#BASE +COMMANDCENTER = { + ClassName = "COMMANDCENTER", + CommandCenterName = "", + CommandCenterCoalition = nil, + CommandCenterPositionable = nil, + Name = "", +} +--- The constructor takes an IDENTIFIABLE as the HQ command center. +-- @param #COMMANDCENTER self +-- @param Wrapper.Positionable#POSITIONABLE CommandCenterPositionable +-- @param #string CommandCenterName +-- @return #COMMANDCENTER +function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) + + local self = BASE:Inherit( self, BASE:New() ) + + self.CommandCenterPositionable = CommandCenterPositionable + self.CommandCenterName = CommandCenterName or CommandCenterPositionable:GetName() + self.CommandCenterCoalition = CommandCenterPositionable:GetCoalition() + + self.Missions = {} + + self:HandleEvent( EVENTS.Birth, + --- @param #COMMANDCENTER self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + if EventData.IniObjectCategory == 1 then + local EventGroup = GROUP:Find( EventData.IniDCSGroup ) + if EventGroup and self:HasGroup( EventGroup ) then + local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu ) + local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup ) + local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup ) + self:ReportSummary( EventGroup ) + end + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled! + Mission:JoinUnit( PlayerUnit, PlayerGroup ) + Mission:ReportDetails() + end + end + + end + ) + + -- When a player enters a client or a unit, the CommandCenter will check for each Mission and each Task in the Mission if the player has things to do. + -- For these elements, it will= + -- - Set the correct menu. + -- - Assign the PlayerUnit to the Task if required. + -- - Send a message to the other players in the group that this player has joined. + self:HandleEvent( EVENTS.PlayerEnterUnit, + --- @param #COMMANDCENTER self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled! + Mission:JoinUnit( PlayerUnit, PlayerGroup ) + Mission:ReportDetails() + end + end + ) + + -- Handle when a player leaves a slot and goes back to spectators ... + -- The PlayerUnit will be UnAssigned from the Task. + -- When there is no Unit left running the Task, the Task goes into Abort... + self:HandleEvent( EVENTS.PlayerLeaveUnit, + --- @param #TASK self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:AbortUnit( PlayerUnit ) + end + end + ) + + -- Handle when a player leaves a slot and goes back to spectators ... + -- The PlayerUnit will be UnAssigned from the Task. + -- When there is no Unit left running the Task, the Task goes into Abort... + self:HandleEvent( EVENTS.Crash, + --- @param #TASK self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + Mission:CrashUnit( PlayerUnit ) + end + end + ) + + return self +end + +--- Gets the name of the HQ command center. +-- @param #COMMANDCENTER self +-- @return #string +function COMMANDCENTER:GetName() + + return self.CommandCenterName +end + +--- Gets the POSITIONABLE of the HQ command center. +-- @param #COMMANDCENTER self +-- @return Wrapper.Positionable#POSITIONABLE +function COMMANDCENTER:GetPositionable() + return self.CommandCenterPositionable +end + +--- Get the Missions governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @return #list +function COMMANDCENTER:GetMissions() + + return self.Missions +end + +--- Add a MISSION to be governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @param Tasking.Mission#MISSION Mission +-- @return Tasking.Mission#MISSION +function COMMANDCENTER:AddMission( Mission ) + + self.Missions[Mission] = Mission + + return Mission +end + +--- Removes a MISSION to be governed by the HQ command center. +-- The given Mission is not nilified. +-- @param #COMMANDCENTER self +-- @param Tasking.Mission#MISSION Mission +-- @return Tasking.Mission#MISSION +function COMMANDCENTER:RemoveMission( Mission ) + + self.Missions[Mission] = nil + + return Mission +end + +--- Sets the menu structure of the Missions governed by the HQ command center. +-- @param #COMMANDCENTER self +function COMMANDCENTER:SetMenu() + self:F() + + self.CommandCenterMenu = self.CommandCenterMenu or MENU_COALITION:New( self.CommandCenterCoalition, "Command Center (" .. self:GetName() .. ")" ) + + local MenuTime = timer.getTime() + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:SetMenu( MenuTime ) + end + + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:RemoveMenu( MenuTime ) + end + +end + +--- Gets the commandcenter menu structure governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @return Core.Menu#MENU_COALITION +function COMMANDCENTER:GetMenu() + self:F() + return self.CommandCenterMenu +end + +--- Checks of the COMMANDCENTER has a GROUP. +-- @param #COMMANDCENTER self +-- @param Wrapper.Group#GROUP +-- @return #boolean +function COMMANDCENTER:HasGroup( MissionGroup ) + + local Has = false + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + if Mission:HasGroup( MissionGroup ) then + Has = true + break + end + end + + return Has +end + +--- Send a CC message to the coalition of the CC. +-- @param #COMMANDCENTER self +function COMMANDCENTER:MessageToAll( Message ) + + self:GetPositionable():MessageToAll( Message, 20, self:GetName() ) + +end + +--- Send a CC message to a GROUP. +-- @param #COMMANDCENTER self +-- @param #string Message +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #sring Name (optional) The name of the Group used as a prefix for the message to the Group. If not provided, there will be nothing shown. +function COMMANDCENTER:MessageToGroup( Message, TaskGroup, Name ) + + local Prefix = "@ Group" + Prefix = Prefix .. ( Name and " (" .. Name .. "): " or '' ) + Message = Prefix .. Message + self:GetPositionable():MessageToGroup( Message , 20, TaskGroup, self:GetName() ) + +end + +--- Send a CC message to the coalition of the CC. +-- @param #COMMANDCENTER self +function COMMANDCENTER:MessageToCoalition( Message ) + + local CCCoalition = self:GetPositionable():GetCoalition() + --TODO: Fix coalition bug! + self:GetPositionable():MessageToCoalition( Message, 20, CCCoalition, self:GetName() ) + +end + + +--- Report the status of all MISSIONs to a GROUP. +-- Each Mission is listed, with an indication how many Tasks are still to be completed. +-- @param #COMMANDCENTER self +function COMMANDCENTER:ReportSummary( ReportGroup ) + self:E( ReportGroup ) + + local Report = REPORT:New() + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + Report:Add( " - " .. Mission:ReportOverview() ) + end + + self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) + +end + +--- Report the status of a Task to a Group. +-- Report the details of a Mission, listing the Mission, and all the Task details. +-- @param #COMMANDCENTER self +function COMMANDCENTER:ReportDetails( ReportGroup, Task ) + self:E( ReportGroup ) + + local Report = REPORT:New() + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + Report:Add( " - " .. Mission:ReportDetails() ) + end + + self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) +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 + +--- The MISSION class +-- @type MISSION +-- @field #MISSION.Clients _Clients +-- @field Core.Menu#MENU_COALITION MissionMenu +-- @field #string MissionBriefing +-- @extends Core.Fsm#FSM +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", +} + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param #MISSION self +-- @param Tasking.CommandCenter#COMMANDCENTER CommandCenter +-- @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 Dcs.DCSCoalitionWrapper.Object#coalition 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 self +function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM + + self:SetStartState( "Idle" ) + + self:AddTransition( "Idle", "Start", "Ongoing" ) + + --- OnLeave Transition Handler for State Idle. + -- @function [parent=#MISSION] OnLeaveIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Idle. + -- @function [parent=#MISSION] OnEnterIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnLeave Transition Handler for State Ongoing. + -- @function [parent=#MISSION] OnLeaveOngoing + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Ongoing. + -- @function [parent=#MISSION] OnEnterOngoing + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Start. + -- @function [parent=#MISSION] OnBeforeStart + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Start. + -- @function [parent=#MISSION] OnAfterStart + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Start. + -- @function [parent=#MISSION] Start + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Start. + -- @function [parent=#MISSION] __Start + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Ongoing", "Stop", "Idle" ) + + --- OnLeave Transition Handler for State Idle. + -- @function [parent=#MISSION] OnLeaveIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Idle. + -- @function [parent=#MISSION] OnEnterIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#MISSION] OnBeforeStop + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#MISSION] OnAfterStop + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#MISSION] Stop + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#MISSION] __Stop + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Ongoing", "Complete", "Completed" ) + + --- OnLeave Transition Handler for State Completed. + -- @function [parent=#MISSION] OnLeaveCompleted + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Completed. + -- @function [parent=#MISSION] OnEnterCompleted + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Complete. + -- @function [parent=#MISSION] OnBeforeComplete + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Complete. + -- @function [parent=#MISSION] OnAfterComplete + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Complete. + -- @function [parent=#MISSION] Complete + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Complete. + -- @function [parent=#MISSION] __Complete + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Fail", "Failed" ) + + --- OnLeave Transition Handler for State Failed. + -- @function [parent=#MISSION] OnLeaveFailed + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Failed. + -- @function [parent=#MISSION] OnEnterFailed + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Fail. + -- @function [parent=#MISSION] OnBeforeFail + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fail. + -- @function [parent=#MISSION] OnAfterFail + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fail. + -- @function [parent=#MISSION] Fail + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Fail. + -- @function [parent=#MISSION] __Fail + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:T( { MissionName, MissionPriority, MissionBriefing, MissionCoalition } ) + + self.CommandCenter = CommandCenter + CommandCenter:AddMission( self ) + + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + + self.Tasks = {} + + -- Private implementations + + + + return self +end + +-- FSM function for a MISSION +-- @param #MISSION self +-- @param #string From +-- @param #string Event +-- @param #string To +function MISSION:onbeforeComplete( From, Event, To ) + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if not Task:IsStateSuccess() and not Task:IsStateFailed() and not Task:IsStateAborted() and not Task:IsStateCancelled() then + return false -- Mission cannot be completed. Other Tasks are still active. + end + end + return true -- Allow Mission completion. +end + +-- FSM function for a MISSION +-- @param #MISSION self +-- @param #string From +-- @param #string Event +-- @param #string To +function MISSION:onenterCompleted( From, Event, To ) + + self:GetCommandCenter():MessageToCoalition( "Mission " .. self:GetName() .. " has been completed! Good job guys!" ) +end + +--- Gets the mission name. +-- @param #MISSION self +-- @return #MISSION self +function MISSION:GetName() + return self.Name +end + +--- Add a Unit to join the Mission. +-- For each Task within the Mission, the Unit is joined with the Task. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @param Wrapper.Group#GROUP PlayerGroup The GROUP of the player joining the Mission. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:JoinUnit( PlayerUnit, PlayerGroup ) + self:F( { PlayerUnit = PlayerUnit, PlayerGroup = PlayerGroup } ) + + local PlayerUnitAdded = false + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:JoinUnit( PlayerUnit, PlayerGroup ) then + PlayerUnitAdded = true + end + end + + return PlayerUnitAdded +end + +--- Aborts a PlayerUnit from the Mission. +-- For each Task within the Mission, the PlayerUnit is removed from Task where it is assigned. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:AbortUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitRemoved = false + + for TaskID, Task in pairs( self:GetTasks() ) do + if Task:AbortUnit( PlayerUnit ) then + PlayerUnitRemoved = true + end + end + + return PlayerUnitRemoved +end + +--- Handles a crash of a PlayerUnit from the Mission. +-- For each Task within the Mission, the PlayerUnit is removed from Task where it is assigned. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player crashing. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:CrashUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitRemoved = false + + for TaskID, Task in pairs( self:GetTasks() ) do + if Task:CrashUnit( PlayerUnit ) then + PlayerUnitRemoved = true + end + end + + return PlayerUnitRemoved +end + +--- Add a scoring to the mission. +-- @param #MISSION self +-- @return #MISSION self +function MISSION:AddScoring( Scoring ) + self.Scoring = Scoring + return self +end + +--- Get the scoring object of a mission. +-- @param #MISSION self +-- @return #SCORING Scoring +function MISSION:GetScoring() + return self.Scoring +end + +--- Get the groups for which TASKS are given in the mission +-- @param #MISSION self +-- @return Core.Set#SET_GROUP +function MISSION:GetGroups() + + local SetGroup = SET_GROUP:New() + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + local GroupSet = Task:GetGroups() + GroupSet:ForEachGroup( + function( TaskGroup ) + SetGroup:Add( TaskGroup, TaskGroup ) + end + ) + end + + return SetGroup + +end + + +--- Sets the Planned Task menu. +-- @param #MISSION self +-- @param #number MenuTime +function MISSION:SetMenu( MenuTime ) + self:F() + + for _, TaskData in pairs( self:GetTasks() ) do + local Task = TaskData -- Tasking.Task#TASK + Task:SetMenu( MenuTime ) + end +end + +--- Removes the Planned Task menu. +-- @param #MISSION self +-- @param #number MenuTime +function MISSION:RemoveMenu( MenuTime ) + self:F() + + for _, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Task:RemoveMenu( MenuTime ) + end +end + + +--- Gets the COMMANDCENTER. +-- @param #MISSION self +-- @return Tasking.CommandCenter#COMMANDCENTER +function MISSION:GetCommandCenter() + return self.CommandCenter +end + + +--- Removes a Task menu. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task +-- @return #MISSION self +function MISSION:RemoveTaskMenu( Task ) + + Task:RemoveMenu() +end + + +--- Gets the mission menu for the coalition. +-- @param #MISSION self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return Core.Menu#MENU_COALITION self +function MISSION:GetMenu( TaskGroup ) + + local CommandCenter = self:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local MissionName = self:GetName() + local MissionMenu = CommandCenterMenu:GetMenu( MissionName ) + + return MissionMenu +end + + +--- Get the TASK identified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param #string TaskName The Name of the @{Task} within the @{Mission}. +-- @return Tasking.Task#TASK The Task +-- @return #nil Returns nil if no task was found. +function MISSION:GetTask( TaskName ) + self:F( { TaskName } ) + + return self.Tasks[TaskName] +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 Goals. The Mission will not be completed until all Goals are reached. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return Tasking.Task#TASK The task added. +function MISSION:AddTask( Task ) + + local TaskName = Task:GetTaskName() + self:F( TaskName ) + + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + self.Tasks[TaskName] = Task + + self:GetCommandCenter():SetMenu() + + return Task +end + +--- Removes 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 Goals. The Mission will not be completed until all Goals are reached. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return #nil The cleaned Task reference. +function MISSION:RemoveTask( Task ) + + local TaskName = Task:GetTaskName() + + self:F( TaskName ) + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + -- Ensure everything gets garbarge collected. + self.Tasks[TaskName] = nil + Task = nil + + collectgarbage() + + self:GetCommandCenter():SetMenu() + + return nil +end + +--- Return the next @{Task} ID to be completed within the @{Mission}. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return Tasking.Task#TASK The task added. +function MISSION:GetNextTaskID( Task ) + + local TaskName = Task:GetTaskName() + self:F( TaskName ) + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + self.Tasks[TaskName].n = self.Tasks[TaskName].n + 1 + + return self.Tasks[TaskName].n +end + +--- Is the @{Mission} **Completed**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsCompleted() + return self:Is( "Completed" ) +end + +--- Is the @{Mission} **Idle**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsIdle() + return self:Is( "Idle" ) +end + +--- Is the @{Mission} **Ongoing**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsOngoing() + return self:Is( "Ongoing" ) +end + +--- Is the @{Mission} **Failed**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsFailed() + return self:Is( "Failed" ) +end + +--- Is the @{Mission} **Hold**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsHold() + return self:Is( "Hold" ) +end + +--- Validates if the Mission has a Group +-- @param #MISSION +-- @return #boolean true if the Mission has a Group. +function MISSION:HasGroup( TaskGroup ) + local Has = false + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:HasGroup( TaskGroup ) then + Has = true + break + end + end + + return Has +end + +--- Create a summary report of the Mission (one line). +-- @param #MISSION self +-- @return #string +function MISSION:ReportSummary() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:IsStateSuccess() or Task:IsStateFailed() then + else + TasksRemaining = TasksRemaining + 1 + end + end + + Report:Add( "Mission " .. Name .. " - " .. Status .. " - " .. TasksRemaining .. " tasks remaining." ) + + return Report:Text() +end + +--- Create a overview report of the Mission (multiple lines). +-- @param #MISSION self +-- @return #string +function MISSION:ReportOverview() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Report:Add( "- " .. Task:ReportSummary() ) + end + + return Report:Text() +end + +--- Create a detailed report of the Mission, listing all the details of the Task. +-- @param #MISSION self +-- @return #string +function MISSION:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Report:Add( Task:ReportDetails() ) + end + + return Report:Text() +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 + + +--- This module contains the TASK class. +-- +-- 1) @{#TASK} class, extends @{Base#BASE} +-- ============================================ +-- 1.1) The @{#TASK} class implements the methods for task orchestration within MOOSE. +-- ---------------------------------------------------------------------------------------- +-- The class provides a couple of methods to: +-- +-- * @{#TASK.AssignToGroup}():Assign a task to a group (of players). +-- * @{#TASK.AddProcess}():Add a @{Process} to a task. +-- * @{#TASK.RemoveProcesses}():Remove a running @{Process} from a running task. +-- * @{#TASK.SetStateMachine}():Set a @{Fsm} to a task. +-- * @{#TASK.RemoveStateMachine}():Remove @{Fsm} from a task. +-- * @{#TASK.HasStateMachine}():Enquire if the task has a @{Fsm} +-- * @{#TASK.AssignToUnit}(): Assign a task to a unit. (Needs to be implemented in the derived classes from @{#TASK}. +-- * @{#TASK.UnAssignFromUnit}(): Unassign the task from a unit. +-- * @{#TASK.SetTimeOut}(): Set timer in seconds before task gets cancelled if not assigned. +-- +-- 1.2) Set and enquire task status (beyond the task state machine processing). +-- ---------------------------------------------------------------------------- +-- A task needs to implement as a minimum the following task states: +-- +-- * **Success**: Expresses the successful execution and finalization of the task. +-- * **Failed**: Expresses the failure of a task. +-- * **Planned**: Expresses that the task is created, but not yet in execution and is not assigned yet. +-- * **Assigned**: Expresses that the task is assigned to a Group of players, and that the task is in execution mode. +-- +-- A task may also implement the following task states: +-- +-- * **Rejected**: Expresses that the task is rejected by a player, who was requested to accept the task. +-- * **Cancelled**: Expresses that the task is cancelled by HQ or through a logical situation where a cancellation of the task is required. +-- +-- A task can implement more statusses than the ones outlined above. Please consult the documentation of the specific tasks to understand the different status modelled. +-- +-- The status of tasks can be set by the methods **State** followed by the task status. An example is `StateAssigned()`. +-- The status of tasks can be enquired by the methods **IsState** followed by the task status name. An example is `if IsStateAssigned() then`. +-- +-- 1.3) Add scoring when reaching a certain task status: +-- ----------------------------------------------------- +-- Upon reaching a certain task status in a task, additional scoring can be given. If the Mission has a scoring system attached, the scores will be added to the mission scoring. +-- Use the method @{#TASK.AddScore}() to add scores when a status is reached. +-- +-- 1.4) Task briefing: +-- ------------------- +-- A task briefing can be given that is shown to the player when he is assigned to the task. +-- +-- === +-- +-- ### Authors: FlightControl - Design and Programming +-- +-- @module Task + +--- The TASK class +-- @type TASK +-- @field Core.Scheduler#SCHEDULER TaskScheduler +-- @field Tasking.Mission#MISSION Mission +-- @field Core.Set#SET_GROUP SetGroup The Set of Groups assigned to the Task +-- @field Core.Fsm#FSM_PROCESS FsmTemplate +-- @field Tasking.Mission#MISSION Mission +-- @field Tasking.CommandCenter#COMMANDCENTER CommandCenter +-- @extends Core.Fsm#FSM_TASK +TASK = { + ClassName = "TASK", + TaskScheduler = nil, + ProcessClasses = {}, -- The container of the Process classes that will be used to create and assign new processes for the task to ProcessUnits. + Processes = {}, -- The container of actual process objects instantiated and assigned to ProcessUnits. + Players = nil, + Scores = {}, + Menu = {}, + SetGroup = nil, + FsmTemplate = nil, + Mission = nil, + CommandCenter = nil, + TimeOut = 0, +} + +--- FSM PlayerAborted event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerAborted +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he went back to spectators or left the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM PlayerCrashed event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerCrashed +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he crashed in the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM PlayerDead event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerDead +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he died in the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM Fail synchronous event function for TASK. +-- Use this event to Fail the Task. +-- @function [parent=#TASK] Fail +-- @param #TASK self + +--- FSM Fail asynchronous event function for TASK. +-- Use this event to Fail the Task. +-- @function [parent=#TASK] __Fail +-- @param #TASK self + +--- FSM Abort synchronous event function for TASK. +-- Use this event to Abort the Task. +-- @function [parent=#TASK] Abort +-- @param #TASK self + +--- FSM Abort asynchronous event function for TASK. +-- Use this event to Abort the Task. +-- @function [parent=#TASK] __Abort +-- @param #TASK self + +--- FSM Success synchronous event function for TASK. +-- Use this event to make the Task a Success. +-- @function [parent=#TASK] Success +-- @param #TASK self + +--- FSM Success asynchronous event function for TASK. +-- Use this event to make the Task a Success. +-- @function [parent=#TASK] __Success +-- @param #TASK self + +--- FSM Cancel synchronous event function for TASK. +-- Use this event to Cancel the Task. +-- @function [parent=#TASK] Cancel +-- @param #TASK self + +--- FSM Cancel asynchronous event function for TASK. +-- Use this event to Cancel the Task. +-- @function [parent=#TASK] __Cancel +-- @param #TASK self + +--- FSM Replan synchronous event function for TASK. +-- Use this event to Replan the Task. +-- @function [parent=#TASK] Replan +-- @param #TASK self + +--- FSM Replan asynchronous event function for TASK. +-- Use this event to Replan the Task. +-- @function [parent=#TASK] __Replan +-- @param #TASK self + + +--- Instantiates a new TASK. Should never be used. Interface Class. +-- @param #TASK self +-- @param Tasking.Mission#MISSION Mission The mission wherein the Task is registered. +-- @param Core.Set#SET_GROUP SetGroupAssign The set of groups for which the Task can be assigned. +-- @param #string TaskName The name of the Task +-- @param #string TaskType The type of the Task +-- @return #TASK self +function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) + + local self = BASE:Inherit( self, FSM_TASK:New() ) -- Core.Fsm#FSM_TASK + + self:SetStartState( "Planned" ) + self:AddTransition( "Planned", "Assign", "Assigned" ) + self:AddTransition( "Assigned", "AssignUnit", "Assigned" ) + self:AddTransition( "Assigned", "Success", "Success" ) + self:AddTransition( "Assigned", "Fail", "Failed" ) + self:AddTransition( "Assigned", "Abort", "Aborted" ) + self:AddTransition( "Assigned", "Cancel", "Cancelled" ) + self:AddTransition( "*", "PlayerCrashed", "*" ) + self:AddTransition( "*", "PlayerAborted", "*" ) + self:AddTransition( "*", "PlayerDead", "*" ) + self:AddTransition( { "Failed", "Aborted", "Cancelled" }, "Replan", "Planned" ) + self:AddTransition( "*", "TimeOut", "Cancelled" ) + + self:E( "New TASK " .. TaskName ) + + self.Processes = {} + self.Fsm = {} + + self.Mission = Mission + self.CommandCenter = Mission:GetCommandCenter() + + self.SetGroup = SetGroupAssign + + self:SetType( TaskType ) + self:SetName( TaskName ) + self:SetID( Mission:GetNextTaskID( self ) ) -- The Mission orchestrates the task sequences .. + + self.TaskBriefing = "You are invited for the task: " .. self.TaskName .. "." + + self.FsmTemplate = self.FsmTemplate or FSM_PROCESS:New() + + + return self +end + +--- Get the Task FSM Process Template +-- @param #TASK self +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetUnitProcess( TaskUnit ) + + if TaskUnit then + return self:GetStateMachine( TaskUnit ) + else + return self.FsmTemplate + end +end + +--- Sets the Task FSM Process Template +-- @param #TASK self +-- @param Core.Fsm#FSM_PROCESS +function TASK:SetUnitProcess( FsmTemplate ) + + self.FsmTemplate = FsmTemplate +end + +--- Add a PlayerUnit to join the Task. +-- For each Group within the Task, the Unit is check if it can join the Task. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @param Wrapper.Group#GROUP PlayerGroup The GROUP of the player joining the Mission. +-- @return #boolean true if Unit is part of the Task. +function TASK:JoinUnit( PlayerUnit, PlayerGroup ) + self:F( { PlayerUnit = PlayerUnit, PlayerGroup = PlayerGroup } ) + + local PlayerUnitAdded = false + + local PlayerGroups = self:GetGroups() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is added to the Task. + -- If the PlayerGroup is not assigned to the Task, the menu needs to be set. In that case, the PlayerUnit will become the GroupPlayer leader. + if self:IsStatePlanned() or self:IsStateReplanned() then + self:SetMenuForGroup( PlayerGroup ) + --self:MessageToGroups( PlayerUnit:GetPlayerName() .. " is planning to join Task " .. self:GetName() ) + end + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:AssignToUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " joined Task " .. self:GetName() ) + end + end + end + + return PlayerUnitAdded +end + +--- Abort a PlayerUnit from a Task. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. +-- @return #boolean true if Unit is part of the Task. +function TASK:AbortUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitAborted = false + + local PlayerGroups = self:GetGroups() + local PlayerGroup = PlayerUnit:GetGroup() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. + -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:UnAssignFromUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " aborted Task " .. self:GetName() ) + self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) + if #PlayerGroup:GetUnits() == 1 then + self:UnAssignFromGroup( PlayerGroup ) + PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:RemoveMenuForGroup( PlayerGroup ) + end + self:Abort() + end + end + end + + return PlayerUnitAborted +end + +--- A PlayerUnit crashed in a Task. Abort the Player. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. +-- @return #boolean true if Unit is part of the Task. +function TASK:CrashUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitCrashed = false + + local PlayerGroups = self:GetGroups() + local PlayerGroup = PlayerUnit:GetGroup() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. + -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:UnAssignFromUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " crashed in Task " .. self:GetName() ) + self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) + if #PlayerGroup:GetUnits() == 1 then + PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:RemoveMenuForGroup( PlayerGroup ) + end + self:PlayerCrashed( PlayerUnit ) + end + end + end + + return PlayerUnitCrashed +end + + + +--- Gets the Mission to where the TASK belongs. +-- @param #TASK self +-- @return Tasking.Mission#MISSION +function TASK:GetMission() + + return self.Mission +end + + +--- Gets the SET_GROUP assigned to the TASK. +-- @param #TASK self +-- @return Core.Set#SET_GROUP +function TASK:GetGroups() + return self.SetGroup +end + + + +--- Assign the @{Task} to a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return #TASK +function TASK:AssignToGroup( TaskGroup ) + self:F2( TaskGroup:GetName() ) + + local TaskGroupName = TaskGroup:GetName() + + TaskGroup:SetState( TaskGroup, "Assigned", self ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + MissionMenu:RemoveSubMenus() + + --self:RemoveMenuForGroup( TaskGroup ) + self:SetAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + self:E(PlayerName) + if PlayerName ~= nil or PlayerName ~= "" then + self:AssignToUnit( TaskUnit ) + end + end + + return self +end + +--- +-- @param #TASK self +-- @param Wrapper.Group#GROUP FindGroup +-- @return #boolean +function TASK:HasGroup( FindGroup ) + + return self:GetGroups():IsIncludeObject( FindGroup ) + +end + +--- Assign the @{Task} to an alive @{Unit}. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:AssignToUnit( TaskUnit ) + self:F( TaskUnit:GetName() ) + + local FsmTemplate = self:GetUnitProcess() + + -- Assign a new FsmUnit to TaskUnit. + local FsmUnit = self:SetStateMachine( TaskUnit, FsmTemplate:Copy( TaskUnit, self ) ) -- Core.Fsm#FSM_PROCESS + self:E({"Address FsmUnit", tostring( FsmUnit ) } ) + + FsmUnit:SetStartState( "Planned" ) + + FsmUnit:Accept() -- Each Task needs to start with an Accept event to start the flow. + + return self +end + +--- UnAssign the @{Task} from an alive @{Unit}. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:UnAssignFromUnit( TaskUnit ) + self:F( TaskUnit:GetName() ) + + self:RemoveStateMachine( TaskUnit ) + + return self +end + +--- Sets the TimeOut for the @{Task}. If @{Task} stayed planned for longer than TimeOut, it gets into Cancelled status. +-- @param #TASK self +-- @param #integer Timer in seconds +-- @return #TASK self +function TASK:SetTimeOut ( Timer ) + self:F( Timer ) + self.TimeOut = Timer + self:__TimeOut( self.TimeOut ) + return self +end + +--- Send a message of the @{Task} to the assigned @{Group}s. +-- @param #TASK self +function TASK:MessageToGroups( Message ) + self:F( { Message = Message } ) + + local Mission = self:GetMission() + local CC = Mission:GetCommandCenter() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroup -- Wrapper.Group#GROUP + CC:MessageToGroup( Message, TaskGroup, TaskGroup:GetName() ) + end +end + + +--- Send the briefng message of the @{Task} to the assigned @{Group}s. +-- @param #TASK self +function TASK:SendBriefingToAssignedGroups() + self:F2() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + + if self:IsAssignedToGroup( TaskGroup ) then + TaskGroup:Message( self.TaskBriefing, 60 ) + end + end +end + + +--- UnAssign the @{Task} from the @{Group}s. +-- @param #TASK self +function TASK:UnAssignFromGroups() + self:F2() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + self:UnAssignFromGroup( TaskGroup ) + end +end + +--- UnAssign the @{Task} from a @{Group}. +-- @param #TASK self +function TASK:UnAssignFromGroup( TaskGroup ) + self:F2( { TaskGroup } ) + + TaskGroup:SetState( TaskGroup, "Assigned", nil ) + + self:RemoveAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + if PlayerName ~= nil or PlayerName ~= "" then + self:UnAssignFromUnit( TaskUnit ) + end + end +end + + + +--- Returns if the @{Task} is assigned to the Group. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return #boolean +function TASK:IsAssignedToGroup( TaskGroup ) + + local TaskGroupName = TaskGroup:GetName() + + if self:IsStateAssigned() then + if TaskGroup:GetState( TaskGroup, "Assigned" ) == self then + self:T( { "Task is assigned to:", TaskGroup:GetName() } ) + return true + end + end + + self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) + return false +end + +--- Returns if the @{Task} has still alive and assigned Units. +-- @param #TASK self +-- @return #boolean +function TASK:HasAliveUnits() + self:F() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + if self:IsStateAssigned() then + if self:IsAssignedToGroup( TaskGroup ) then + for TaskUnitID, TaskUnit in pairs( TaskGroup:GetUnits() ) do + if TaskUnit:IsAlive() then + self:T( { HasAliveUnits = true } ) + return true + end + end + end + end + end + + self:T( { HasAliveUnits = false } ) + return false +end + +--- Set the menu options of the @{Task} to all the groups in the SetGroup. +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:SetMenu( MenuTime ) + self:F() + + self.SetGroup:Flush() + for TaskGroupID, TaskGroupData in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroupData -- Wrapper.Group#GROUP + if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then + if self:IsStatePlanned() or self:IsStateReplanned() then + self:SetMenuForGroup( TaskGroup, MenuTime ) + end + end + end +end + + + +--- Set the Menu for a Group +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:SetMenuForGroup( TaskGroup, MenuTime ) + + if not TaskGroup:GetState( TaskGroup, "Assigned" ) then + self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) + else + if not self:IsAssignedToGroup( TaskGroup ) then + self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) + end + end +end + + +--- Set the planned menu option of the @{Task}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #string MenuText The menu text. +-- @param #number MenuTime +-- @return #TASK self +function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) + self:E( TaskGroup:GetName() ) + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) + + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + local TaskType = self:GetType() + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, MissionMenu ):SetTime( MenuTime ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, MenuText, TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + + return self +end + +--- Set the assigned menu options of the @{Task}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) + self:E( TaskGroup:GetName() ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + + self:E( { MissionMenu = MissionMenu } ) + + local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Task Status", MissionMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Abort Task", MissionMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ) + + return self +end + +--- Remove the menu options of the @{Task} to all the groups in the SetGroup. +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:RemoveMenu( MenuTime ) + self:F() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroup -- Wrapper.Group#GROUP + if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then + if not self:IsAssignedToGroup( TaskGroup ) then + self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) + end + end + end +end + + +--- Remove the menu option of the @{Task} for a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) + self:F() + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + if MissionMenu then + local TaskType = self:GetType() + local TypeMenu = MissionMenu:GetMenu( TaskType ) + + if TypeMenu then + local TaskMenu = TypeMenu:GetMenu( self:GetTaskName() ) + if TaskMenu then + TaskMenu:Remove( MenuTime ) + end + end + end + +end + +--- Remove the assigned menu option of the @{Task} for a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:RemoveAssignedMenuForGroup( TaskGroup ) + self:F() + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + if MissionMenu then + MissionMenu:RemoveSubMenus() + end + +end + +function TASK.MenuAssignToGroup( MenuParam ) + + local self = MenuParam.self + local TaskGroup = MenuParam.TaskGroup + + self:E( "Assigned menu selected") + + self:AssignToGroup( TaskGroup ) +end + +--- Report the task status. +-- @param #TASK self +function TASK:MenuTaskStatus( TaskGroup ) + + local ReportText = self:ReportDetails() + + self:T( ReportText ) + self:GetMission():GetCommandCenter():MessageToGroup( ReportText, TaskGroup ) + +end + +--- Report the task status. +-- @param #TASK self +function TASK:MenuTaskAbort( TaskGroup ) + + self:Abort() +end + + + +--- Returns the @{Task} name. +-- @param #TASK self +-- @return #string TaskName +function TASK:GetTaskName() + return self.TaskName +end + + + + +--- Get the default or currently assigned @{Process} template with key ProcessName. +-- @param #TASK self +-- @param #string ProcessName +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetProcessTemplate( ProcessName ) + + local ProcessTemplate = self.ProcessClasses[ProcessName] + + return ProcessTemplate +end + + + +-- TODO: Obscolete? +--- Fail processes from @{Task} with key @{Unit} +-- @param #TASK self +-- @param #string TaskUnitName +-- @return #TASK self +function TASK:FailProcesses( TaskUnitName ) + + for ProcessID, ProcessData in pairs( self.Processes[TaskUnitName] ) do + local Process = ProcessData + Process.Fsm:Fail() + end +end + +--- Add a FiniteStateMachine to @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @param Core.Fsm#FSM_PROCESS Fsm +-- @return #TASK self +function TASK:SetStateMachine( TaskUnit, Fsm ) + self:F2( { TaskUnit, self.Fsm[TaskUnit] ~= nil, Fsm:GetClassNameAndID() } ) + + self.Fsm[TaskUnit] = Fsm + + return Fsm +end + +--- Gets the FiniteStateMachine of @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetStateMachine( TaskUnit ) + self:F2( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + return self.Fsm[TaskUnit] +end + +--- Remove FiniteStateMachines from @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:RemoveStateMachine( TaskUnit ) + self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + self:E( self.Fsm ) + for TaskUnitT, Fsm in pairs( self.Fsm ) do + self:E( TaskUnitT ) + end + + self.Fsm[TaskUnit] = nil + + collectgarbage() + self:E( "Garbage Collected, Processes should be finalized now ...") +end + +--- Checks if there is a FiniteStateMachine assigned to Task@{Unit} for @{Task} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:HasStateMachine( TaskUnit ) + self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + return ( self.Fsm[TaskUnit] ~= nil ) +end + + +--- Gets the Scoring of the task +-- @param #TASK self +-- @return Functional.Scoring#SCORING Scoring +function TASK:GetScoring() + return self.Mission:GetScoring() +end + + +--- Gets the Task Index, which is a combination of the Task type, the Task name. +-- @param #TASK self +-- @return #string The Task ID +function TASK:GetTaskIndex() + + local TaskType = self:GetType() + local TaskName = self:GetName() + + return TaskType .. "." .. TaskName +end + +--- Sets the Name of the Task +-- @param #TASK self +-- @param #string TaskName +function TASK:SetName( TaskName ) + self.TaskName = TaskName +end + +--- Gets the Name of the Task +-- @param #TASK self +-- @return #string The Task Name +function TASK:GetName() + return self.TaskName +end + +--- Sets the Type of the Task +-- @param #TASK self +-- @param #string TaskType +function TASK:SetType( TaskType ) + self.TaskType = TaskType +end + +--- Gets the Type of the Task +-- @param #TASK self +-- @return #string TaskType +function TASK:GetType() + return self.TaskType +end + +--- Sets the ID of the Task +-- @param #TASK self +-- @param #string TaskID +function TASK:SetID( TaskID ) + self.TaskID = TaskID +end + +--- Gets the ID of the Task +-- @param #TASK self +-- @return #string TaskID +function TASK:GetID() + return self.TaskID +end + + +--- Sets a @{Task} to status **Success**. +-- @param #TASK self +function TASK:StateSuccess() + self:SetState( self, "State", "Success" ) + return self +end + +--- Is the @{Task} status **Success**. +-- @param #TASK self +function TASK:IsStateSuccess() + return self:Is( "Success" ) +end + +--- Sets a @{Task} to status **Failed**. +-- @param #TASK self +function TASK:StateFailed() + self:SetState( self, "State", "Failed" ) + return self +end + +--- Is the @{Task} status **Failed**. +-- @param #TASK self +function TASK:IsStateFailed() + return self:Is( "Failed" ) +end + +--- Sets a @{Task} to status **Planned**. +-- @param #TASK self +function TASK:StatePlanned() + self:SetState( self, "State", "Planned" ) + return self +end + +--- Is the @{Task} status **Planned**. +-- @param #TASK self +function TASK:IsStatePlanned() + return self:Is( "Planned" ) +end + +--- Sets a @{Task} to status **Aborted**. +-- @param #TASK self +function TASK:StateAborted() + self:SetState( self, "State", "Aborted" ) + return self +end + +--- Is the @{Task} status **Aborted**. +-- @param #TASK self +function TASK:IsStateAborted() + return self:Is( "Aborted" ) +end + +--- Sets a @{Task} to status **Cancelled**. +-- @param #TASK self +function TASK:StateCancelled() + self:SetState( self, "State", "Cancelled" ) + return self +end + +--- Is the @{Task} status **Cancelled**. +-- @param #TASK self +function TASK:IsStateCancelled() + return self:Is( "Cancelled" ) +end + +--- Sets a @{Task} to status **Assigned**. +-- @param #TASK self +function TASK:StateAssigned() + self:SetState( self, "State", "Assigned" ) + return self +end + +--- Is the @{Task} status **Assigned**. +-- @param #TASK self +function TASK:IsStateAssigned() + return self:Is( "Assigned" ) +end + +--- Sets a @{Task} to status **Hold**. +-- @param #TASK self +function TASK:StateHold() + self:SetState( self, "State", "Hold" ) + return self +end + +--- Is the @{Task} status **Hold**. +-- @param #TASK self +function TASK:IsStateHold() + return self:Is( "Hold" ) +end + +--- Sets a @{Task} to status **Replanned**. +-- @param #TASK self +function TASK:StateReplanned() + self:SetState( self, "State", "Replanned" ) + return self +end + +--- Is the @{Task} status **Replanned**. +-- @param #TASK self +function TASK:IsStateReplanned() + return self:Is( "Replanned" ) +end + +--- Gets the @{Task} status. +-- @param #TASK self +function TASK:GetStateString() + return self:GetState( self, "State" ) +end + +--- Sets a @{Task} briefing. +-- @param #TASK self +-- @param #string TaskBriefing +-- @return #TASK self +function TASK:SetBriefing( TaskBriefing ) + self.TaskBriefing = TaskBriefing + return self +end + + + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterAssigned( From, Event, To, PlayerUnit, PlayerName ) + + self:E( { "Task Assigned", self.Dispatcher } ) + + self:MessageToGroups( "Task " .. self:GetName() .. " has been assigned to your group." ) + + if self.Dispatcher then + self:E( "Firing Assign event " ) + self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + end + + self:GetMission():__Start( 1 ) +end + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterSuccess( From, Event, To ) + + self:E( "Task Success" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " is successful! Good job!" ) + self:UnAssignFromGroups() + + self:GetMission():__Complete( 1 ) + +end + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onenterAborted( From, Event, To ) + + self:E( "Task Aborted" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) + + self:UnAssignFromGroups() + + self:__Replan( 5 ) +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onafterReplan( From, Event, To ) + + self:E( "Task Replanned" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Replanning Task " .. self:GetName() .. "." ) + + self:SetMenu() + +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onenterFailed( From, Event, To ) + + self:E( "Task Failed" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has failed!" ) + + self:UnAssignFromGroups() +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onstatechange( From, Event, To ) + + if self:IsTrace() then + MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + end + + if self.Scores[To] then + local Scoring = self:GetScoring() + if Scoring then + self:E( { self.Scores[To].ScoreText, self.Scores[To].Score } ) + Scoring:_AddMissionScore( self.Mission, self.Scores[To].ScoreText, self.Scores[To].Score ) + end + end + +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterPlanned( From, Event, To) + if not self.TimeOut == 0 then + self.__TimeOut( self.TimeOut ) + end +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onbeforeTimeOut( From, Event, To ) + if From == "Planned" then + self:RemoveMenu() + return true + end + return false +end + +do -- Dispatcher + + --- Set dispatcher of a task + -- @param #TASK self + -- @param Tasking.DetectionManager#DETECTION_MANAGER Dispatcher + -- @return #TASK + function TASK:SetDispatcher( Dispatcher ) + self.Dispatcher = Dispatcher + end + +end + +do -- Reporting + +--- Create a summary report of the Task. +-- List the Task Name and Status +-- @param #TASK self +-- @return #string +function TASK:ReportSummary() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + Report:Add( "Task " .. Name .. " - State '" .. State ) + + return Report:Text() +end + + +--- Create a detailed report of the Task. +-- List the Task Status, and the Players assigned to the Task. +-- @param #TASK self +-- @return #string +function TASK:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + -- Loop each Unit active in the Task, and find Player Names. + local PlayerNames = {} + local PlayerReport = REPORT:New( " - Players:" ) + for PlayerGroupID, PlayerGroupData in pairs( self:GetGroups():GetSet() ) do + local PlayerGroup = PlayerGroupData -- Wrapper.Group#GROUP + PlayerNames = PlayerGroup:GetPlayerNames() + if PlayerNames then + PlayerReport:Add( " -- Group " .. PlayerGroup:GetCallsign() .. ": " .. table.concat( PlayerNames, ", " ) ) + end + end + + -- Loop each Process in the Task, and find Reporting Details. + Report:Add( string.format( " - Task %s\n -- State '%s'\n%s", Name, State, PlayerReport:Text() ) ) + return Report:Text() +end + + +end -- Reporting +--- This module contains the DETECTION_MANAGER class and derived classes. +-- +-- === +-- +-- 1) @{DetectionManager#DETECTION_MANAGER} class, extends @{Fsm#FSM} +-- ==================================================================== +-- The @{DetectionManager#DETECTION_MANAGER} class defines the core functions to report detected objects to groups. +-- Reportings can be done in several manners, and it is up to the derived classes if DETECTION_MANAGER to model the reporting behaviour. +-- +-- 1.1) DETECTION_MANAGER constructor: +-- ----------------------------------- +-- * @{DetectionManager#DETECTION_MANAGER.New}(): Create a new DETECTION_MANAGER instance. +-- +-- 1.2) DETECTION_MANAGER reporting: +-- --------------------------------- +-- Derived DETECTION_MANAGER classes will reports detected units using the method @{DetectionManager#DETECTION_MANAGER.ReportDetected}(). This method implements polymorphic behaviour. +-- +-- The time interval in seconds of the reporting can be changed using the methods @{DetectionManager#DETECTION_MANAGER.SetReportInterval}(). +-- To control how long a reporting message is displayed, use @{DetectionManager#DETECTION_MANAGER.SetReportDisplayTime}(). +-- Derived classes need to implement the method @{DetectionManager#DETECTION_MANAGER.GetReportDisplayTime}() to use the correct display time for displayed messages during a report. +-- +-- Reporting can be started and stopped using the methods @{DetectionManager#DETECTION_MANAGER.StartReporting}() and @{DetectionManager#DETECTION_MANAGER.StopReporting}() respectively. +-- If an ad-hoc report is requested, use the method @{DetectionManager#DETECTION_MANAGER#ReportNow}(). +-- +-- The default reporting interval is every 60 seconds. The reporting messages are displayed 15 seconds. +-- +-- === +-- +-- 2) @{DetectionManager#DETECTION_REPORTING} class, extends @{DetectionManager#DETECTION_MANAGER} +-- ========================================================================================= +-- The @{DetectionManager#DETECTION_REPORTING} class implements detected units reporting. Reporting can be controlled using the reporting methods available in the @{DetectionManager#DETECTION_MANAGER} class. +-- +-- 2.1) DETECTION_REPORTING constructor: +-- ------------------------------- +-- The @{DetectionManager#DETECTION_REPORTING.New}() method creates a new DETECTION_REPORTING instance. +-- +-- +-- === +-- +-- ### Contributions: Mechanist, Prof_Hilactic, FlightControl - Concept & Testing +-- ### Author: FlightControl - Framework Design & Programming +-- +-- @module DetectionManager + +do -- DETECTION MANAGER + + --- DETECTION_MANAGER class. + -- @type DETECTION_MANAGER + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @extends Core.Fsm#FSM + DETECTION_MANAGER = { + ClassName = "DETECTION_MANAGER", + SetGroup = nil, + Detection = nil, + } + + --- FAC constructor. + -- @param #DETECTION_MANAGER self + -- @param Set#SET_GROUP SetGroup + -- @param Functional.Detection#DETECTION_BASE Detection + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:New( SetGroup, Detection ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_MANAGER + + self.SetGroup = SetGroup + self.Detection = Detection + + self:SetStartState( "Stopped" ) + self:AddTransition( "Stopped", "Start", "Started" ) + self:AddTransition( "Started", "Stop", "Stopped" ) + self:AddTransition( "Started", "Report", "Started" ) + + self:SetReportInterval( 30 ) + self:SetReportDisplayTime( 25 ) + + Detection:__Start( 1 ) + + return self + end + + function DETECTION_MANAGER:onafterStart( From, Event, To ) + self:Report() + end + + function DETECTION_MANAGER:onafterReport( From, Event, To ) + + self:E( "onafterReport" ) + + self:__Report( -self._ReportInterval ) + + self:ProcessDetected( self.Detection ) + end + + --- Set the reporting time interval. + -- @param #DETECTION_MANAGER self + -- @param #number ReportInterval The interval in seconds when a report needs to be done. + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:SetReportInterval( ReportInterval ) + self:F2() + + self._ReportInterval = ReportInterval + end + + + --- Set the reporting message display time. + -- @param #DETECTION_MANAGER self + -- @param #number ReportDisplayTime The display time in seconds when a report needs to be done. + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:SetReportDisplayTime( ReportDisplayTime ) + self:F2() + + self._ReportDisplayTime = ReportDisplayTime + end + + --- Get the reporting message display time. + -- @param #DETECTION_MANAGER self + -- @return #number ReportDisplayTime The display time in seconds when a report needs to be done. + function DETECTION_MANAGER:GetReportDisplayTime() + self:F2() + + return self._ReportDisplayTime + end + + --- Reports the detected items to the @{Set#SET_GROUP}. + -- @param #DETECTION_MANAGER self + -- @param Functional.Detection#DETECTION_BASE Detection + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:ProcessDetected( Detection ) + self:E() + + end + +end + + +do -- DETECTION_REPORTING + + --- DETECTION_REPORTING class. + -- @type DETECTION_REPORTING + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @extends #DETECTION_MANAGER + DETECTION_REPORTING = { + ClassName = "DETECTION_REPORTING", + } + + + --- DETECTION_REPORTING constructor. + -- @param #DETECTION_REPORTING self + -- @param Set#SET_GROUP SetGroup + -- @param Functional.Detection#DETECTION_AREAS Detection + -- @return #DETECTION_REPORTING self + function DETECTION_REPORTING:New( SetGroup, Detection ) + + -- Inherits from DETECTION_MANAGER + local self = BASE:Inherit( self, DETECTION_MANAGER:New( SetGroup, Detection ) ) -- #DETECTION_REPORTING + + self:Schedule( 1, 30 ) + return self + end + + --- Creates a string of the detected items in a @{Detection}. + -- @param #DETECTION_MANAGER self + -- @param Set#SET_UNIT DetectedSet The detected Set created by the @{Detection#DETECTION_BASE} object. + -- @return #DETECTION_MANAGER self + function DETECTION_REPORTING:GetDetectedItemsText( DetectedSet ) + self:F2() + + local MT = {} -- Message Text + local UnitTypes = {} + + for DetectedUnitID, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + if DetectedUnit:IsAlive() then + local UnitType = DetectedUnit:GetTypeName() + + if not UnitTypes[UnitType] then + UnitTypes[UnitType] = 1 + else + UnitTypes[UnitType] = UnitTypes[UnitType] + 1 + end + end + end + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return table.concat( MT, ", " ) + end + + + + --- Reports the detected items to the @{Set#SET_GROUP}. + -- @param #DETECTION_REPORTING self + -- @param Wrapper.Group#GROUP Group The @{Group} object to where the report needs to go. + -- @param Functional.Detection#DETECTION_AREAS Detection The detection created by the @{Detection#DETECTION_BASE} object. + -- @return #boolean Return true if you want the reporting to continue... false will cancel the reporting loop. + function DETECTION_REPORTING:ProcessDetected( Group, Detection ) + self:F2( Group ) + + self:E( Group ) + local DetectedMsg = {} + for DetectedAreaID, DetectedAreaData in pairs( Detection:GetDetectedAreas() ) do + local DetectedArea = DetectedAreaData -- Functional.Detection#DETECTION_AREAS.DetectedArea + DetectedMsg[#DetectedMsg+1] = " - Group #" .. DetectedAreaID .. ": " .. self:GetDetectedItemsText( DetectedArea.Set ) + end + local FACGroup = Detection:GetDetectionGroups() + FACGroup:MessageToGroup( "Reporting detected target groups:\n" .. table.concat( DetectedMsg, "\n" ), self:GetReportDisplayTime(), Group ) + + return true + end + +end + +--- **Tasking** - The TASK_A2G_DISPATCHER creates and manages player TASK_A2G tasks based on detected targets. +-- +-- === +-- +-- # 1) @{#TASK_A2G_DISPATCHER} class, extends @{#DETECTION_MANAGER} +-- +-- The @{#TASK_A2G_DISPATCHER} class implements the dynamic dispatching of tasks upon groups of detected units determined a @{Set} of FAC (groups). +-- The FAC will detect units, will group them, and will dispatch @{Task}s to groups. Depending on the type of target detected, different tasks will be dispatched. +-- Find a summary below describing for which situation a task type is created: +-- +-- * **CAS Task**: Is created when there are enemy ground units within range of the FAC, while there are friendly units in the FAC perimeter. +-- * **BAI Task**: Is created when there are enemy ground units within range of the FAC, while there are NO other friendly units within the FAC perimeter. +-- * **SEAD Task**: Is created when there are enemy ground units wihtin range of the FAC, with air search radars. +-- +-- Other task types will follow... +-- +-- 3.1) TASK_A2G_DISPATCHER constructor: +-- -------------------------------------- +-- The @{#TASK_A2G_DISPATCHER.New}() method creates a new TASK_A2G_DISPATCHER instance. +-- +-- === +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-09: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Task_A2G_Dispatcher + +do -- TASK_A2G_DISPATCHER + + --- TASK_A2G_DISPATCHER class. + -- @type TASK_A2G_DISPATCHER + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @field Tasking.Mission#MISSION Mission + -- @extends Tasking.DetectionManager#DETECTION_MANAGER + TASK_A2G_DISPATCHER = { + ClassName = "TASK_A2G_DISPATCHER", + Mission = nil, + Detection = nil, + } + + + --- TASK_A2G_DISPATCHER constructor. + -- @param #TASK_A2G_DISPATCHER self + -- @param Tasking.Mission#MISSION The mission for which the task dispatching is done. + -- @param Set#SET_GROUP SetGroup The set of groups that can join the tasks within the mission. + -- @param Functional.Detection#DETECTION_BASE Detection The detection results that are used to dynamically assign new tasks to human players. + -- @return #TASK_A2G_DISPATCHER self + function TASK_A2G_DISPATCHER:New( Mission, SetGroup, Detection ) + + -- Inherits from DETECTION_MANAGER + local self = BASE:Inherit( self, DETECTION_MANAGER:New( SetGroup, Detection ) ) -- #TASK_A2G_DISPATCHER + + self.Detection = Detection + self.Mission = Mission + + self:AddTransition( "Started", "Assign", "Started" ) + + --- OnAfter Transition Handler for Event Assign. + -- @function [parent=#TASK_A2G_DISPATCHER] OnAfterAssign + -- @param #TASK_A2G_DISPATCHER self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @param Tasking.Task_A2G#TASK_A2G Task + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param #string PlayerName + + self:__Start( 5 ) + + return self + end + + + --- Creates a SEAD task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Set#SET_UNIT TargetSetUnit: The target set of units. + -- @return #nil If there are no targets to be set. + function TASK_A2G_DISPATCHER:EvaluateSEAD( DetectedItem ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local RadarCount = DetectedSet:HasSEAD() + + if RadarCount > 0 then + + -- Here we're doing something advanced... We're copying the DetectedSet, but making a new Set only with SEADable Radar units in it. + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterHasSEAD() + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Creates a CAS task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateCAS( DetectedItem ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local GroundUnitCount = DetectedSet:HasGroundUnits() + local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem ) + + if GroundUnitCount > 0 and FriendliesNearBy == true then + + -- Copy the Set + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Creates a BAI task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateBAI( DetectedItem, FriendlyCoalition ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local GroundUnitCount = DetectedSet:HasGroundUnits() + local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem ) + + if GroundUnitCount > 0 and FriendliesNearBy == false then + + -- Copy the Set + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Evaluates the removal of the Task from the Mission. + -- Can only occur when the DetectedItem is Changed AND the state of the Task is "Planned". + -- @param #TASK_A2G_DISPATCHER self + -- @param Tasking.Mission#MISSION Mission + -- @param Tasking.Task#TASK Task + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedItem ) + + if Task then + if Task:IsStatePlanned() and DetectedItem.Changed == true then + self:E( "Removing Tasking: " .. Task:GetTaskName() ) + Task = Mission:RemoveTask( Task ) + end + end + + return Task + end + + + --- Assigns tasks in relation to the detected items to the @{Set#SET_GROUP}. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_BASE Detection The detection created by the @{Detection#DETECTION_BASE} derived object. + -- @return #boolean Return true if you want the task assigning to continue... false will cancel the loop. + function TASK_A2G_DISPATCHER:ProcessDetected( Detection ) + self:E() + + local AreaMsg = {} + local TaskMsg = {} + local ChangeMsg = {} + + local Mission = self.Mission + local ReportSEAD = REPORT:New( "- SEAD Tasks:") + local ReportCAS = REPORT:New( "- CAS Tasks:") + local ReportBAI = REPORT:New( "- BAI Tasks:") + local ReportChanges = REPORT:New( " - Changes:" ) + + --- First we need to the detected targets. + for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do + + local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet + local DetectedZone = DetectedItem.Zone + self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) + DetectedSet:Flush() + + local ItemID = DetectedItem.ItemID + + -- Evaluate SEAD Tasking + local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) + SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) + if not SEADTask then + local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + SEADTask = Mission:AddTask( Task ) + end + end + if SEADTask and SEADTask:IsStatePlanned() then + ReportSEAD:Add( string.format( " - %s.%02d - %s", "SEAD", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + -- Evaluate CAS Tasking + local CASTask = Mission:GetTask( string.format( "CAS.%03d", ItemID ) ) + CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem ) + if not CASTask then + local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + CASTask = Mission:AddTask( Task ) + end + end + if CASTask and CASTask:IsStatePlanned() then + ReportCAS:Add( string.format( " - %s.%02d - %s", "CAS", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + -- Evaluate BAI Tasking + local BAITask = Mission:GetTask( string.format( "BAI.%03d", ItemID ) ) + BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem ) + if not BAITask then + local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + BAITask = Mission:AddTask( Task ) + end + end + if BAITask and BAITask:IsStatePlanned() then + ReportBAI:Add( string.format( " - %s.%02d - %s", "BAI", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + + -- Loop through the changes ... + local ChangeText = Detection:GetChangeText( DetectedItem ) + ReportChanges:Add( ChangeText ) + + + -- OK, so the tasking has been done, now delete the changes reported for the area. + Detection:AcceptChanges( DetectedItem ) + + end + + -- TODO set menus using the HQ coordinator + Mission:GetCommandCenter():SetMenu() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + if not TaskGroup:GetState( TaskGroup, "Assigned" ) then + Mission:GetCommandCenter():MessageToGroup( + string.format( "HQ Reporting - Planned tasks for mission '%s':\n%s\n", + self.Mission:GetName(), + string.format( "%s\n\n%s\n\n%s\n\n%s", ReportSEAD:Text(), ReportCAS:Text(), ReportBAI:Text(), ReportChanges:Text() + ) + ), TaskGroup + ) + end + end + + return true + end + +end--- **Tasking** - The TASK_A2G models tasks for players in Air to Ground engagements. +-- +-- ![Banner Image](..\Presentations\TASK_A2G\Dia1.JPG) +-- +-- +-- # 1) @{Task_A2G#TASK_A2G} class, extends @{Task#TASK} +-- +-- The @{#TASK_A2G} class defines Air To Ground tasks for a @{Set} of Target Units, +-- based on the tasking capabilities defined in @{Task#TASK}. +-- The TASK_A2G is implemented using a @{Statemachine#FSM_TASK}, and has the following statuses: +-- +-- * **None**: Start of the process +-- * **Planned**: The A2G task is planned. +-- * **Assigned**: The A2G task is assigned to a @{Group#GROUP}. +-- * **Success**: The A2G task is successfully completed. +-- * **Failed**: The A2G task has failed. This will happen if the player exists the task early, without communicating a possible cancellation to HQ. +-- +-- # 1.1) Set the scoring of achievements in an A2G attack. +-- +-- Scoring or penalties can be given in the following circumstances: +-- +-- * @{#TASK_A2G.SetScoreOnDestroy}(): Set a score when a target in scope of the A2G attack, has been destroyed. +-- * @{#TASK_A2G.SetScoreOnSuccess}(): Set a score when all the targets in scope of the A2G attack, have been destroyed. +-- * @{#TASK_A2G.SetPenaltyOnFailed}(): Set a penalty when the A2G attack has failed. +-- +-- # 2) @{Task_A2G#TASK_SEAD} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_SEAD} class defines a SEAD task for a @{Set} of Target Units. +-- +-- === +-- +-- # 3) @{Task_A2G#TASK_CAS} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_CAS} class defines a CAS task for a @{Set} of Target Units. +-- +-- === +-- +-- # 4) @{Task_A2G#TASK_BAI} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_BAI} class defines a BAI task for a @{Set} of Target Units. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-09: Revised version. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[WingThor]**: Concept, Advice & Testing. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Task_A2G + +do -- TASK_A2G + + --- The TASK_A2G class + -- @type TASK_A2G + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_A2G = { + ClassName = "TASK_A2G", + } + + --- Instantiates a new TASK_A2G. + -- @param #TASK_A2G self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_A2G self + function TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskType ) + local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType ) ) -- Tasking.Task#TASK_A2G + self:F() + + self.TargetSetUnit = TargetSetUnit + self.TaskType = TaskType + + Mission:AddTask( self ) + + local Fsm = self:GetUnitProcess() + + + Fsm:AddProcess ( "Planned", "Accept", ACT_ASSIGN_ACCEPT:New( self.TaskBriefing ), { Assigned = "RouteToRendezVous", Rejected = "Reject" } ) + + Fsm:AddTransition( "Assigned", "RouteToRendezVous", "RoutingToRendezVous" ) + Fsm:AddProcess ( "RoutingToRendezVous", "RouteToRendezVousPoint", ACT_ROUTE_POINT:New(), { Arrived = "ArriveAtRendezVous" } ) + Fsm:AddProcess ( "RoutingToRendezVous", "RouteToRendezVousZone", ACT_ROUTE_ZONE:New(), { Arrived = "ArriveAtRendezVous" } ) + + Fsm:AddTransition( { "Arrived", "RoutingToRendezVous" }, "ArriveAtRendezVous", "ArrivedAtRendezVous" ) + + Fsm:AddTransition( { "ArrivedAtRendezVous", "HoldingAtRendezVous" }, "Engage", "Engaging" ) + Fsm:AddTransition( { "ArrivedAtRendezVous", "HoldingAtRendezVous" }, "HoldAtRendezVous", "HoldingAtRendezVous" ) + + Fsm:AddProcess ( "Engaging", "Account", ACT_ACCOUNT_DEADS:New( self.TargetSetUnit, self.TaskType ), { Accounted = "Success" } ) + Fsm:AddTransition( "Engaging", "RouteToTarget", "Engaging" ) + Fsm:AddProcess( "Engaging", "RouteToTargetZone", ACT_ROUTE_ZONE:New(), {} ) + Fsm:AddProcess( "Engaging", "RouteToTargetPoint", ACT_ROUTE_POINT:New(), {} ) + Fsm:AddTransition( "Engaging", "RouteToTargets", "Engaging" ) + + Fsm:AddTransition( "Accounted", "DestroyedAll", "Accounted" ) + Fsm:AddTransition( "Accounted", "Success", "Success" ) + Fsm:AddTransition( "Rejected", "Reject", "Aborted" ) + Fsm:AddTransition( "Failed", "Fail", "Failed" ) + + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToRendezVous( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.RendezVousSetUnit + + if Task:GetRendezVousZone( TaskUnit ) then + self:__RouteToRendezVousZone( 0.1 ) + else + if Task:GetRendezVousPointVec2( TaskUnit ) then + self:__RouteToRendezVousPoint( 0.1 ) + else + self:__ArriveAtRendezVous( 0.1 ) + end + end + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task#TASK_A2G Task + function Fsm:OnAfterArriveAtRendezVous( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.TargetSetUnit + + self:__Engage( 0.1 ) + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task#TASK_A2G Task + function Fsm:onafterEngage( TaskUnit, Task ) + self:E( { self } ) + self:__Account( 0.1 ) + self:__RouteToTarget(0.1 ) + self:__RouteToTargets( -10 ) + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToTarget( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.TargetSetUnit + + if Task:GetTargetZone( TaskUnit ) then + self:__RouteToTargetZone( 0.1 ) + else + local TargetUnit = Task.TargetSetUnit:GetFirst() -- Wrapper.Unit#UNIT + if TargetUnit then + local PointVec2 = TargetUnit:GetPointVec2() + self:T( { TargetPointVec2 = PointVec2, PointVec2:GetX(), PointVec2:GetAlt(), PointVec2:GetZ() } ) + Task:SetTargetPointVec2( TargetUnit:GetPointVec2(), TaskUnit ) + end + self:__RouteToTargetPoint( 0.1 ) + end + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToTargets( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + local TargetUnit = Task.TargetSetUnit:GetFirst() -- Wrapper.Unit#UNIT + if TargetUnit then + Task:SetTargetPointVec2( TargetUnit:GetPointVec2(), TaskUnit ) + end + self:__RouteToTargets( -10 ) + end + + return self + + end + + --- @param #TASK_A2G self + function TASK_A2G:GetPlannedMenuText() + return self:GetStateString() .. " - " .. self:GetTaskName() .. " ( " .. self.TargetSetUnit:GetUnitTypesText() .. " )" + end + + --- @param #TASK_A2G self + -- @param Core.Point#POINT_VEC2 RendezVousPointVec2 The PointVec2 object referencing to the 2D point where the RendezVous point is located on the map. + -- @param #number RendezVousRange The RendezVousRange that defines when the player is considered to have arrived at the RendezVous point. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetRendezVousPointVec2( RendezVousPointVec2, RendezVousRange, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + ActRouteRendezVous:SetPointVec2( RendezVousPointVec2 ) + ActRouteRendezVous:SetRange( RendezVousRange ) + end + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Point#POINT_VEC2 The PointVec2 object referencing to the 2D point where the RendezVous point is located on the map. + -- @return #number The RendezVousRange that defines when the player is considered to have arrived at the RendezVous point. + function TASK_A2G:GetRendezVousPointVec2( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + return ActRouteRendezVous:GetPointVec2(), ActRouteRendezVous:GetRange() + end + + + + --- @param #TASK_A2G self + -- @param Core.Zone#ZONE_BASE RendezVousZone The Zone object where the RendezVous is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetRendezVousZone( RendezVousZone, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + ActRouteRendezVous:SetZone( RendezVousZone ) + end + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Zone#ZONE_BASE The Zone object where the RendezVous is located on the map. + function TASK_A2G:GetRendezVousZone( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + return ActRouteRendezVous:GetZone() + end + + --- @param #TASK_A2G self + -- @param Core.Point#POINT_VEC2 TargetPointVec2 The PointVec2 object where the Target is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetTargetPointVec2( TargetPointVec2, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + ActRouteTarget:SetPointVec2( TargetPointVec2 ) + end + + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Point#POINT_VEC2 The PointVec2 object where the Target is located on the map. + function TASK_A2G:GetTargetPointVec2( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + return ActRouteTarget:GetPointVec2() + end + + + --- @param #TASK_A2G self + -- @param Core.Zone#ZONE_BASE TargetZone The Zone object where the Target is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetTargetZone( TargetZone, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + ActRouteTarget:SetZone( TargetZone ) + end + + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Zone#ZONE_BASE The Zone object where the Target is located on the map. + function TASK_A2G:GetTargetZone( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + return ActRouteTarget:GetZone() + end + + --- Set a score when a target in scope of the A2G attack, has been destroyed . + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when the target has been destroyed. + -- @param #number Score The score in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetScoreOnDestroy( Text, Score, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScoreProcess( "Engaging", "Account", "Account", Text, Score ) + + return self + end + + --- Set a score when all the targets in scope of the A2G attack, have been destroyed. + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when all targets hav been destroyed. + -- @param #number Score The score in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetScoreOnSuccess( Text, Score, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScore( "Success", Text, Score ) + + return self + end + + --- Set a penalty when the A2G attack has failed. + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when the A2G attack has failed. + -- @param #number Penalty The penalty in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetPenaltyOnFailed( Text, Penalty, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScore( "Failed", Text, Penalty ) + + return self + end + + +end + + +do -- TASK_SEAD + + --- The TASK_SEAD class + -- @type TASK_SEAD + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_SEAD = { + ClassName = "TASK_SEAD", + } + + --- Instantiates a new TASK_SEAD. + -- @param #TASK_SEAD self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_SEAD self + function TASK_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD" ) ) -- #TASK_SEAD + self:F() + + return self + end + +end + +do -- TASK_BAI + + --- The TASK_BAI class + -- @type TASK_BAI + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_BAI = { + ClassName = "TASK_BAI", + } + + --- Instantiates a new TASK_BAI. + -- @param #TASK_BAI self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_BAI self + function TASK_BAI:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "BAI" ) ) -- #TASK_BAI + self:F() + + return self + end + +end + +do -- TASK_CAS + + --- The TASK_CAS class + -- @type TASK_CAS + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_CAS = { + ClassName = "TASK_CAS", + } + + --- Instantiates a new TASK_CAS. + -- @param #TASK_CAS self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_CAS self + function TASK_CAS:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "CAS" ) ) -- #TASK_CAS + self:F() + + return self + end + +end +--- The main include file for the MOOSE system. +-- Test of permissions + +--- Core Routines +Include.File( "Utilities/Routines" ) +Include.File( "Utilities/Utils" ) + +--- Core Classes +Include.File( "Core/Base" ) +Include.File( "Core/Scheduler" ) +Include.File( "Core/ScheduleDispatcher") +Include.File( "Core/Event" ) +Include.File( "Core/Menu" ) +Include.File( "Core/Zone" ) +Include.File( "Core/Database" ) +Include.File( "Core/Set" ) +Include.File( "Core/Point" ) +Include.File( "Core/Message" ) +Include.File( "Core/Fsm" ) + +--- Wrapper Classes +Include.File( "Wrapper/Object" ) +Include.File( "Wrapper/Identifiable" ) +Include.File( "Wrapper/Positionable" ) +Include.File( "Wrapper/Controllable" ) +Include.File( "Wrapper/Group" ) +Include.File( "Wrapper/Unit" ) +Include.File( "Wrapper/Client" ) +Include.File( "Wrapper/Static" ) +Include.File( "Wrapper/Airbase" ) +Include.File( "Wrapper/Scenery" ) + +--- Functional Classes +Include.File( "Functional/Scoring" ) +Include.File( "Functional/CleanUp" ) +Include.File( "Functional/Spawn" ) +Include.File( "Functional/Movement" ) +Include.File( "Functional/Sead" ) +Include.File( "Functional/Escort" ) +Include.File( "Functional/MissileTrainer" ) +Include.File( "Functional/AirbasePolice" ) +Include.File( "Functional/Detection" ) + +--- AI Classes +Include.File( "AI/AI_Balancer" ) +Include.File( "AI/AI_Patrol" ) +Include.File( "AI/AI_Cap" ) +Include.File( "AI/AI_Cas" ) +Include.File( "AI/AI_Cargo" ) + +--- Actions +Include.File( "Actions/Act_Assign" ) +Include.File( "Actions/Act_Route" ) +Include.File( "Actions/Act_Account" ) +Include.File( "Actions/Act_Assist" ) + +--- Task Handling Classes +Include.File( "Tasking/CommandCenter" ) +Include.File( "Tasking/Mission" ) +Include.File( "Tasking/Task" ) +Include.File( "Tasking/DetectionManager" ) +Include.File( "Tasking/Task_A2G_Dispatcher") +Include.File( "Tasking/Task_A2G" ) + + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT + +--- Declare the timer dispatcher based on the SCHEDULEDISPATCHER class +_SCHEDULEDISPATCHER = SCHEDULEDISPATCHER:New() -- Core.Timer#SCHEDULEDISPATCHER + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + + + + +BASE:TraceOnOff( false ) env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index b688c14b7..9585e6212 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,31 +1,35413 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170321_1125' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20170321_1213' ) local base = _G Include = {} - +Include.Files = {} 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 - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) +end + +--- Various routines +-- @module routines +-- @author Flightcontrol + +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 - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() + 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 -Include.ProgramPath = "Scripts/Moose/" -env.info( "Include.ProgramPath = " .. Include.ProgramPath) +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end -Include.Files = {} +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end -Include.File( "Moose" ) +routines.utils.metersToNM = function(meters) + return meters/1852 +end -BASE:TraceOnOff( true ) +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 + + + + + +--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 + + +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, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):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' )) + +--- This module contains derived utilities taken from the MIST framework, +-- which are excellent tools to be reused in an OO environment!. +-- +-- ### Authors: +-- +-- * Grimes : Design & Programming of the MIST framework. +-- +-- ### Contributions: +-- +-- * FlightControl : Rework to OO framework +-- +-- @module Utils + + +--- @type SMOKECOLOR +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +SMOKECOLOR = trigger.smokeColor -- #SMOKECOLOR + +--- @type FLARECOLOR +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +FLARECOLOR = trigger.flareColor -- #FLARECOLOR + +--- Utilities static class. +-- @type UTILS +UTILS = {} + + +--from http://lua-users.org/wiki/CopyTable +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 +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] = "f() " .. 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 +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 + + +UTILS.ToDegree = function(angle) + return angle*180/math.pi +end + +UTILS.ToRadian = function(angle) + return angle*math.pi/180 +end + +UTILS.MetersToNM = function(meters) + return meters/1852 +end + +UTILS.MetersToFeet = function(meters) + return meters/0.3048 +end + +UTILS.NMToMeters = function(NM) + return NM*1852 +end + +UTILS.FeetToMeters = function(feet) + return feet*0.3048 +end + +UTILS.MpsToKnots = function(mps) + return mps*3600/1852 +end + +UTILS.MpsToKmph = function(mps) + return mps*3.6 +end + +UTILS.KnotsToMps = function(knots) + return knots*1852/3600 +end + +UTILS.KmphToMps = function(kmph) + return kmph/3.6 +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. +]] +UTILS.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 = UTILS.Round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = 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 = UTILS.Round(latMin, acc) + lonMin = 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 + + +--- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +function UTILS.Round( num, idp ) + local mult = 10 ^ ( idp or 0 ) + return math.floor( num * mult + 0.5 ) / mult +end + +-- porting in Slmod's dostring +function UTILS.DoString( s ) + local f, err = loadstring( s ) + if f then + return true, f() + else + return false, err + end +end +--- **Core** - BASE forms **the basis of the MOOSE framework**. Each class within the MOOSE framework derives from BASE. +-- +-- ![Banner Image](..\Presentations\BASE\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#BASE} class +-- +-- All classes within the MOOSE framework are derived from the @{#BASE} class. +-- +-- BASE provides facilities for : +-- +-- * The construction and inheritance of MOOSE classes. +-- * The class naming and numbering system. +-- * The class hierarchy search system. +-- * The tracing of information or objects during mission execution for debuggin purposes. +-- * The subscription to DCS events for event handling in MOOSE objects. +-- +-- Note: The BASE class is an abstract class and is not meant to be used directly. +-- +-- ## 1.1) BASE constructor +-- +-- Any class derived from BASE, will use the @{Base#BASE.New} constructor embedded in the @{Base#BASE.Inherit} method. +-- See an example at the @{Base#BASE.New} method how this is done. +-- +-- ## 1.2) Trace information for debugging +-- +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- These trace methods are inherited by each MOOSE class interiting BASE, soeach object created from derived class from BASE can use the tracing methods to trace its execution. +-- +-- Any type of information can be passed to these tracing methods. See the following examples: +-- +-- self:E( "Hello" ) +-- +-- Result in the word "Hello" in the dcs.log. +-- +-- local Array = { 1, nil, "h", { "a","b" }, "x" } +-- self:E( Array ) +-- +-- Results with the text [1]=1,[3]="h",[4]={[1]="a",[2]="b"},[5]="x"} in the dcs.log. +-- +-- local Object1 = "Object1" +-- local Object2 = 3 +-- local Object3 = { Object 1, Object 2 } +-- self:E( { Object1, Object2, Object3 } ) +-- +-- Results with the text [1]={[1]="Object",[2]=3,[3]={[1]="Object",[2]=3}} in the dcs.log. +-- +-- local SpawnObject = SPAWN:New( "Plane" ) +-- local GroupObject = GROUP:FindByName( "Group" ) +-- self:E( { Spawn = SpawnObject, Group = GroupObject } ) +-- +-- Results with the text [1]={Spawn={....),Group={...}} in the dcs.log. +-- +-- Below a more detailed explanation of the different method types for tracing. +-- +-- ### 1.2.1) Tracing methods categories +-- +-- There are basically 3 types of tracing methods available: +-- +-- * @{#BASE.F}: Used to trace the entrance of a function and its given parameters. An F is indicated at column 44 in the DCS.log file. +-- * @{#BASE.T}: Used to trace further logic within a function giving optional variables or parameters. A T is indicated at column 44 in the DCS.log file. +-- * @{#BASE.E}: Used to always trace information giving optional variables or parameters. An E is indicated at column 44 in the DCS.log file. +-- +-- ### 1.2.2) 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. +-- +-- ### 1.2.3) Trace activation. +-- +-- Tracing can be activated in several ways: +-- +-- * Switch tracing on or off through the @{#BASE.TraceOnOff}() method. +-- * Activate all tracing through the @{#BASE.TraceAll}() method. +-- * Activate only the tracing of a certain class (name) through the @{#BASE.TraceClass}() method. +-- * Activate only the tracing of a certain method of a certain class through the @{#BASE.TraceClassMethod}() method. +-- * Activate only the tracing of a certain level through the @{#BASE.TraceLevel}() method. +-- +-- ### 1.2.4) Check if tracing is on. +-- +-- The method @{#BASE.IsTrace}() will validate if tracing is activated or not. +-- +-- ## 1.3 DCS simulator Event Handling +-- +-- The BASE class provides methods to catch DCS Events. These are events that are triggered from within the DCS simulator, +-- and handled through lua scripting. MOOSE provides an encapsulation to handle these events more efficiently. +-- +-- ### 1.3.1 Subscribe / Unsubscribe to DCS Events +-- +-- At first, the mission designer will need to **Subscribe** to a specific DCS event for the class. +-- So, when the DCS event occurs, the class will be notified of that event. +-- There are two methods which you use to subscribe to or unsubscribe from an event. +-- +-- * @{#BASE.HandleEvent}(): Subscribe to a DCS Event. +-- * @{#BASE.UnHandleEvent}(): Unsubscribe from a DCS Event. +-- +-- ### 1.3.2 Event Handling of DCS Events +-- +-- Once the class is subscribed to the event, an **Event Handling** method on the object or class needs to be written that will be called +-- when the DCS event occurs. The Event Handling method receives an @{Event#EVENTDATA} structure, which contains a lot of information +-- about the event that occurred. +-- +-- Find below an example of the prototype how to write an event handling function for two units: +-- +-- local Tank1 = UNIT:FindByName( "Tank A" ) +-- local Tank2 = UNIT:FindByName( "Tank B" ) +-- +-- -- Here we subscribe to the Dead events. So, if one of these tanks dies, the Tank1 or Tank2 objects will be notified. +-- Tank1:HandleEvent( EVENTS.Dead ) +-- Tank2:HandleEvent( EVENTS.Dead ) +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- self:SmokeGreen() +-- end +-- +-- --- This function is an Event Handling function that will be called when Tank2 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank2:OnEventDead( EventData ) +-- +-- self:SmokeBlue() +-- end +-- +-- +-- +-- See the @{Event} module for more information about event handling. +-- +-- ## 1.4) Class identification methods +-- +-- BASE provides methods to get more information of each object: +-- +-- * @{#BASE.GetClassID}(): Gets the ID (number) of the object. Each object created is assigned a number, that is incremented by one. +-- * @{#BASE.GetClassName}(): Gets the name of the object, which is the name of the class the object was instantiated from. +-- * @{#BASE.GetClassNameAndID}(): Gets the name and ID of the object. +-- +-- ## 1.5) All objects derived from BASE can have "States" +-- +-- A mechanism is in place in MOOSE, that allows to let the objects administer **states**. +-- States are essentially properties of objects, which are identified by a **Key** and a **Value**. +-- +-- The method @{#BASE.SetState}() can be used to set a Value with a reference Key to the object. +-- To **read or retrieve** a state Value based on a Key, use the @{#BASE.GetState} method. +-- +-- These two methods provide a very handy way to keep state at long lasting processes. +-- Values can be stored within the objects, and later retrieved or changed when needed. +-- There is one other important thing to note, the @{#BASE.SetState}() and @{#BASE.GetState} methods +-- receive as the **first parameter the object for which the state needs to be set**. +-- Thus, if the state is to be set for the same object as the object for which the method is used, then provide the same +-- object name to the method. +-- +-- ## 1.10) Inheritance +-- +-- The following methods are available to implement inheritance +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.GetParent}: Returns the parent object from the object it is handling, or nil if there is no parent object. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * None. +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Base + + + +local _TraceOnOff = true +local _TraceLevel = 1 +local _TraceAll = false +local _TraceClass = {} +local _TraceClassMethod = {} + +local _ClassID = 0 + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +-- @field ClassNameAndID The name of the class concatenated with the ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + _Private = {}, + Events = {}, + States = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- BASE constructor. +-- +-- This is an example how to use the BASE:New() constructor in a new class definition when inheriting from BASE. +-- +-- function EVENT:New() +-- local self = BASE:Inherit( self, BASE:New() ) -- #EVENT +-- return self +-- end +-- +-- @param #BASE self +-- @return #BASE +function BASE:New() + local self = routines.utils.deepCopy( self ) -- Create a new self instance + local MetaTable = {} + setmetatable( self, MetaTable ) + self.__index = self + _ClassID = _ClassID + 1 + self.ClassID = _ClassID + + + return self +end + +function BASE:_Destructor() + --self:E("_Destructor") + + --self:EventRemoveAll() +end + + +-- THIS IS WHY WE NEED LUA 5.2 ... +function BASE:_SetDestructor() + + -- TODO: Okay, this is really technical... + -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak... + -- Therefore, I am parking this logic until I've properly discussed all this with the community. + + local proxy = newproxy(true) + local proxyMeta = getmetatable(proxy) + + proxyMeta.__gc = function () + env.info("In __gc for " .. self:GetClassNameAndID() ) + if self._Destructor then + self:_Destructor() + end + end + + -- keep the userdata from newproxy reachable until the object + -- table is about to be garbage-collected - then the __gc hook + -- will be invoked and the destructor called + rawset( self, '__proxy', proxy ) + +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 ) + --local Parent = Parent + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + + --Child:_SetDestructor() + end + --self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- Note that the Parent class must be passed to call the parent class method. +-- +-- self:GetParent(self):ParentMethod() +-- +-- +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:GetParent( 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.ClassName, self.ClassID ) +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 + +do -- Event Handling + + --- Returns the event dispatcher + -- @param #BASE self + -- @return Core.Event#EVENT + function BASE:EventDispatcher() + + return _EVENTDISPATCHER + end + + + --- Get the Class @{Event} processing Priority. + -- The Event processing Priority is a number from 1 to 10, + -- reflecting the order of the classes subscribed to the Event to be processed. + -- @param #BASE self + -- @return #number The @{Event} processing Priority. + function BASE:GetEventPriority() + return self._Private.EventPriority or 5 + end + + --- Set the Class @{Event} processing Priority. + -- The Event processing Priority is a number from 1 to 10, + -- reflecting the order of the classes subscribed to the Event to be processed. + -- @param #BASE self + -- @param #number EventPriority The @{Event} processing Priority. + -- @return self + function BASE:SetEventPriority( EventPriority ) + self._Private.EventPriority = EventPriority + end + + --- Remove all subscribed events + -- @param #BASE self + -- @return #BASE + function BASE:EventRemoveAll() + + self:EventDispatcher():RemoveAll( self ) + + return self + end + + --- Subscribe to a DCS Event. + -- @param #BASE self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the unit. + -- @return #BASE + function BASE:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventGeneric( EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #BASE self + -- @param Core.Event#EVENTS Event + -- @return #BASE + function BASE:UnHandleEvent( Event ) + + self:EventDispatcher():Remove( self, Event ) + + return self + end + + -- Event handling function prototypes + + --- Occurs whenever any unit in a mission fires a weapon. But not any machine gun or autocannon based weapon, those are handled by EVENT.ShootingStart. + -- @function [parent=#BASE] OnEventShot + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs whenever an object is hit by a weapon. + -- initiator : The unit object the fired the weapon + -- weapon: Weapon object that hit the target + -- target: The Object that was hit. + -- @function [parent=#BASE] OnEventHit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft takes off from an airbase, farp, or ship. + -- initiator : The unit that tookoff + -- place: Object from where the AI took-off from. Can be an Airbase Object, FARP, or Ships + -- @function [parent=#BASE] OnEventTakeoff + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft lands at an airbase, farp or ship + -- initiator : The unit that has landed + -- place: Object that the unit landed on. Can be an Airbase Object, FARP, or Ships + -- @function [parent=#BASE] OnEventLand + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft crashes into the ground and is completely destroyed. + -- initiator : The unit that has crashed + -- @function [parent=#BASE] OnEventCrash + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a pilot ejects from an aircraft + -- initiator : The unit that has ejected + -- @function [parent=#BASE] OnEventEjection + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft connects with a tanker and begins taking on fuel. + -- initiator : The unit that is receiving fuel. + -- @function [parent=#BASE] OnEventRefueling + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an object is completely destroyed. + -- initiator : The unit that is was destroyed. + -- @function [parent=#BASE] OnEvent + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when the pilot of an aircraft is killed. Can occur either if the player is alive and crashes or if a weapon kills the pilot without completely destroying the plane. + -- initiator : The unit that the pilot has died in. + -- @function [parent=#BASE] OnEventPilotDead + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a ground unit captures either an airbase or a farp. + -- initiator : The unit that captured the base + -- place: The airbase that was captured, can be a FARP or Airbase. When calling place:getCoalition() the faction will already be the new owning faction. + -- @function [parent=#BASE] OnEventBaseCaptured + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a mission starts + -- @function [parent=#BASE] OnEventMissionStart + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when a mission ends + -- @function [parent=#BASE] OnEventMissionEnd + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when an aircraft is finished taking fuel. + -- initiator : The unit that was receiving fuel. + -- @function [parent=#BASE] OnEventRefuelingStop + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any object is spawned into the mission. + -- initiator : The unit that was spawned + -- @function [parent=#BASE] OnEventBirth + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any system fails on a human controlled aircraft. + -- initiator : The unit that had the failure + -- @function [parent=#BASE] OnEventHumanFailure + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft starts its engines. + -- initiator : The unit that is starting its engines. + -- @function [parent=#BASE] OnEventEngineStartup + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any aircraft shuts down its engines. + -- initiator : The unit that is stopping its engines. + -- @function [parent=#BASE] OnEventEngineShutdown + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any player assumes direct control of a unit. + -- initiator : The unit that is being taken control of. + -- @function [parent=#BASE] OnEventPlayerEnterUnit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any player relieves control of a unit to the AI. + -- initiator : The unit that the player left. + -- @function [parent=#BASE] OnEventPlayerLeaveUnit + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any unit begins firing a weapon that has a high rate of fire. Most common with aircraft cannons (GAU-8), autocannons, and machine guns. + -- initiator : The unit that is doing the shooing. + -- target: The unit that is being targeted. + -- @function [parent=#BASE] OnEventShootingStart + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + + --- Occurs when any unit stops firing its weapon. Event will always correspond with a shooting start event. + -- initiator : The unit that was doing the shooing. + -- @function [parent=#BASE] OnEventShootingEnd + -- @param #BASE self + -- @param Core.Event#EVENTDATA EventData The EventData structure. + +end + + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param Dcs.DCSTypes#Time EventTime The time stamp of the event. +-- @param Dcs.DCSWrapper.Object#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 Dcs.DCSTypes#Time EventTime The time stamp of the event. +-- @param Dcs.DCSWrapper.Object#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 Dcs.DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param Dcs.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 + +--- Set a state or property of the Object given a Key and a Value. +-- Note that if the Object is destroyed, nillified or garbage collected, then the Values and Keys will also be gone. +-- @param #BASE self +-- @param Object The object that will hold the Value set by the Key. +-- @param Key The key that is used as a reference of the value. Note that the key can be a #string, but it can also be any other type! +-- @param Value The value to is stored in the object. +-- @return The Value set. +-- @return #nil The Key was not found and thus the Value could not be retrieved. +function BASE:SetState( Object, Key, Value ) + + local ClassNameAndID = Object:GetClassNameAndID() + + self.States[ClassNameAndID] = self.States[ClassNameAndID] or {} + self.States[ClassNameAndID][Key] = Value + self:T2( { ClassNameAndID, Key, Value } ) + + return self.States[ClassNameAndID][Key] +end + + +--- Get a Value given a Key from the Object. +-- Note that if the Object is destroyed, nillified or garbage collected, then the Values and Keys will also be gone. +-- @param #BASE self +-- @param Object The object that holds the Value set by the Key. +-- @param Key The key that is used to retrieve the value. Note that the key can be a #string, but it can also be any other type! +-- @param Value The value to is stored in the Object. +-- @return The Value retrieved. +function BASE:GetState( Object, Key ) + + local ClassNameAndID = Object:GetClassNameAndID() + + if self.States[ClassNameAndID] then + local Value = self.States[ClassNameAndID][Key] or false + self:T2( { ClassNameAndID, Key, Value } ) + return Value + end + + return nil +end + +function BASE:ClearState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + self.States[ClassNameAndID][StateName] = nil + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace on or off +-- Note that when trace is off, no debug statement is performed, increasing performance! +-- When Moose is loaded statically, (as one file), tracing is switched off by default. +-- So tracing must be switched on manually in your mission if you are using Moose statically. +-- When moose is loading dynamically (for moose class development), tracing is switched on by default. +-- @param #BASE self +-- @param #boolean TraceOnOff Switch the tracing on or off. +-- @usage +-- -- Switch the tracing On +-- BASE:TraceOnOff( true ) +-- +-- -- Switch the tracing Off +-- BASE:TraceOnOff( false ) +function BASE:TraceOnOff( TraceOnOff ) + _TraceOnOff = TraceOnOff +end + + +--- Enquires if tracing is on (for the class). +-- @param #BASE self +-- @return #boolean +function BASE:IsTrace() + + if debug and ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + return true + else + return false + end +end + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Trace all methods in MOOSE +-- @param #BASE self +-- @param #boolean TraceAll true = trace all methods in MOOSE. +function BASE:TraceAll( TraceAll ) + + _TraceAll = TraceAll + + if _TraceAll then + self:E( "Tracing all methods in MOOSE " ) + else + self:E( "Switched off tracing all methods in MOOSE" ) + end +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. This function is private. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if debug and ( _TraceAll == true ) or ( _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 _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = 0 + if DebugInfoCurrent.currentline then + LineCurrent = DebugInfoCurrent.currentline + end + 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. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments ) + + if debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + end +end + +--- Trace a function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if debug and ( _TraceAll == true ) or ( _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 _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = 0 + if DebugInfoCurrent.currentline then + LineCurrent = DebugInfoCurrent.currentline + end + 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 1. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + if debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 debug and _TraceOnOff then + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + 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 ) + + if debug then + 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 + +end + + + +--- **Core** - SCHEDULER prepares and handles the **execution of functions over scheduled time (intervals)**. +-- +-- ![Banner Image](..\Presentations\SCHEDULER\Dia1.JPG) +-- +-- === +-- +-- # 1) @{Scheduler#SCHEDULER} class, extends @{Base#BASE} +-- +-- The @{Scheduler#SCHEDULER} class creates schedule. +-- +-- ## 1.1) SCHEDULER constructor +-- +-- The SCHEDULER class is quite easy to use, but note that the New constructor has variable parameters: +-- +-- * @{Scheduler#SCHEDULER.New}( nil ): Setup a new SCHEDULER object, which is persistently executed after garbage collection. +-- * @{Scheduler#SCHEDULER.New}( Object ): Setup a new SCHEDULER object, which is linked to the Object. When the Object is nillified or destroyed, the SCHEDULER object will also be destroyed and stopped after garbage collection. +-- * @{Scheduler#SCHEDULER.New}( nil, Function, FunctionArguments, Start, ... ): Setup a new persistent SCHEDULER object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- * @{Scheduler#SCHEDULER.New}( Object, Function, FunctionArguments, Start, ... ): Setup a new SCHEDULER object, linked to Object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- +-- ## 1.2) SCHEDULER timer stopping and (re-)starting. +-- +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{Scheduler#SCHEDULER.Start}(): (Re-)Start the schedules within the SCHEDULER object. If a CallID is provided to :Start(), only the schedule referenced by CallID will be (re-)started. +-- * @{Scheduler#SCHEDULER.Stop}(): Stop the schedules within the SCHEDULER object. If a CallID is provided to :Stop(), then only the schedule referenced by CallID will be stopped. +-- +-- ## 1.3) Create a new schedule +-- +-- With @{Scheduler#SCHEDULER.Schedule}() a new time event can be scheduled. This function is used by the :New() constructor when a new schedule is planned. +-- +-- === +-- +-- ### Contributions: +-- +-- * FlightControl : Concept & Testing +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Test Missions: +-- +-- * SCH - Scheduler +-- +-- === +-- +-- @module Scheduler + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @field #number ScheduleID the ID of the scheduler. +-- @extends Core.Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", + Schedules = {}, +} + +--- SCHEDULER constructor. +-- @param #SCHEDULER self +-- @param #table SchedulerObject 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 SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self. +-- @return #number The ScheduleID of the planned schedule. +function SCHEDULER:New( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) + + local ScheduleID = nil + + self.MasterObject = SchedulerObject + + if SchedulerFunction then + ScheduleID = self:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + end + + return self, ScheduleID +end + +--function SCHEDULER:_Destructor() +-- --self:E("_Destructor") +-- +-- _SCHEDULEDISPATCHER:RemoveSchedule( self.CallID ) +--end + +--- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. +-- @param #SCHEDULER self +-- @param #table SchedulerObject 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 SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. +-- @return #number The ScheduleID of the planned schedule. +function SCHEDULER:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) + self:T3( { SchedulerArguments } ) + + local ObjectName = "-" + if SchedulerObject and SchedulerObject.ClassName and SchedulerObject.ClassID then + ObjectName = SchedulerObject.ClassName .. SchedulerObject.ClassID + end + self:F3( { "Schedule :", ObjectName, tostring( SchedulerObject ), Start, Repeat, RandomizeFactor, Stop } ) + self.SchedulerObject = SchedulerObject + + local ScheduleID = _SCHEDULEDISPATCHER:AddSchedule( + self, + SchedulerFunction, + SchedulerArguments, + Start, + Repeat, + RandomizeFactor, + Stop + ) + + self.Schedules[#self.Schedules+1] = ScheduleID + + return ScheduleID +end + +--- (Re-)Starts the schedules or a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Start( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Start( self, ScheduleID ) +end + +--- Stops the schedules or a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Stop( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Stop( self, ScheduleID ) +end + +--- Removes a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Remove( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Remove( self, ScheduleID ) +end + +--- Clears all pending schedules. +-- @param #SCHEDULER self +function SCHEDULER:Clear() + self:F3( ) + + _SCHEDULEDISPATCHER:Clear( self ) +end + + + + + + + + + + + + + + +--- This module defines the SCHEDULEDISPATCHER class, which is used by a central object called _SCHEDULEDISPATCHER. +-- +-- === +-- +-- Takes care of the creation and dispatching of scheduled functions for SCHEDULER objects. +-- +-- This class is tricky and needs some thorought explanation. +-- SCHEDULE classes are used to schedule functions for objects, or as persistent objects. +-- The SCHEDULEDISPATCHER class ensures that: +-- +-- - Scheduled functions are planned according the SCHEDULER object parameters. +-- - Scheduled functions are repeated when requested, according the SCHEDULER object parameters. +-- - Scheduled functions are automatically removed when the schedule is finished, according the SCHEDULER object parameters. +-- +-- The SCHEDULEDISPATCHER class will manage SCHEDULER object in memory during garbage collection: +-- - When a SCHEDULER object is not attached to another object (that is, it's first :Schedule() parameter is nil), then the SCHEDULER +-- object is _persistent_ within memory. +-- - When a SCHEDULER object *is* attached to another object, then the SCHEDULER object is _not persistent_ within memory after a garbage collection! +-- The none persistency of SCHEDULERS attached to objects is required to allow SCHEDULER objects to be garbage collectged, when the parent object is also desroyed or nillified and garbage collected. +-- Even when there are pending timer scheduled functions to be executed for the SCHEDULER object, +-- these will not be executed anymore when the SCHEDULER object has been destroyed. +-- +-- The SCHEDULEDISPATCHER allows multiple scheduled functions to be planned and executed for one SCHEDULER object. +-- The SCHEDULER object therefore keeps a table of "CallID's", which are returned after each planning of a new scheduled function by the SCHEDULEDISPATCHER. +-- The SCHEDULER object plans new scheduled functions through the @{Scheduler#SCHEDULER.Schedule}() method. +-- The Schedule() method returns the CallID that is the reference ID for each planned schedule. +-- +-- === +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- +-- @module ScheduleDispatcher + +--- The SCHEDULEDISPATCHER structure +-- @type SCHEDULEDISPATCHER +SCHEDULEDISPATCHER = { + ClassName = "SCHEDULEDISPATCHER", + CallID = 0, +} + +function SCHEDULEDISPATCHER:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F3() + return self +end + +--- Add a Schedule to the ScheduleDispatcher. +-- The development of this method was really tidy. +-- It is constructed as such that a garbage collection is executed on the weak tables, when the Scheduler is nillified. +-- Nothing of this code should be modified without testing it thoroughly. +-- @param #SCHEDULEDISPATCHER self +-- @param Core.Scheduler#SCHEDULER Scheduler +function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop ) + self:F2( { Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop } ) + + self.CallID = self.CallID + 1 + + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.PersistentSchedulers = self.PersistentSchedulers or {} + + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.ObjectSchedulers = self.ObjectSchedulers or setmetatable( {}, { __mode = "v" } ) -- or {} + + if Scheduler.MasterObject then + self.ObjectSchedulers[self.CallID] = Scheduler + self:F3( { CallID = self.CallID, ObjectScheduler = tostring(self.ObjectSchedulers[self.CallID]), MasterObject = tostring(Scheduler.MasterObject) } ) + else + self.PersistentSchedulers[self.CallID] = Scheduler + self:F3( { CallID = self.CallID, PersistentScheduler = self.PersistentSchedulers[self.CallID] } ) + end + + self.Schedule = self.Schedule or setmetatable( {}, { __mode = "k" } ) + self.Schedule[Scheduler] = self.Schedule[Scheduler] or {} + self.Schedule[Scheduler][self.CallID] = {} + self.Schedule[Scheduler][self.CallID].Function = ScheduleFunction + self.Schedule[Scheduler][self.CallID].Arguments = ScheduleArguments + self.Schedule[Scheduler][self.CallID].StartTime = timer.getTime() + ( Start or 0 ) + self.Schedule[Scheduler][self.CallID].Start = Start + .1 + self.Schedule[Scheduler][self.CallID].Repeat = Repeat + self.Schedule[Scheduler][self.CallID].Randomize = Randomize + self.Schedule[Scheduler][self.CallID].Stop = Stop + + self:T3( self.Schedule[Scheduler][self.CallID] ) + + self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) + self:F2( CallID ) + + local ErrorHandler = function( errmsg ) + env.info( "Error in timer function: " .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + return errmsg + end + + local Scheduler = self.ObjectSchedulers[CallID] + if not Scheduler then + Scheduler = self.PersistentSchedulers[CallID] + end + + self:T3( { Scheduler = Scheduler } ) + + if Scheduler then + + local Schedule = self.Schedule[Scheduler][CallID] + + self:T3( { Schedule = Schedule } ) + + local ScheduleObject = Scheduler.SchedulerObject + --local ScheduleObjectName = Scheduler.SchedulerObject:GetNameAndClassID() + local ScheduleFunction = Schedule.Function + local ScheduleArguments = Schedule.Arguments + local Start = Schedule.Start + local Repeat = Schedule.Repeat or 0 + local Randomize = Schedule.Randomize or 0 + local Stop = Schedule.Stop or 0 + local ScheduleID = Schedule.ScheduleID + + local Status, Result + if ScheduleObject then + local function Timer() + return ScheduleFunction( ScheduleObject, unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + else + local function Timer() + return ScheduleFunction( unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + end + + local CurrentTime = timer.getTime() + local StartTime = CurrentTime + Start + + if Status and (( Result == nil ) or ( Result and Result ~= false ) ) then + if Repeat ~= 0 and ( Stop == 0 ) or ( Stop ~= 0 and CurrentTime <= StartTime + Stop ) then + local ScheduleTime = + CurrentTime + + Repeat + + math.random( + - ( Randomize * Repeat / 2 ), + ( Randomize * Repeat / 2 ) + ) + + 0.01 + self:T3( { Repeat = CallID, CurrentTime, ScheduleTime, ScheduleArguments } ) + return ScheduleTime -- returns the next time the function needs to be called. + else + self:Stop( Scheduler, CallID ) + end + else + self:Stop( Scheduler, CallID ) + end + else + self:E( "Scheduled obscolete call for CallID: " .. CallID ) + end + + return nil + end + + self:Start( Scheduler, self.CallID ) + + return self.CallID +end + +function SCHEDULEDISPATCHER:RemoveSchedule( Scheduler, CallID ) + self:F2( { Remove = CallID, Scheduler = Scheduler } ) + + if CallID then + self:Stop( Scheduler, CallID ) + self.Schedule[Scheduler][CallID] = nil + end +end + +function SCHEDULEDISPATCHER:Start( Scheduler, CallID ) + self:F2( { Start = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + -- Only start when there is no ScheduleID defined! + -- This prevents to "Start" the scheduler twice with the same CallID... + if not Schedule[CallID].ScheduleID then + Schedule[CallID].ScheduleID = timer.scheduleFunction( + Schedule[CallID].CallHandler, + CallID, + timer.getTime() + Schedule[CallID].Start + ) + end + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Start( Scheduler, CallID ) -- Recursive + end + end +end + +function SCHEDULEDISPATCHER:Stop( Scheduler, CallID ) + self:F2( { Stop = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + -- Only stop when there is a ScheduleID defined for the CallID. + -- So, when the scheduler was stopped before, do nothing. + if Schedule[CallID].ScheduleID then + timer.removeFunction( Schedule[CallID].ScheduleID ) + Schedule[CallID].ScheduleID = nil + end + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Stop( Scheduler, CallID ) -- Recursive + end + end +end + +function SCHEDULEDISPATCHER:Clear( Scheduler ) + self:F2( { Scheduler = Scheduler } ) + + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Stop( Scheduler, CallID ) -- Recursive + end +end + + + +--- **Core** - EVENT models DCS **event dispatching** using a **publish-subscribe** model. +-- +-- ![Banner Image](..\Presentations\EVENT\Dia1.JPG) +-- +-- === +-- +-- # 1) Event Handling Overview +-- +-- ![Objects](..\Presentations\EVENT\Dia2.JPG) +-- +-- Within a running mission, various DCS events occur. Units are dynamically created, crash, die, shoot stuff, get hit etc. +-- This module provides a mechanism to dispatch those events occuring within your running mission, to the different objects orchestrating your mission. +-- +-- ![Objects](..\Presentations\EVENT\Dia3.JPG) +-- +-- Objects can subscribe to different events. The Event dispatcher will publish the received DCS events to the subscribed MOOSE objects, in a specified order. +-- In this way, the subscribed MOOSE objects are kept in sync with your evolving running mission. +-- +-- ## 1.1) Event Dispatching +-- +-- ![Objects](..\Presentations\EVENT\Dia4.JPG) +-- +-- The _EVENTDISPATCHER object is automatically created within MOOSE, +-- and handles the dispatching of DCS Events occurring +-- in the simulator to the subscribed objects +-- in the correct processing order. +-- +-- ![Objects](..\Presentations\EVENT\Dia5.JPG) +-- +-- There are 5 levels of kind of objects that the _EVENTDISPATCHER services: +-- +-- * _DATABASE object: The core of the MOOSE objects. Any object that is created, deleted or updated, is done in this database. +-- * SET_ derived classes: Subsets of the _DATABASE object. These subsets are updated by the _EVENTDISPATCHER as the second priority. +-- * UNIT objects: UNIT objects can subscribe to DCS events. Each DCS event will be directly published to teh subscribed UNIT object. +-- * GROUP objects: GROUP objects can subscribe to DCS events. Each DCS event will be directly published to the subscribed GROUP object. +-- * Any other object: Various other objects can subscribe to DCS events. Each DCS event triggered will be published to each subscribed object. +-- +-- ![Objects](..\Presentations\EVENT\Dia6.JPG) +-- +-- For most DCS events, the above order of updating will be followed. +-- +-- ![Objects](..\Presentations\EVENT\Dia7.JPG) +-- +-- But for some DCS events, the publishing order is reversed. This is due to the fact that objects need to be **erased** instead of added. +-- +-- ## 1.2) Event Handling +-- +-- ![Objects](..\Presentations\EVENT\Dia8.JPG) +-- +-- The actual event subscribing and handling is not facilitated through the _EVENTDISPATCHER, but it is done through the @{BASE} class, @{UNIT} class and @{GROUP} class. +-- The _EVENTDISPATCHER is a component that is quietly working in the background of MOOSE. +-- +-- ![Objects](..\Presentations\EVENT\Dia9.JPG) +-- +-- The BASE class provides methods to catch DCS Events. These are events that are triggered from within the DCS simulator, +-- and handled through lua scripting. MOOSE provides an encapsulation to handle these events more efficiently. +-- +-- ### 1.2.1 Subscribe / Unsubscribe to DCS Events +-- +-- At first, the mission designer will need to **Subscribe** to a specific DCS event for the class. +-- So, when the DCS event occurs, the class will be notified of that event. +-- There are two functions which you use to subscribe to or unsubscribe from an event. +-- +-- * @{Base#BASE.HandleEvent}(): Subscribe to a DCS Event. +-- * @{Base#BASE.UnHandleEvent}(): Unsubscribe from a DCS Event. +-- +-- Note that for a UNIT, the event will be handled **for that UNIT only**! +-- Note that for a GROUP, the event will be handled **for all the UNITs in that GROUP only**! +-- +-- For all objects of other classes, the subscribed events will be handled for **all UNITs within the Mission**! +-- So if a UNIT within the mission has the subscribed event for that object, +-- then the object event handler will receive the event for that UNIT! +-- +-- ### 1.3.2 Event Handling of DCS Events +-- +-- Once the class is subscribed to the event, an **Event Handling** method on the object or class needs to be written that will be called +-- when the DCS event occurs. The Event Handling method receives an @{Event#EVENTDATA} structure, which contains a lot of information +-- about the event that occurred. +-- +-- Find below an example of the prototype how to write an event handling function for two units: +-- +-- local Tank1 = UNIT:FindByName( "Tank A" ) +-- local Tank2 = UNIT:FindByName( "Tank B" ) +-- +-- -- Here we subscribe to the Dead events. So, if one of these tanks dies, the Tank1 or Tank2 objects will be notified. +-- Tank1:HandleEvent( EVENTS.Dead ) +-- Tank2:HandleEvent( EVENTS.Dead ) +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- self:SmokeGreen() +-- end +-- +-- --- This function is an Event Handling function that will be called when Tank2 is Dead. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank2:OnEventDead( EventData ) +-- +-- self:SmokeBlue() +-- end +-- +-- ### 1.3.3 Event Handling methods that are automatically called upon subscribed DCS events +-- +-- ![Objects](..\Presentations\EVENT\Dia10.JPG) +-- +-- The following list outlines which EVENTS item in the structure corresponds to which Event Handling method. +-- Always ensure that your event handling methods align with the events being subscribed to, or nothing will be executed. +-- +-- # 2) EVENTS type +-- +-- The EVENTS structure contains names for all the different DCS events that objects can subscribe to using the +-- @{Base#BASE.HandleEvent}() method. +-- +-- # 3) EVENTDATA type +-- +-- The @{Event#EVENTDATA} structure contains all the fields that are populated with event information before +-- an Event Handler method is being called by the event dispatcher. +-- The Event Handler received the EVENTDATA object as a parameter, and can be used to investigate further the different events. +-- There are basically 4 main categories of information stored in the EVENTDATA structure: +-- +-- * Initiator Unit data: Several fields documenting the initiator unit related to the event. +-- * Target Unit data: Several fields documenting the target unit related to the event. +-- * Weapon data: Certain events populate weapon information. +-- * Place data: Certain events populate place information. +-- +-- --- This function is an Event Handling function that will be called when Tank1 is Dead. +-- -- EventData is an EVENTDATA structure. +-- -- We use the EventData.IniUnit to smoke the tank Green. +-- -- @param Wrapper.Unit#UNIT self +-- -- @param Core.Event#EVENTDATA EventData +-- function Tank1:OnEventDead( EventData ) +-- +-- EventData.IniUnit:SmokeGreen() +-- end +-- +-- +-- Find below an overview which events populate which information categories: +-- +-- ![Objects](..\Presentations\EVENT\Dia14.JPG) +-- +-- **IMPORTANT NOTE:** Some events can involve not just UNIT objects, but also STATIC objects!!! +-- In that case the initiator or target unit fields will refer to a STATIC object! +-- In case a STATIC object is involved, the documentation indicates which fields will and won't not be populated. +-- The fields **IniObjectCategory** and **TgtObjectCategory** contain the indicator which **kind of object is involved** in the event. +-- You can use the enumerator **Object.Category.UNIT** and **Object.Category.STATIC** to check on IniObjectCategory and TgtObjectCategory. +-- Example code snippet: +-- +-- if Event.IniObjectCategory == Object.Category.UNIT then +-- ... +-- end +-- if Event.IniObjectCategory == Object.Category.STATIC then +-- ... +-- end +-- +-- When a static object is involved in the event, the Group and Player fields won't be populated. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- * 2017-03-07: Added the correct event dispatching in case the event is subscribed by a GROUP. +-- +-- * 2017-02-07: Did a complete revision of the Event Handing API and underlying mechanisms. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- ### Authors: +-- +-- * [**FlightControl**](https://forums.eagle.ru/member.php?u=89536): Design & Programming & documentation. +-- +-- @module Event + + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +-- @extends Core.Base#BASE +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +--- The different types of events supported by MOOSE. +-- Use this structure to subscribe to events using the @{Base#BASE.HandleEvent}() method. +-- @type EVENTS +EVENTS = { + Shot = world.event.S_EVENT_SHOT, + Hit = world.event.S_EVENT_HIT, + Takeoff = world.event.S_EVENT_TAKEOFF, + Land = world.event.S_EVENT_LAND, + Crash = world.event.S_EVENT_CRASH, + Ejection = world.event.S_EVENT_EJECTION, + Refueling = world.event.S_EVENT_REFUELING, + Dead = world.event.S_EVENT_DEAD, + PilotDead = world.event.S_EVENT_PILOT_DEAD, + BaseCaptured = world.event.S_EVENT_BASE_CAPTURED, + MissionStart = world.event.S_EVENT_MISSION_START, + MissionEnd = world.event.S_EVENT_MISSION_END, + TookControl = world.event.S_EVENT_TOOK_CONTROL, + RefuelingStop = world.event.S_EVENT_REFUELING_STOP, + Birth = world.event.S_EVENT_BIRTH, + HumanFailure = world.event.S_EVENT_HUMAN_FAILURE, + EngineStartup = world.event.S_EVENT_ENGINE_STARTUP, + EngineShutdown = world.event.S_EVENT_ENGINE_SHUTDOWN, + PlayerEnterUnit = world.event.S_EVENT_PLAYER_ENTER_UNIT, + PlayerLeaveUnit = world.event.S_EVENT_PLAYER_LEAVE_UNIT, + PlayerComment = world.event.S_EVENT_PLAYER_COMMENT, + ShootingStart = world.event.S_EVENT_SHOOTING_START, + ShootingEnd = world.event.S_EVENT_SHOOTING_END, +} + +--- The Event structure +-- Note that at the beginning of each field description, there is an indication which field will be populated depending on the object type involved in the Event: +-- +-- * A (Object.Category.)UNIT : A UNIT object type is involved in the Event. +-- * A (Object.Category.)STATIC : A STATIC object type is involved in the Event.µ +-- +-- @type EVENTDATA +-- @field #number id The identifier of the event. +-- +-- @field Dcs.DCSUnit#Unit initiator (UNIT/STATIC/SCENERY) The initiating @{Dcs.DCSUnit#Unit} or @{Dcs.DCSStaticObject#StaticObject}. +-- @field Dcs.DCSObject#Object.Category IniObjectCategory (UNIT/STATIC/SCENERY) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ). +-- @field Dcs.DCSUnit#Unit IniDCSUnit (UNIT/STATIC) The initiating @{DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field #string IniDCSUnitName (UNIT/STATIC) The initiating Unit name. +-- @field Wrapper.Unit#UNIT IniUnit (UNIT/STATIC) The initiating MOOSE wrapper @{Unit#UNIT} of the initiator Unit object. +-- @field #string IniUnitName (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName). +-- @field Dcs.DCSGroup#Group IniDCSGroup (UNIT) The initiating {DCSGroup#Group}. +-- @field #string IniDCSGroupName (UNIT) The initiating Group name. +-- @field Wrapper.Group#GROUP IniGroup (UNIT) The initiating MOOSE wrapper @{Group#GROUP} of the initiator Group object. +-- @field #string IniGroupName UNIT) The initiating GROUP name (same as IniDCSGroupName). +-- @field #string IniPlayerName (UNIT) The name of the initiating player in case the Unit is a client or player slot. +-- @field Dcs.DCScoalition#coalition.side IniCoalition (UNIT) The coalition of the initiator. +-- @field Dcs.DCSUnit#Unit.Category IniCategory (UNIT) The category of the initiator. +-- @field #string IniTypeName (UNIT) The type name of the initiator. +-- +-- @field Dcs.DCSUnit#Unit target (UNIT/STATIC) The target @{Dcs.DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field Dcs.DCSObject#Object.Category TgtObjectCategory (UNIT/STATIC) The target object category ( Object.Category.UNIT or Object.Category.STATIC ). +-- @field Dcs.DCSUnit#Unit TgtDCSUnit (UNIT/STATIC) The target @{DCSUnit#Unit} or @{DCSStaticObject#StaticObject}. +-- @field #string TgtDCSUnitName (UNIT/STATIC) The target Unit name. +-- @field Wrapper.Unit#UNIT TgtUnit (UNIT/STATIC) The target MOOSE wrapper @{Unit#UNIT} of the target Unit object. +-- @field #string TgtUnitName (UNIT/STATIC) The target UNIT name (same as TgtDCSUnitName). +-- @field Dcs.DCSGroup#Group TgtDCSGroup (UNIT) The target {DCSGroup#Group}. +-- @field #string TgtDCSGroupName (UNIT) The target Group name. +-- @field Wrapper.Group#GROUP TgtGroup (UNIT) The target MOOSE wrapper @{Group#GROUP} of the target Group object. +-- @field #string TgtGroupName (UNIT) The target GROUP name (same as TgtDCSGroupName). +-- @field #string TgtPlayerName (UNIT) The name of the target player in case the Unit is a client or player slot. +-- @field Dcs.DCScoalition#coalition.side TgtCoalition (UNIT) The coalition of the target. +-- @field Dcs.DCSUnit#Unit.Category TgtCategory (UNIT) The category of the target. +-- @field #string TgtTypeName (UNIT) The type name of the target. +-- +-- @field weapon The weapon used during the event. +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + + +local _EVENTMETA = { + [world.event.S_EVENT_SHOT] = { + Order = 1, + Event = "OnEventShot", + Text = "S_EVENT_SHOT" + }, + [world.event.S_EVENT_HIT] = { + Order = 1, + Event = "OnEventHit", + Text = "S_EVENT_HIT" + }, + [world.event.S_EVENT_TAKEOFF] = { + Order = 1, + Event = "OnEventTakeoff", + Text = "S_EVENT_TAKEOFF" + }, + [world.event.S_EVENT_LAND] = { + Order = 1, + Event = "OnEventLand", + Text = "S_EVENT_LAND" + }, + [world.event.S_EVENT_CRASH] = { + Order = -1, + Event = "OnEventCrash", + Text = "S_EVENT_CRASH" + }, + [world.event.S_EVENT_EJECTION] = { + Order = 1, + Event = "OnEventEjection", + Text = "S_EVENT_EJECTION" + }, + [world.event.S_EVENT_REFUELING] = { + Order = 1, + Event = "OnEventRefueling", + Text = "S_EVENT_REFUELING" + }, + [world.event.S_EVENT_DEAD] = { + Order = -1, + Event = "OnEventDead", + Text = "S_EVENT_DEAD" + }, + [world.event.S_EVENT_PILOT_DEAD] = { + Order = 1, + Event = "OnEventPilotDead", + Text = "S_EVENT_PILOT_DEAD" + }, + [world.event.S_EVENT_BASE_CAPTURED] = { + Order = 1, + Event = "OnEventBaseCaptured", + Text = "S_EVENT_BASE_CAPTURED" + }, + [world.event.S_EVENT_MISSION_START] = { + Order = 1, + Event = "OnEventMissionStart", + Text = "S_EVENT_MISSION_START" + }, + [world.event.S_EVENT_MISSION_END] = { + Order = 1, + Event = "OnEventMissionEnd", + Text = "S_EVENT_MISSION_END" + }, + [world.event.S_EVENT_TOOK_CONTROL] = { + Order = 1, + Event = "OnEventTookControl", + Text = "S_EVENT_TOOK_CONTROL" + }, + [world.event.S_EVENT_REFUELING_STOP] = { + Order = 1, + Event = "OnEventRefuelingStop", + Text = "S_EVENT_REFUELING_STOP" + }, + [world.event.S_EVENT_BIRTH] = { + Order = 1, + Event = "OnEventBirth", + Text = "S_EVENT_BIRTH" + }, + [world.event.S_EVENT_HUMAN_FAILURE] = { + Order = 1, + Event = "OnEventHumanFailure", + Text = "S_EVENT_HUMAN_FAILURE" + }, + [world.event.S_EVENT_ENGINE_STARTUP] = { + Order = 1, + Event = "OnEventEngineStartup", + Text = "S_EVENT_ENGINE_STARTUP" + }, + [world.event.S_EVENT_ENGINE_SHUTDOWN] = { + Order = 1, + Event = "OnEventEngineShutdown", + Text = "S_EVENT_ENGINE_SHUTDOWN" + }, + [world.event.S_EVENT_PLAYER_ENTER_UNIT] = { + Order = 1, + Event = "OnEventPlayerEnterUnit", + Text = "S_EVENT_PLAYER_ENTER_UNIT" + }, + [world.event.S_EVENT_PLAYER_LEAVE_UNIT] = { + Order = -1, + Event = "OnEventPlayerLeaveUnit", + Text = "S_EVENT_PLAYER_LEAVE_UNIT" + }, + [world.event.S_EVENT_PLAYER_COMMENT] = { + Order = 1, + Event = "OnEventPlayerComment", + Text = "S_EVENT_PLAYER_COMMENT" + }, + [world.event.S_EVENT_SHOOTING_START] = { + Order = 1, + Event = "OnEventShootingStart", + Text = "S_EVENT_SHOOTING_START" + }, + [world.event.S_EVENT_SHOOTING_END] = { + Order = 1, + Event = "OnEventShootingEnd", + Text = "S_EVENT_SHOOTING_END" + }, +} + + +--- 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 = _EVENTMETA[EventID].Text + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param Dcs.DCSWorld#world.event EventID +-- @param Core.Base#BASE EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTMETA[EventID].Text, EventClass } ) + + if not self.Events[EventID] then + -- Create a WEAK table to ensure that the garbage collector is cleaning the event links when the object usage is cleaned. + self.Events[EventID] = setmetatable( {}, { __mode = "k" } ) + end + + -- Each event has a subtable of EventClasses, ordered by EventPriority. + local EventPriority = EventClass:GetEventPriority() + if not self.Events[EventID][EventPriority] then + self.Events[EventID][EventPriority] = setmetatable( {}, { __mode = "k" } ) + end + + if not self.Events[EventID][EventPriority][EventClass] then + self.Events[EventID][EventPriority][EventClass] = setmetatable( {}, { __mode = "v" } ) + end + return self.Events[EventID][EventPriority][EventClass] +end + +--- Removes an Events entry +-- @param #EVENT self +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:Remove( EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + self.Events[EventID][EventPriority][EventClass] = nil +end + +--- Removes an Events entry for a UNIT. +-- @param #EVENT self +-- @param #string UnitName The name of the UNIT. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:RemoveForUnit( UnitName, EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + local Event = self.Events[EventID][EventPriority][EventClass] + Event.EventUnit[UnitName] = nil +end + +--- Removes an Events entry for a GROUP. +-- @param #EVENT self +-- @param #string GroupName The name of the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param Dcs.DCSWorld#world.event EventID +-- @return #EVENT.Events +function EVENT:RemoveForGroup( GroupName, EventClass, EventID ) + self:F3( { EventClass, _EVENTMETA[EventID].Text } ) + + local EventClass = EventClass + local EventPriority = EventClass:GetEventPriority() + local Event = self.Events[EventID][EventPriority][EventClass] + Event.EventGroup[GroupName] = nil +end + +--- Clears all event subscriptions for a @{Base#BASE} derived object. +-- @param #EVENT self +-- @param Core.Base#BASE EventObject +function EVENT:RemoveAll( EventObject ) + self:F3( { EventObject:GetClassNameAndID() } ) + + local EventClass = EventObject:GetClassNameAndID() + local EventPriority = EventClass:GetEventPriority() + for EventID, EventData in pairs( self.Events ) do + self.Events[EventID][EventPriority][EventClass] = nil + end +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 EventClass The instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EventID ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + self:OnEventForUnit( EventUnit.name, EventFunction, EventClass, EventID ) + 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 Core.Base#BASE EventClass The self instance of the class for which the event is captured. When the event happens, the event process will be called in this class provided. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventClass, EventID ) + self:F2( { EventID } ) + + local EventData = self:Init( EventID, EventClass ) + EventData.EventFunction = EventFunction + EventData.EventClass = EventClass + + return self +end + + +--- Set a new listener for an S_EVENT_X event for a UNIT. +-- @param #EVENT self +-- @param #string UnitName The name of the UNIT. +-- @param #function EventFunction The function to be called when the event occurs for the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( UnitName, EventFunction, EventClass, EventID ) + self:F2( UnitName ) + + local EventData = self:Init( EventID, EventClass ) + if not EventData.EventUnit then + EventData.EventUnit = {} + end + EventData.EventUnit[UnitName] = {} + EventData.EventUnit[UnitName].EventFunction = EventFunction + EventData.EventUnit[UnitName].EventClass = EventClass + return self +end + +--- Set a new listener for an S_EVENT_X event for a GROUP. +-- @param #EVENT self +-- @param #string GroupName The name of the GROUP. +-- @param #function EventFunction The function to be called when the event occurs for the GROUP. +-- @param Core.Base#BASE EventClass The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForGroup( GroupName, EventFunction, EventClass, EventID ) + self:F2( GroupName ) + + local Event = self:Init( EventID, EventClass ) + if not Event.EventGroup then + Event.EventGroup = {} + end + Event.EventGroup[GroupName] = {} + Event.EventGroup[GroupName].EventFunction = EventFunction + Event.EventGroup[GroupName].EventClass = EventClass + return self +end + +do -- OnBirth + + --- Create an OnBirth event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Birth ) + + return self + end + +end + +do -- OnCrash + + --- Create an OnCrash event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Crash ) + + return self + end + +end + +do -- OnDead + + --- Create an OnDead event handler for a group + -- @param #EVENT self + -- @param Wrapper.Group#GROUP EventGroup + -- @param #function EventFunction The function to be called when the event occurs for the unit. + -- @param EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Dead ) + + return self + end + +end + + +do -- OnLand + --- Create an OnLand 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Land ) + + return self + end + +end + +do -- OnTakeOff + --- Create an OnTakeOff 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.Takeoff ) + + return self + end + +end + +do -- OnEngineShutDown + + --- 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 EventClass The self instance of the class for which the event is. + -- @return #EVENT + function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventClass ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventClass, EVENTS.EngineShutdown ) + + return self + end + +end + + +--- @param #EVENT self +-- @param #EVENTDATA Event +function EVENT:onEvent( Event ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self and self.Events and self.Events[Event.id] then + + + if Event.initiator then + + Event.IniObjectCategory = Event.initiator:getCategory() + + if Event.IniObjectCategory == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniUnit = UNIT:FindByName( Event.IniDCSUnitName ) + if not Event.IniUnit then + -- Unit can be a CLIENT. Most likely this will be the case ... + Event.IniUnit = CLIENT:FindByName( Event.IniDCSUnitName, '', true ) + end + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) + if Event.IniGroup then + Event.IniGroupName = Event.IniDCSGroupName + end + end + Event.IniPlayerName = Event.IniDCSUnit:getPlayerName() + Event.IniCoalition = Event.IniDCSUnit:getCoalition() + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + Event.IniCategory = Event.IniDCSUnit:getDesc().category + end + + if Event.IniObjectCategory == Object.Category.STATIC then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniUnit = STATIC:FindByName( Event.IniDCSUnitName, false ) + Event.IniCoalition = Event.IniDCSUnit:getCoalition() + Event.IniCategory = Event.IniDCSUnit:getDesc().category + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + end + + if Event.IniObjectCategory == Object.Category.SCENERY then + Event.IniDCSUnit = Event.initiator + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniUnitName = Event.IniDCSUnitName + Event.IniUnit = SCENERY:Register( Event.IniDCSUnitName, Event.initiator ) + Event.IniCategory = Event.IniDCSUnit:getDesc().category + Event.IniTypeName = Event.IniDCSUnit:getTypeName() + end + end + + if Event.target then + + Event.TgtObjectCategory = Event.target:getCategory() + + if Event.TgtObjectCategory == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = UNIT:FindByName( Event.TgtDCSUnitName ) + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) + if Event.TgtGroup then + Event.TgtGroupName = Event.TgtDCSGroupName + end + end + Event.TgtPlayerName = Event.TgtDCSUnit:getPlayerName() + Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + + if Event.TgtObjectCategory == Object.Category.STATIC then + Event.TgtDCSUnit = Event.target + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = STATIC:FindByName( Event.TgtDCSUnitName ) + Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + + if Event.TgtObjectCategory == Object.Category.SCENERY then + Event.TgtDCSUnit = Event.target + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtUnitName = Event.TgtDCSUnitName + Event.TgtUnit = SCENERY:Register( Event.TgtDCSUnitName, Event.target ) + Event.TgtCategory = Event.TgtDCSUnit:getDesc().category + Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() + end + end + + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + Event.WeaponUNIT = CLIENT:Find( Event.Weapon, '', true ) -- Sometimes, the weapon is a player unit! + Event.WeaponPlayerName = Event.WeaponUNIT and Event.Weapon:getPlayerName() + Event.WeaponCoalition = Event.WeaponUNIT and Event.Weapon:getCoalition() + Event.WeaponCategory = Event.WeaponUNIT and Event.Weapon:getDesc().category + Event.WeaponTypeName = Event.WeaponUNIT and Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + + local PriorityOrder = _EVENTMETA[Event.id].Order + local PriorityBegin = PriorityOrder == -1 and 5 or 1 + local PriorityEnd = PriorityOrder == -1 and 1 or 5 + + if Event.IniObjectCategory ~= 3 then + self:E( { _EVENTMETA[Event.id].Text, Event, Event.IniDCSUnitName, Event.TgtDCSUnitName, PriorityOrder } ) + end + + for EventPriority = PriorityBegin, PriorityEnd, PriorityOrder do + + if self.Events[Event.id][EventPriority] then + + -- Okay, we got the event from DCS. Now loop the SORTED self.EventSorted[] table for the received Event.id, and for each EventData registered, check if a function needs to be called. + for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do + + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) + Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) + + -- If the EventData is for a UNIT, the call directly the EventClass EventFunction for that UNIT. + if ( Event.IniDCSUnitName and EventData.EventUnit and EventData.EventUnit[Event.IniDCSUnitName] ) or + ( Event.TgtDCSUnitName and EventData.EventUnit and EventData.EventUnit[Event.TgtDCSUnitName] ) then + + if EventData.EventUnit[Event.IniDCSUnitName] then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventUnit[Event.IniDCSUnitName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for UNIT ", EventClass:GetClassNameAndID(), ", Unit ", Event.IniUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventUnit[Event.IniDCSUnitName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + if EventData.EventUnit[Event.TgtDCSUnitName] then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventUnit[Event.TgtDCSUnitName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for UNIT ", EventClass:GetClassNameAndID(), ", Unit ", Event.TgtUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventUnit[Event.TgtDCSUnitName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + else + + -- If the EventData is for a GROUP, the call directly the EventClass EventFunction for the UNIT in that GROUP. + if ( Event.IniDCSUnitName and Event.IniDCSGroupName and Event.IniGroupName and EventData.EventGroup and EventData.EventGroup[Event.IniGroupName] ) or + ( Event.TgtDCSUnitName and Event.TgtDCSGroupName and Event.TgtGroupName and EventData.EventGroup and EventData.EventGroup[Event.TgtGroupName] ) then + + if EventData.EventGroup[Event.IniGroupName] then + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventGroup[Event.IniGroupName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for GROUP ", EventClass:GetClassNameAndID(), ", Unit ", Event.IniUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventGroup[Event.IniGroupName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for GROUP ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + if EventData.EventGroup[Event.TgtGroupName] then + if EventData.EventGroup[Event.TgtGroupName].EventFunction then + + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for GROUP ", EventClass:GetClassNameAndID(), ", Unit ", Event.TgtUnitName, EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventData.EventGroup[Event.TgtGroupName].EventFunction( EventClass, Event ) + end, ErrorHandler ) + + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for GROUP ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + return EventFunction( EventClass, Event ) + end, ErrorHandler ) + end + end + end + + else + + -- If the EventData is not bound to a specific unit, then call the EventClass EventFunction. + -- Note that here the EventFunction will need to implement and determine the logic for the relevant source- or target unit, or weapon. + if (Event.IniDCSUnit or Event.WeaponUNIT) and not EventData.EventUnit then + + if EventClass == EventData.EventClass then + + -- First test if a EventFunction is Set, otherwise search for the default function + if EventData.EventFunction then + + -- There is an EventFunction defined, so call the EventFunction. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling EventFunction for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + local Result, Value = xpcall( + function() + return EventData.EventFunction( EventClass, Event ) + end, ErrorHandler ) + else + + -- There is no EventFunction defined, so try to find if a default OnEvent function is defined on the object. + local EventFunction = EventClass[ _EVENTMETA[Event.id].Event ] + if EventFunction and type( EventFunction ) == "function" then + + -- Now call the default event function. + if Event.IniObjectCategory ~= 3 then + self:E( { "Calling " .. _EVENTMETA[Event.id].Event .. " for Class ", EventClass:GetClassNameAndID(), EventPriority } ) + end + + local Result, Value = xpcall( + function() + local Result, Value = EventFunction( EventClass, Event ) + return Result, Value + end, ErrorHandler ) + end + end + end + end + end + end + end + end + end + else + self:E( { _EVENTMETA[Event.id].Text, Event } ) + end + + Event = nil +end + +--- The EVENTHANDLER structure +-- @type EVENTHANDLER +-- @extends Core.Base#BASE +EVENTHANDLER = { + ClassName = "EVENTHANDLER", + ClassID = 0, +} + +--- The EVENTHANDLER constructor +-- @param #EVENTHANDLER self +-- @return #EVENTHANDLER +function EVENTHANDLER:New() + self = BASE:Inherit( self, BASE:New() ) -- #EVENTHANDLER + return self +end +--- **Core** -- MENU_ classes model the definition of **hierarchical menu structures** and **commands for players** within a mission. +-- +-- === +-- +-- DCS Menus can be managed using the MENU classes. +-- The advantage of using MENU classes is that it hides the complexity of dealing with menu management in more advanced scanerios where you need to +-- set menus and later remove them, and later set them again. You'll find while using use normal DCS scripting functions, that setting and removing +-- menus is not a easy feat if you have complex menu hierarchies defined. +-- Using the MOOSE menu classes, the removal and refreshing of menus are nicely being handled within these classes, and becomes much more easy. +-- On top, MOOSE implements **variable parameter** passing for command menus. +-- +-- There are basically two different MENU class types that you need to use: +-- +-- ### To manage **main menus**, the classes begin with **MENU_**: +-- +-- * @{Menu#MENU_MISSION}: Manages main menus for whole mission file. +-- * @{Menu#MENU_COALITION}: Manages main menus for whole coalition. +-- * @{Menu#MENU_GROUP}: Manages main menus for GROUPs. +-- * @{Menu#MENU_CLIENT}: Manages main menus for CLIENTs. This manages menus for units with the skill level "Client". +-- +-- ### To manage **command menus**, which are menus that allow the player to issue **functions**, the classes begin with **MENU_COMMAND_**: +-- +-- * @{Menu#MENU_MISSION_COMMAND}: Manages command menus for whole mission file. +-- * @{Menu#MENU_COALITION_COMMAND}: Manages command menus for whole coalition. +-- * @{Menu#MENU_GROUP_COMMAND}: Manages command menus for GROUPs. +-- * @{Menu#MENU_CLIENT_COMMAND}: Manages command menus for CLIENTs. This manages menus for units with the skill level "Client". +-- +-- === +-- +-- The above menus classes **are derived** from 2 main **abstract** classes defined within the MOOSE framework (so don't use these): +-- +-- 1) MENU_ BASE abstract base classes (don't use them) +-- ==================================================== +-- The underlying base menu classes are **NOT** to be used within your missions. +-- These are simply abstract base classes defining a couple of fields that are used by the +-- derived MENU_ classes to manage menus. +-- +-- 1.1) @{#MENU_BASE} class, extends @{Base#BASE} +-- -------------------------------------------------- +-- The @{#MENU_BASE} class defines the main MENU class where other MENU classes are derived from. +-- +-- 1.2) @{#MENU_COMMAND_BASE} class, extends @{Base#BASE} +-- ---------------------------------------------------------- +-- The @{#MENU_COMMAND_BASE} class defines the main MENU class where other MENU COMMAND_ classes are derived from, in order to set commands. +-- +-- === +-- +-- **The next menus define the MENU classes that you can use within your missions.** +-- +-- 2) MENU MISSION classes +-- ====================== +-- The underlying classes manage the menus for a complete mission file. +-- +-- 2.1) @{#MENU_MISSION} class, extends @{Menu#MENU_BASE} +-- --------------------------------------------------------- +-- The @{Menu#MENU_MISSION} class manages the main menus for a complete mission. +-- You can add menus with the @{#MENU_MISSION.New} method, which constructs a MENU_MISSION object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_MISSION.Remove}. +-- +-- 2.2) @{#MENU_MISSION_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------- +-- The @{Menu#MENU_MISSION_COMMAND} class manages the command menus for a complete mission, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_MISSION_COMMAND.New} method, which constructs a MENU_MISSION_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_MISSION_COMMAND.Remove}. +-- +-- === +-- +-- 3) MENU COALITION classes +-- ========================= +-- The underlying classes manage the menus for whole coalitions. +-- +-- 3.1) @{#MENU_COALITION} class, extends @{Menu#MENU_BASE} +-- ------------------------------------------------------------ +-- The @{Menu#MENU_COALITION} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_COALITION.New} method, which constructs a MENU_COALITION object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_COALITION.Remove}. +-- +-- 3.2) @{Menu#MENU_COALITION_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ---------------------------------------------------------------------------- +-- The @{Menu#MENU_COALITION_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_COALITION_COMMAND.New} method, which constructs a MENU_COALITION_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_COALITION_COMMAND.Remove}. +-- +-- === +-- +-- 4) MENU GROUP classes +-- ===================== +-- The underlying classes manage the menus for groups. Note that groups can be inactive, alive or can be destroyed. +-- +-- 4.1) @{Menu#MENU_GROUP} class, extends @{Menu#MENU_BASE} +-- -------------------------------------------------------- +-- The @{Menu#MENU_GROUP} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_GROUP.New} method, which constructs a MENU_GROUP object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_GROUP.Remove}. +-- +-- 4.2) @{Menu#MENU_GROUP_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------ +-- The @{Menu#MENU_GROUP_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_GROUP_COMMAND.New} method, which constructs a MENU_GROUP_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_GROUP_COMMAND.Remove}. +-- +-- === +-- +-- 5) MENU CLIENT classes +-- ====================== +-- The underlying classes manage the menus for units with skill level client or player. +-- +-- 5.1) @{Menu#MENU_CLIENT} class, extends @{Menu#MENU_BASE} +-- --------------------------------------------------------- +-- The @{Menu#MENU_CLIENT} class manages the main menus for coalitions. +-- You can add menus with the @{#MENU_CLIENT.New} method, which constructs a MENU_CLIENT object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_CLIENT.Remove}. +-- +-- 5.2) @{Menu#MENU_CLIENT_COMMAND} class, extends @{Menu#MENU_COMMAND_BASE} +-- ------------------------------------------------------------------------- +-- The @{Menu#MENU_CLIENT_COMMAND} class manages the command menus for coalitions, which allow players to execute functions during mission execution. +-- You can add menus with the @{#MENU_CLIENT_COMMAND.New} method, which constructs a MENU_CLIENT_COMMAND object and returns you the object reference. +-- Using this object reference, you can then remove ALL the menus and submenus underlying automatically with @{#MENU_CLIENT_COMMAND.Remove}. +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- +-- @module Menu + + +do -- MENU_BASE + + --- The MENU_BASE class + -- @type MENU_BASE + -- @extends Base#BASE + MENU_BASE = { + ClassName = "MENU_BASE", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil + } + + --- Consructor + -- @param #MENU_BASE + -- @return #MENU_BASE + function MENU_BASE:New( MenuText, ParentMenu ) + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, BASE:New() ) + + self.MenuPath = nil + self.MenuText = MenuText + self.MenuParentPath = MenuParentPath + self.Menus = {} + self.MenuCount = 0 + self.MenuRemoveParent = false + self.MenuTime = timer.getTime() + + return self + end + + --- Gets a @{Menu} from a parent @{Menu} + -- @param #MENU_BASE self + -- @param #string MenuText The text of the child menu. + -- @return #MENU_BASE + function MENU_BASE:GetMenu( MenuText ) + self:F( { self.Menus, MenuText } ) + return self.Menus[MenuText] + end + + --- Sets a @{Menu} to remove automatically the parent menu when the menu removed is the last child menu of that parent @{Menu}. + -- @param #MENU_BASE self + -- @param #boolean RemoveParent If true, the parent menu is automatically removed when this menu is the last child menu of that parent @{Menu}. + -- @return #MENU_BASE + function MENU_BASE:SetRemoveParent( RemoveParent ) + self:F( { RemoveParent } ) + self.MenuRemoveParent = RemoveParent + return self + end + + + --- Sets a time stamp for later prevention of menu removal. + -- @param #MENU_BASE self + -- @param MenuTime + -- @return #MENU_BASE + function MENU_BASE:SetTime( MenuTime ) + self.MenuTime = MenuTime + return self + end + +end + +do -- MENU_COMMAND_BASE + + --- The MENU_COMMAND_BASE class + -- @type MENU_COMMAND_BASE + -- @field #function MenuCallHandler + -- @extends Core.Menu#MENU_BASE + MENU_COMMAND_BASE = { + ClassName = "MENU_COMMAND_BASE", + CommandMenuFunction = nil, + CommandMenuArgument = nil, + MenuCallHandler = nil, + } + + --- Constructor + -- @param #MENU_COMMAND_BASE + -- @return #MENU_COMMAND_BASE + function MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArguments ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self.CommandMenuFunction = CommandMenuFunction + self.MenuCallHandler = function( CommandMenuArguments ) + self.CommandMenuFunction( unpack( CommandMenuArguments ) ) + end + + return self + end + +end + + +do -- MENU_MISSION + + --- The MENU_MISSION class + -- @type MENU_MISSION + -- @extends Core.Menu#MENU_BASE + MENU_MISSION = { + ClassName = "MENU_MISSION" + } + + --- MENU_MISSION constructor. Creates a new MENU_MISSION object and creates the menu for a complete mission file. + -- @param #MENU_MISSION self + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. This parameter can be ignored if you want the menu to be located at the perent menu of DCS world (under F10 other). + -- @return #MENU_MISSION + function MENU_MISSION:New( MenuText, ParentMenu ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self:F( { MenuText, ParentMenu } ) + + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuText } ) + + self.MenuPath = missionCommands.addSubMenu( MenuText, self.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_MISSION. Note that the main menu is kept! + -- @param #MENU_MISSION self + -- @return #MENU_MISSION + function MENU_MISSION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + + end + + --- Removes the main menu and the sub menus recursively of this MENU_MISSION. + -- @param #MENU_MISSION self + -- @return #nil + function MENU_MISSION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItem( self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + + return nil + end + +end + +do -- MENU_MISSION_COMMAND + + --- The MENU_MISSION_COMMAND class + -- @type MENU_MISSION_COMMAND + -- @extends Core.Menu#MENU_COMMAND_BASE + MENU_MISSION_COMMAND = { + ClassName = "MENU_MISSION_COMMAND" + } + + --- MENU_MISSION constructor. Creates a new radio command item for a complete mission file, which can invoke a function with parameters. + -- @param #MENU_MISSION_COMMAND self + -- @param #string MenuText The text for the menu. + -- @param Menu#MENU_MISSION ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @param CommandMenuArgument An argument for the function. There can only be ONE argument given. So multiple arguments must be wrapped into a table. See the below example how to do this. + -- @return #MENU_MISSION_COMMAND self + function MENU_MISSION_COMMAND:New( MenuText, ParentMenu, CommandMenuFunction, ... ) + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuText, CommandMenuFunction, arg } ) + + + self.MenuPath = missionCommands.addCommand( MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + ParentMenu.Menus[self.MenuPath] = self + + return self + end + + --- Removes a radio command item for a coalition + -- @param #MENU_MISSION_COMMAND self + -- @return #nil + function MENU_MISSION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItem( self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + return nil + end + +end + + + +do -- MENU_COALITION + + --- The MENU_COALITION class + -- @type MENU_COALITION + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the planes within the red coalition. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- + -- local Plane1 = CLIENT:FindByName( "Plane 1" ) + -- local Plane2 = CLIENT:FindByName( "Plane 2" ) + -- + -- + -- -- This would create a menu for the red coalition under the main DCS "Others" menu. + -- local MenuCoalitionRed = MENU_COALITION:New( coalition.side.RED, "Manage Menus" ) + -- + -- + -- local function ShowStatus( StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- Plane1:Message( StatusText, 15 ) + -- Plane2:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus -- Menu#MENU_COALITION + -- local MenuStatusShow -- Menu#MENU_COALITION_COMMAND + -- + -- local function RemoveStatusMenu() + -- MenuStatus:Remove() + -- end + -- + -- local function AddStatusMenu() + -- + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus = MENU_COALITION:New( coalition.side.RED, "Status for Planes" ) + -- MenuStatusShow = MENU_COALITION_COMMAND:New( coalition.side.RED, "Show Status", MenuStatus, ShowStatus, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- local MenuAdd = MENU_COALITION_COMMAND:New( coalition.side.RED, "Add Status Menu", MenuCoalitionRed, AddStatusMenu ) + -- local MenuRemove = MENU_COALITION_COMMAND:New( coalition.side.RED, "Remove Status Menu", MenuCoalitionRed, RemoveStatusMenu ) + MENU_COALITION = { + ClassName = "MENU_COALITION" + } + + --- MENU_COALITION constructor. Creates a new MENU_COALITION object and creates the menu for a complete coalition. + -- @param #MENU_COALITION self + -- @param Dcs.DCSCoalition#coalition.side Coalition The coalition owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. This parameter can be ignored if you want the menu to be located at the perent menu of DCS world (under F10 other). + -- @return #MENU_COALITION self + function MENU_COALITION:New( Coalition, MenuText, ParentMenu ) + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + + self:F( { Coalition, MenuText, ParentMenu } ) + + self.Coalition = Coalition + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( Coalition, MenuText, self.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. Note that the main menu is kept! + -- @param #MENU_COALITION self + -- @return #MENU_COALITION + function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + + end + + --- Removes the main menu and the sub menus recursively of this MENU_COALITION. + -- @param #MENU_COALITION self + -- @return #nil + function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.Coalition, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + + return nil + end + +end + +do -- MENU_COALITION_COMMAND + + --- The MENU_COALITION_COMMAND class + -- @type MENU_COALITION_COMMAND + -- @extends Core.Menu#MENU_COMMAND_BASE + MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" + } + + --- MENU_COALITION constructor. Creates a new radio command item for a coalition, which can invoke a function with parameters. + -- @param #MENU_COALITION_COMMAND self + -- @param Dcs.DCSCoalition#coalition.side Coalition The coalition owning the menu. + -- @param #string MenuText The text for the menu. + -- @param Menu#MENU_COALITION ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @param CommandMenuArgument An argument for the function. There can only be ONE argument given. So multiple arguments must be wrapped into a table. See the below example how to do this. + -- @return #MENU_COALITION_COMMAND + function MENU_COALITION_COMMAND:New( Coalition, MenuText, ParentMenu, CommandMenuFunction, ... ) + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + + self.MenuCoalition = Coalition + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuText, CommandMenuFunction, arg } ) + + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + ParentMenu.Menus[self.MenuPath] = self + + return self + end + + --- Removes a radio command item for a coalition + -- @param #MENU_COALITION_COMMAND self + -- @return #nil + function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuPath] = nil + end + return nil + end + +end + +do -- MENU_CLIENT + + -- 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 = {} + + --- MENU_COALITION constructor. Creates a new radio command item for a coalition, which can invoke a function with parameters. + -- @type MENU_CLIENT + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the two clients of planes. + -- -- Each client will receive a different menu structure. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- -- And play with the Add and Remove menu options. + -- + -- -- Note that in multi player, this will only work after the DCS clients bug is solved. + -- + -- local function ShowStatus( PlaneClient, StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- PlaneClient:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus = {} + -- + -- local function RemoveStatusMenu( MenuClient ) + -- local MenuClientName = MenuClient:GetName() + -- MenuStatus[MenuClientName]:Remove() + -- end + -- + -- --- @param Wrapper.Client#CLIENT MenuClient + -- local function AddStatusMenu( MenuClient ) + -- local MenuClientName = MenuClient:GetName() + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus[MenuClientName] = MENU_CLIENT:New( MenuClient, "Status for Planes" ) + -- MENU_CLIENT_COMMAND:New( MenuClient, "Show Status", MenuStatus[MenuClientName], ShowStatus, MenuClient, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneClient = CLIENT:FindByName( "Plane 1" ) + -- if PlaneClient and PlaneClient:IsAlive() then + -- local MenuManage = MENU_CLIENT:New( PlaneClient, "Manage Menus" ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Add Status Menu Plane 1", MenuManage, AddStatusMenu, PlaneClient ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Remove Status Menu Plane 1", MenuManage, RemoveStatusMenu, PlaneClient ) + -- end + -- end, {}, 10, 10 ) + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneClient = CLIENT:FindByName( "Plane 2" ) + -- if PlaneClient and PlaneClient:IsAlive() then + -- local MenuManage = MENU_CLIENT:New( PlaneClient, "Manage Menus" ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Add Status Menu Plane 2", MenuManage, AddStatusMenu, PlaneClient ) + -- MENU_CLIENT_COMMAND:New( PlaneClient, "Remove Status Menu Plane 2", MenuManage, RemoveStatusMenu, PlaneClient ) + -- end + -- end, {}, 10, 10 ) + MENU_CLIENT = { + ClassName = "MENU_CLIENT" + } + + --- MENU_CLIENT constructor. Creates a new radio menu item for a client. + -- @param #MENU_CLIENT self + -- @param Wrapper.Client#CLIENT Client 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( Client, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU_BASE:New( MenuText, MenuParentPath ) ) + self:F( { Client, MenuText, ParentMenu } ) + + self.MenuClient = Client + self.MenuClientGroupID = Client: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( { Client: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( { Client: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 #nil + 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 Core.Menu#MENU_COMMAND + MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" + } + + --- MENU_CLIENT_COMMAND constructor. Creates a new radio command item for a client, which can invoke a function with parameters. + -- @param #MENU_CLIENT_COMMAND self + -- @param Wrapper.Client#CLIENT Client The Client owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #MENU_BASE ParentMenu The parent menu. + -- @param CommandMenuFunction A function that is called when the menu key is pressed. + -- @return Menu#MENU_CLIENT_COMMAND self + function MENU_CLIENT_COMMAND:New( Client, MenuText, ParentMenu, CommandMenuFunction, ... ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, MenuParentPath, CommandMenuFunction, arg ) ) -- Menu#MENU_CLIENT_COMMAND + + self.MenuClient = Client + self.MenuClientGroupID = Client: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( { Client:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, arg } ) + + 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, self.MenuCallHandler, arg ) + MenuPath[MenuPathID] = self.MenuPath + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + + return self + end + + --- Removes a menu structure for a client. + -- @param #MENU_CLIENT_COMMAND self + -- @return #nil + 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 +end + +--- MENU_GROUP + +do + -- This local variable is used to cache the menus registered under groups. + -- Menus don't dissapear when groups for players 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 _MENUGROUPS = {} + + --- The MENU_GROUP class + -- @type MENU_GROUP + -- @extends Core.Menu#MENU_BASE + -- @usage + -- -- This demo creates a menu structure for the two groups of planes. + -- -- Each group will receive a different menu structure. + -- -- To test, join the planes, then look at the other radio menus (Option F10). + -- -- Then switch planes and check if the menu is still there. + -- -- And play with the Add and Remove menu options. + -- + -- -- Note that in multi player, this will only work after the DCS groups bug is solved. + -- + -- local function ShowStatus( PlaneGroup, StatusText, Coalition ) + -- + -- MESSAGE:New( Coalition, 15 ):ToRed() + -- PlaneGroup:Message( StatusText, 15 ) + -- end + -- + -- local MenuStatus = {} + -- + -- local function RemoveStatusMenu( MenuGroup ) + -- local MenuGroupName = MenuGroup:GetName() + -- MenuStatus[MenuGroupName]:Remove() + -- end + -- + -- --- @param Wrapper.Group#GROUP MenuGroup + -- local function AddStatusMenu( MenuGroup ) + -- local MenuGroupName = MenuGroup:GetName() + -- -- This would create a menu for the red coalition under the MenuCoalitionRed menu object. + -- MenuStatus[MenuGroupName] = MENU_GROUP:New( MenuGroup, "Status for Planes" ) + -- MENU_GROUP_COMMAND:New( MenuGroup, "Show Status", MenuStatus[MenuGroupName], ShowStatus, MenuGroup, "Status of planes is ok!", "Message to Red Coalition" ) + -- end + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneGroup = GROUP:FindByName( "Plane 1" ) + -- if PlaneGroup and PlaneGroup:IsAlive() then + -- local MenuManage = MENU_GROUP:New( PlaneGroup, "Manage Menus" ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Add Status Menu Plane 1", MenuManage, AddStatusMenu, PlaneGroup ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Remove Status Menu Plane 1", MenuManage, RemoveStatusMenu, PlaneGroup ) + -- end + -- end, {}, 10, 10 ) + -- + -- SCHEDULER:New( nil, + -- function() + -- local PlaneGroup = GROUP:FindByName( "Plane 2" ) + -- if PlaneGroup and PlaneGroup:IsAlive() then + -- local MenuManage = MENU_GROUP:New( PlaneGroup, "Manage Menus" ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Add Status Menu Plane 2", MenuManage, AddStatusMenu, PlaneGroup ) + -- MENU_GROUP_COMMAND:New( PlaneGroup, "Remove Status Menu Plane 2", MenuManage, RemoveStatusMenu, PlaneGroup ) + -- end + -- end, {}, 10, 10 ) + -- + MENU_GROUP = { + ClassName = "MENU_GROUP" + } + + --- MENU_GROUP constructor. Creates a new radio menu item for a group. + -- @param #MENU_GROUP self + -- @param Wrapper.Group#GROUP MenuGroup The Group owning the menu. + -- @param #string MenuText The text for the menu. + -- @param #table ParentMenu The parent menu. + -- @return #MENU_GROUP self + function MENU_GROUP:New( MenuGroup, MenuText, ParentMenu ) + + -- Determine if the menu was not already created and already visible at the group. + -- If it is visible, then return the cached self, otherwise, create self and cache it. + + MenuGroup._Menus = MenuGroup._Menus or {} + local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText + if MenuGroup._Menus[Path] then + self = MenuGroup._Menus[Path] + else + self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) + MenuGroup._Menus[Path] = self + + self.MenuGroup = MenuGroup + self.Path = Path + self.MenuGroupID = MenuGroup:GetID() + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { "Adding Menu ", MenuText, self.MenuParentPath } ) + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuGroupID, MenuText, self.MenuParentPath ) + + if self.ParentMenu and self.ParentMenu.Menus then + self.ParentMenu.Menus[MenuText] = self + self:F( { self.ParentMenu.Menus, MenuText } ) + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 + end + end + + --self:F( { MenuGroup:GetName(), MenuText, ParentMenu.MenuPath } ) + + return self + end + + --- Removes the sub menus recursively of this MENU_GROUP. + -- @param #MENU_GROUP self + -- @param MenuTime + -- @return #MENU_GROUP self + function MENU_GROUP:RemoveSubMenus( MenuTime ) + self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) + + self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) + for MenuText, Menu in pairs( self.Menus ) do + Menu:Remove( MenuTime ) + end + + end + + + --- Removes the main menu and sub menus recursively of this MENU_GROUP. + -- @param #MENU_GROUP self + -- @param MenuTime + -- @return #nil + function MENU_GROUP:Remove( MenuTime ) + self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + + self:RemoveSubMenus( MenuTime ) + + if not MenuTime or self.MenuTime ~= MenuTime then + if self.MenuGroup._Menus[self.Path] then + self = self.MenuGroup._Menus[self.Path] + + missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) + if self.ParentMenu then + self.ParentMenu.Menus[self.MenuText] = nil + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 + if self.ParentMenu.MenuCount == 0 then + if self.MenuRemoveParent == true then + self:T( "Removing Parent Menu " ) + self.ParentMenu:Remove() + end + end + end + self:T( { "Removing Group Menu:", self.MenuGroup:GetName(), self.MenuGroup._Menus[self.Path].Path } ) + self.MenuGroup._Menus[self.Path] = nil + self = nil + end + end + + return nil + end + + + --- The MENU_GROUP_COMMAND class + -- @type MENU_GROUP_COMMAND + -- @extends Core.Menu#MENU_BASE + MENU_GROUP_COMMAND = { + ClassName = "MENU_GROUP_COMMAND" + } + + --- Creates a new radio command item for a group + -- @param #MENU_GROUP_COMMAND self + -- @param Wrapper.Group#GROUP MenuGroup The Group 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_GROUP_COMMAND + function MENU_GROUP_COMMAND:New( MenuGroup, MenuText, ParentMenu, CommandMenuFunction, ... ) + + MenuGroup._Menus = MenuGroup._Menus or {} + local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText + if MenuGroup._Menus[Path] then + self = MenuGroup._Menus[Path] + self:T( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) + else + self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) + MenuGroup._Menus[Path] = self + + self.Path = Path + self.MenuGroup = MenuGroup + self.MenuGroupID = MenuGroup:GetID() + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { "Adding Group Command Menu:", MenuGroup:GetName(), MenuText, self.MenuParentPath } ) + self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) + + if self.ParentMenu and self.ParentMenu.Menus then + self.ParentMenu.Menus[MenuText] = self + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 + self:F( { ParentMenu.Menus, MenuText } ) + end + end + + return self + end + + --- Removes a menu structure for a group. + -- @param #MENU_GROUP_COMMAND self + -- @param MenuTime + -- @return #nil + function MENU_GROUP_COMMAND:Remove( MenuTime ) + self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + + if not MenuTime or self.MenuTime ~= MenuTime then + if self.MenuGroup._Menus[self.Path] then + self = self.MenuGroup._Menus[self.Path] + + missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) + self:T( { "Removing Group Command Menu:", self.MenuGroup:GetName(), self.MenuText, self.Path, self.MenuGroup._Menus[self.Path].Path } ) + + self.ParentMenu.Menus[self.MenuText] = nil + self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 + if self.ParentMenu.MenuCount == 0 then + if self.MenuRemoveParent == true then + self:T( "Removing Parent Menu " ) + self.ParentMenu:Remove() + end + end + + self.MenuGroup._Menus[self.Path] = nil + self = nil + end + end + + return nil + end + +end + +--- **Core** - ZONE classes define **zones** within your mission of **various forms**, with **various capabilities**. +-- +-- ![Banner Image](..\Presentations\ZONE\Dia1.JPG) +-- +-- === +-- +-- 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 defines by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_GROUP}: The ZONE_GROUP class defines by a zone around a @{Group#GROUP} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defines by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- # 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- +-- This class is an abstract BASE class for derived classes, and is not meant to be instantiated. +-- +-- ## 1.1) Each zone has a name: +-- +-- * @{#ZONE_BASE.GetName}(): Returns the name of the zone. +-- +-- ## 1.2) Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsVec2InZone}(): Returns if a Vec2 is within the zone. +-- * @{#ZONE_BASE.IsVec3InZone}(): Returns if a Vec3 is within the zone. +-- +-- ## 1.3) A zone has a probability factor that can be set to randomize a selection between zones: +-- +-- * @{#ZONE_BASE.SetRandomizeProbability}(): Set the randomization probability of a zone to be selected, taking a value between 0 and 1 ( 0 = 0%, 1 = 100% ) +-- * @{#ZONE_BASE.GetRandomizeProbability}(): Get the randomization probability of a zone to be selected, passing a value between 0 and 1 ( 0 = 0%, 1 = 100% ) +-- * @{#ZONE_BASE.GetZoneMaybe}(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate. +-- +-- ## 1.4) A zone manages Vectors: +-- +-- * @{#ZONE_BASE.GetVec2}(): Returns the @{DCSTypes#Vec2} coordinate of the zone. +-- * @{#ZONE_BASE.GetRandomVec2}(): Define a random @{DCSTypes#Vec2} within the zone. +-- +-- ## 1.5) A zone has a bounding square: +-- +-- * @{#ZONE_BASE.GetBoundingSquare}(): Get the outer most bounding square of the zone. +-- +-- ## 1.6) A zone can be marked: +-- +-- * @{#ZONE_BASE.SmokeZone}(): Smokes the zone boundaries in a color. +-- * @{#ZONE_BASE.FlareZone}(): Flares the zone boundaries in a color. +-- +-- === +-- +-- # 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- This class implements the inherited functions from Core.Zone#ZONE_BASE taking into account the own zone format and properties. +-- +-- ## 2.1) @{Zone#ZONE_RADIUS} constructor +-- +-- * @{#ZONE_RADIUS.New}(): Constructor. +-- +-- ## 2.2) Manage the radius of the zone +-- +-- * @{#ZONE_RADIUS.SetRadius}(): Sets the radius of the zone. +-- * @{#ZONE_RADIUS.GetRadius}(): Returns the radius of the zone. +-- +-- ## 2.3) Manage the location of the zone +-- +-- * @{#ZONE_RADIUS.SetVec2}(): Sets the @{DCSTypes#Vec2} of the zone. +-- * @{#ZONE_RADIUS.GetVec2}(): Returns the @{DCSTypes#Vec2} of the zone. +-- * @{#ZONE_RADIUS.GetVec3}(): Returns the @{DCSTypes#Vec3} of the zone, taking an additional height parameter. +-- +-- ## 2.4) Zone point randomization +-- +-- Various functions exist to find random points within the zone. +-- +-- * @{#ZONE_RADIUS.GetRandomVec2}(): Gets a random 2D point in the zone. +-- * @{#ZONE_RADIUS.GetRandomPointVec2}(): Gets a @{Point#POINT_VEC2} object representing a random 2D point in the zone. +-- * @{#ZONE_RADIUS.GetRandomPointVec3}(): Gets a @{Point#POINT_VEC3} object representing a random 3D point in the zone. Note that the height of the point is at landheight. +-- +-- === +-- +-- # 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- This class implements the inherited functions from {Core.Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 5) @{Zone#ZONE_GROUP} class, extends @{Zone#ZONE_RADIUS} +-- +-- The ZONE_GROUP class defines by a zone around a @{Group#GROUP} with a radius. The current leader of the group defines the center of the zone. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- === +-- +-- # 6) @{Zone#ZONE_POLYGON_BASE} class, extends @{Zone#ZONE_BASE} +-- +-- The ZONE_POLYGON_BASE class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- This class is an abstract BASE class for derived classes, and is not meant to be instantiated. +-- +-- ## 6.1) Zone point randomization +-- +-- Various functions exist to find random points within the zone. +-- +-- * @{#ZONE_POLYGON_BASE.GetRandomVec2}(): Gets a random 2D point in the zone. +-- * @{#ZONE_POLYGON_BASE.GetRandomPointVec2}(): Return a @{Point#POINT_VEC2} object representing a random 2D point within the zone. +-- * @{#ZONE_POLYGON_BASE.GetRandomPointVec3}(): Return a @{Point#POINT_VEC3} object representing a random 3D point at landheight within the zone. +-- +-- +-- === +-- +-- # 7) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_POLYGON_BASE} +-- +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. +-- +-- ==== +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-02-28: ZONE\_BASE:**IsVec2InZone()** replaces ZONE\_BASE:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_BASE:**IsVec3InZone()** replaces ZONE\_BASE:_IsPointVec3InZone()_. +-- 2017-02-28: ZONE\_RADIUS:**IsVec2InZone()** replaces ZONE\_RADIUS:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_RADIUS:**IsVec3InZone()** replaces ZONE\_RADIUS:_IsPointVec3InZone()_. +-- 2017-02-28: ZONE\_POLYGON:**IsVec2InZone()** replaces ZONE\_POLYGON:_IsPointVec2InZone()_. +-- 2017-02-28: ZONE\_POLYGON:**IsVec3InZone()** replaces ZONE\_POLYGON:_IsPointVec3InZone()_. +-- +-- 2017-02-18: ZONE\_POLYGON_BASE:**GetRandomPointVec2()** added. +-- +-- 2017-02-18: ZONE\_POLYGON_BASE:**GetRandomPointVec3()** added. +-- +-- 2017-02-18: ZONE\_RADIUS:**GetRandomPointVec3( inner, outer )** added. +-- +-- 2017-02-18: ZONE\_RADIUS:**GetRandomPointVec2( inner, outer )** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetName()** added. +-- +-- 2016-08-15: ZONE\_BASE:**SetZoneProbability( ZoneProbability )** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetZoneProbability()** added. +-- +-- 2016-08-15: ZONE\_BASE:**GetZoneMaybe()** added. +-- +-- === +-- +-- @module Zone + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @field #string ZoneName Name of the zone. +-- @field #number ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +-- @extends Core.Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + ZoneName = "", + ZoneProbability = 1, + } + + +--- The ZONE_BASE.BoundingSquare +-- @type ZONE_BASE.BoundingSquare +-- @field Dcs.DCSTypes#Distance x1 The lower x coordinate (left down) +-- @field Dcs.DCSTypes#Distance y1 The lower y coordinate (left down) +-- @field Dcs.DCSTypes#Distance x2 The higher x coordinate (right up) +-- @field Dcs.DCSTypes#Distance y2 The higher y coordinate (right up) + + +--- 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 the name of the zone. +-- @param #ZONE_BASE self +-- @return #string The name of the zone. +function ZONE_BASE:GetName() + self:F2() + + return self.ZoneName +end +--- Returns if a location is within the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Vec3 Vec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsVec3InZone( Vec3 ) + self:F2( Vec3 ) + + local InZone = self:IsVec2InZone( { x = Vec3.x, y = Vec3.z } ) + + return InZone +end + +--- Returns the @{DCSTypes#Vec2} coordinate of the zone. +-- @param #ZONE_BASE self +-- @return #nil. +function ZONE_BASE:GetVec2() + self:F2( self.ZoneName ) + + return nil +end + +--- Returns a @{Point#POINT_VEC2} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Core.Point#POINT_VEC2 The PointVec2 of the zone. +function ZONE_BASE:GetPointVec2() + self:F2( self.ZoneName ) + + local Vec2 = self:GetVec2() + + local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) + + self:T2( { PointVec2 } ) + + return PointVec2 +end + + +--- Returns the @{DCSTypes#Vec3} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The Vec3 of the zone. +function ZONE_BASE:GetVec3( Height ) + self:F2( self.ZoneName ) + + Height = Height or 0 + + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + +--- Returns a @{Point#POINT_VEC3} of the zone. +-- @param #ZONE_BASE self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Core.Point#POINT_VEC3 The PointVec3 of the zone. +function ZONE_BASE:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local Vec3 = self:GetVec3( Height ) + + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Define a random @{DCSTypes#Vec2} within the zone. +-- @param #ZONE_BASE self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coordinates. +function ZONE_BASE:GetRandomVec2() + return nil +end + +--- Define a random @{Point#POINT_VEC2} within the zone. +-- @param #ZONE_BASE self +-- @return Core.Point#POINT_VEC2 The PointVec2 coordinates. +function ZONE_BASE:GetRandomPointVec2() + return nil +end + +--- Define a random @{Point#POINT_VEC3} within the zone. +-- @param #ZONE_BASE self +-- @return Core.Point#POINT_VEC3 The PointVec3 coordinates. +function ZONE_BASE:GetRandomPointVec3() + return nil +end + +--- Get the bounding square the zone. +-- @param #ZONE_BASE self +-- @return #nil The bounding square. +function ZONE_BASE:GetBoundingSquare() + --return { x1 = 0, y1 = 0, x2 = 0, y2 = 0 } + return nil +end + +--- Bound the zone boundaries with a tires. +-- @param #ZONE_BASE self +function ZONE_BASE:BoundZone() + self:F2() + +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + +--- Set the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @param ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +function ZONE_BASE:SetZoneProbability( ZoneProbability ) + self:F2( ZoneProbability ) + + self.ZoneProbability = ZoneProbability or 1 + return self +end + +--- Get the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @return #number A value between 0 and 1. 0 = 0% and 1 = 100% probability. +function ZONE_BASE:GetZoneProbability() + self:F2() + + return self.ZoneProbability +end + +--- Get the zone taking into account the randomization probability of a zone to be selected. +-- @param #ZONE_BASE self +-- @return #ZONE_BASE The zone is selected taking into account the randomization probability factor. +-- @return #nil The zone is not selected taking into account the randomization probability factor. +function ZONE_BASE:GetZoneMaybe() + self:F2() + + local Randomization = math.random() + if Randomization <= self.ZoneProbability then + return self + else + return nil + end +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field Dcs.DCSTypes#Vec2 Vec2 The current location of the zone. +-- @field Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @extends Core.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 Dcs.DCSTypes#Vec2 Vec2 The location of the zone. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, Vec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) -- #ZONE_RADIUS + self:F( { ZoneName, Vec2, Radius } ) + + self.Radius = Radius + self.Vec2 = Vec2 + + return self +end + +--- Bounds the zone with tires. +-- @param #ZONE_RADIUS self +-- @param #number Points (optional) The amount of points in the circle. +-- @param #boolean UnBound If true the tyres will be destroyed. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:BoundZone( Points, CountryID, UnBound ) + + local Point = {} + local Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius() + + local CountryName = _DATABASE.COUNTRY_NAME[CountryID] + + local Tire = { + ["country"] = CountryName, + ["category"] = "Fortifications", + ["canCargo"] = false, + ["shape_name"] = "H-tyre_B_WF", + ["type"] = "Black_Tyre_WF", + --["unitId"] = Angle + 10000, + ["y"] = Point.y, + ["x"] = Point.x, + ["name"] = string.format( "%s-Tire #%0d", self:GetName(), Angle ), + ["heading"] = 0, + } -- end of ["group"] + + local Group = coalition.addStaticObject( CountryID, Tire ) + if UnBound and UnBound == true then + Group:destroy() + end + end + + return self +end + + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param Utilities.Utils#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 Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.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 Utilities.Utils#FLARECOLOR FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param Dcs.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 Vec2 = self:GetVec2() + + 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 = Vec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = Vec2.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 Dcs.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 Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return Dcs.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 @{DCSTypes#Vec2} of the zone. +-- @param #ZONE_RADIUS self +-- @return Dcs.DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetVec2() + self:F2( self.ZoneName ) + + self:T2( { self.Vec2 } ) + + return self.Vec2 +end + +--- Sets the @{DCSTypes#Vec2} of the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec2 Vec2 The new location of the zone. +-- @return Dcs.DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetVec2( Vec2 ) + self:F2( self.ZoneName ) + + self.Vec2 = Vec2 + + self:T2( { self.Vec2 } ) + + return self.Vec2 +end + +--- Returns the @{DCSTypes#Vec3} of the ZONE_RADIUS. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetVec3( Height ) + self:F2( { self.ZoneName, Height } ) + + Height = Height or 0 + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + local ZoneVec2 = self:GetVec2() + + if ZoneVec2 then + if (( Vec2.x - ZoneVec2.x )^2 + ( Vec2.y - ZoneVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param Dcs.DCSTypes#Vec3 Vec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsVec3InZone( Vec3 ) + self:F2( Vec3 ) + + local InZone = self:IsVec2InZone( { x = Vec3.x, y = Vec3.z } ) + + return InZone +end + +--- Returns a random Vec2 location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Dcs.DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomVec2( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local Point = {} + local Vec2 = self:GetVec2() + local _inner = inner or 0 + local _outer = outer or self:GetRadius() + + local angle = math.random() * math.pi * 2; + Point.x = Vec2.x + math.cos( angle ) * math.random(_inner, _outer); + Point.y = Vec2.y + math.sin( angle ) * math.random(_inner, _outer); + + self:T( { Point } ) + + return Point +end + +--- Returns a @{Point#POINT_VEC2} object reflecting a random 2D location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Core.Point#POINT_VEC2 The @{Point#POINT_VEC2} object reflecting the random 3D location within the zone. +function ZONE_RADIUS:GetRandomPointVec2( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local PointVec2 = POINT_VEC2:NewFromVec2( self:GetRandomVec2() ) + + self:T3( { PointVec2 } ) + + return PointVec2 +end + +--- Returns a @{Point#POINT_VEC3} object reflecting a random 3D location within the zone. +-- @param #ZONE_RADIUS self +-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0. +-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone. +-- @return Core.Point#POINT_VEC3 The @{Point#POINT_VEC3} object reflecting the random 3D location within the zone. +function ZONE_RADIUS:GetRandomPointVec3( inner, outer ) + self:F( self.ZoneName, inner, outer ) + + local PointVec3 = POINT_VEC3:NewFromVec2( self:GetRandomVec2() ) + + self:T3( { PointVec3 } ) + + return PointVec3 +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 Core.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 Wrapper.Unit#UNIT ZoneUNIT +-- @extends Core.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 Wrapper.Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param Dcs.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:GetVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + self.LastVec2 = ZoneUNIT:GetVec2() + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetVec2() + self:F( self.ZoneName ) + + local ZoneVec2 = self.ZoneUNIT:GetVec2() + if ZoneVec2 then + self.LastVec2 = ZoneVec2 + return ZoneVec2 + else + return self.LastVec2 + end + + self:T( { ZoneVec2 } ) + + return nil +end + +--- Returns a random location within the zone. +-- @param #ZONE_UNIT self +-- @return Dcs.DCSTypes#Vec2 The random location within the zone. +function ZONE_UNIT:GetRandomVec2() + self:F( self.ZoneName ) + + local RandomVec2 = {} + local Vec2 = self.ZoneUNIT:GetVec2() + + if not Vec2 then + Vec2 = self.LastVec2 + end + + local angle = math.random() * math.pi*2; + RandomVec2.x = Vec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + RandomVec2.y = Vec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { RandomVec2 } ) + + return RandomVec2 +end + +--- Returns the @{DCSTypes#Vec3} of the ZONE_UNIT. +-- @param #ZONE_UNIT self +-- @param Dcs.DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return Dcs.DCSTypes#Vec3 The point of the zone. +function ZONE_UNIT:GetVec3( Height ) + self:F2( self.ZoneName ) + + Height = Height or 0 + + local Vec2 = self:GetVec2() + + local Vec3 = { x = Vec2.x, y = land.getHeight( self:GetVec2() ) + Height, z = Vec2.y } + + self:T2( { Vec3 } ) + + return Vec3 +end + +--- The ZONE_GROUP class defined by a zone around a @{Group}, taking the average center point of all the units within the Group, with a radius. +-- @type ZONE_GROUP +-- @field Wrapper.Group#GROUP ZoneGROUP +-- @extends Core.Zone#ZONE_RADIUS +ZONE_GROUP = { + ClassName="ZONE_GROUP", + } + +--- Constructor to create a ZONE_GROUP instance, taking the zone name, a zone @{Group#GROUP} and a radius. +-- @param #ZONE_GROUP self +-- @param #string ZoneName Name of the zone. +-- @param Wrapper.Group#GROUP ZoneGROUP The @{Group} as the center of the zone. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_GROUP self +function ZONE_GROUP:New( ZoneName, ZoneGROUP, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneGROUP:GetVec2(), Radius ) ) + self:F( { ZoneName, ZoneGROUP:GetVec2(), Radius } ) + + self.ZoneGROUP = ZoneGROUP + + return self +end + + +--- Returns the current location of the @{Group}. +-- @param #ZONE_GROUP self +-- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Group} location. +function ZONE_GROUP:GetVec2() + self:F( self.ZoneName ) + + local ZoneVec2 = self.ZoneGROUP:GetVec2() + + self:T( { ZoneVec2 } ) + + return ZoneVec2 +end + +--- Returns a random location within the zone of the @{Group}. +-- @param #ZONE_GROUP self +-- @return Dcs.DCSTypes#Vec2 The random location of the zone based on the @{Group} location. +function ZONE_GROUP:GetRandomVec2() + self:F( self.ZoneName ) + + local Point = {} + local Vec2 = self.ZoneGROUP:GetVec2() + + local angle = math.random() * math.pi*2; + Point.x = Vec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = Vec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +-- Polygons + +--- The ZONE_POLYGON_BASE class defined by an array of @{DCSTypes#Vec2}, forming a polygon. +-- @type ZONE_POLYGON_BASE +-- @field #ZONE_POLYGON_BASE.ListVec2 Polygon The polygon defined by an array of @{DCSTypes#Vec2}. +-- @extends Core.Zone#ZONE_BASE +ZONE_POLYGON_BASE = { + ClassName="ZONE_POLYGON_BASE", + } + +--- A points array. +-- @type ZONE_POLYGON_BASE.ListVec2 +-- @list + +--- Constructor to create a ZONE_POLYGON_BASE instance, taking the zone name and an array of @{DCSTypes#Vec2}, forming a polygon. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected. +-- @param #ZONE_POLYGON_BASE self +-- @param #string ZoneName Name of the zone. +-- @param #ZONE_POLYGON_BASE.ListVec2 PointsArray An array of @{DCSTypes#Vec2}, forming a polygon.. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:New( ZoneName, PointsArray ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointsArray } ) + + local i = 0 + + self.Polygon = {} + + for i = 1, #PointsArray do + self.Polygon[i] = {} + self.Polygon[i].x = PointsArray[i].x + self.Polygon[i].y = PointsArray[i].y + end + + return self +end + +--- Flush polygon coordinates as a table in DCS.log. +-- @param #ZONE_POLYGON_BASE self +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:Flush() + self:F2() + + self:E( { Polygon = self.ZoneName, Coordinates = self.Polygon } ) + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON_BASE self +-- @param #boolean UnBound If true, the tyres will be destroyed. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE:BoundZone( UnBound ) + + 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 ) + local Tire = { + ["country"] = "USA", + ["category"] = "Fortifications", + ["canCargo"] = false, + ["shape_name"] = "H-tyre_B_WF", + ["type"] = "Black_Tyre_WF", + ["y"] = PointY, + ["x"] = PointX, + ["name"] = string.format( "%s-Tire #%0d", self:GetName(), ((i - 1) * Segments) + Segment ), + ["heading"] = 0, + } -- end of ["group"] + + local Group = coalition.addStaticObject( country.id.USA, Tire ) + if UnBound and UnBound == true then + Group:destroy() + end + + end + j = i + i = i + 1 + end + + return self +end + + + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON_BASE self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. +-- @return #ZONE_POLYGON_BASE self +function ZONE_POLYGON_BASE: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. +-- Source learned and taken from: https://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html +-- @param #ZONE_POLYGON_BASE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON_BASE:IsVec2InZone( Vec2 ) + self:F2( Vec2 ) + + local Next + local Prev + local InPolygon = false + + Next = 1 + Prev = #self.Polygon + + while Next <= #self.Polygon do + self:T( { Next, Prev, self.Polygon[Next], self.Polygon[Prev] } ) + if ( ( ( self.Polygon[Next].y > Vec2.y ) ~= ( self.Polygon[Prev].y > Vec2.y ) ) and + ( Vec2.x < ( self.Polygon[Prev].x - self.Polygon[Next].x ) * ( Vec2.y - self.Polygon[Next].y ) / ( self.Polygon[Prev].y - self.Polygon[Next].y ) + self.Polygon[Next].x ) + ) then + InPolygon = not InPolygon + end + self:T2( { InPolygon = InPolygon } ) + Prev = Next + Next = Next + 1 + end + + self:T( { InPolygon = InPolygon } ) + return InPolygon +end + +--- Define a random @{DCSTypes#Vec2} within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coordinate. +function ZONE_POLYGON_BASE:GetRandomVec2() + self:F2() + + --- It is a bit tricky to find a random point within a polygon. Right now i am doing it the dirty and inefficient way... + local Vec2Found = false + local Vec2 + local BS = self:GetBoundingSquare() + + self:T2( BS ) + + while Vec2Found == false do + Vec2 = { x = math.random( BS.x1, BS.x2 ), y = math.random( BS.y1, BS.y2 ) } + self:T2( Vec2 ) + if self:IsVec2InZone( Vec2 ) then + Vec2Found = true + end + end + + self:T2( Vec2 ) + + return Vec2 +end + +--- Return a @{Point#POINT_VEC2} object representing a random 2D point at landheight within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return @{Point#POINT_VEC2} +function ZONE_POLYGON_BASE:GetRandomPointVec2() + self:F2() + + local PointVec2 = POINT_VEC2:NewFromVec2( self:GetRandomVec2() ) + + self:T2( PointVec2 ) + + return PointVec2 +end + +--- Return a @{Point#POINT_VEC3} object representing a random 3D point at landheight within the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return @{Point#POINT_VEC3} +function ZONE_POLYGON_BASE:GetRandomPointVec3() + self:F2() + + local PointVec3 = POINT_VEC3:NewFromVec2( self:GetRandomVec2() ) + + self:T2( PointVec3 ) + + return PointVec3 +end + + +--- Get the bounding square the zone. +-- @param #ZONE_POLYGON_BASE self +-- @return #ZONE_POLYGON_BASE.BoundingSquare The bounding square. +function ZONE_POLYGON_BASE:GetBoundingSquare() + + local x1 = self.Polygon[1].x + local y1 = self.Polygon[1].y + local x2 = self.Polygon[1].x + local y2 = self.Polygon[1].y + + for i = 2, #self.Polygon do + self:T2( { self.Polygon[i], x1, y1, x2, y2 } ) + x1 = ( x1 > self.Polygon[i].x ) and self.Polygon[i].x or x1 + x2 = ( x2 < self.Polygon[i].x ) and self.Polygon[i].x or x2 + y1 = ( y1 > self.Polygon[i].y ) and self.Polygon[i].y or y1 + y2 = ( y2 < self.Polygon[i].y ) and self.Polygon[i].y or y2 + + end + + return { x1 = x1, y1 = y1, x2 = x2, y2 = y2 } +end + + + + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Core.Zone#ZONE_POLYGON_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 Wrapper.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 GroupPoints = ZoneGroup:GetTaskRoute() + + local self = BASE:Inherit( self, ZONE_POLYGON_BASE:New( ZoneName, GroupPoints ) ) + self:F( { ZoneName, ZoneGroup, self.Polygon } ) + + return self +end + +--- This module contains the DATABASE class, managing the database of mission objects. +-- +-- ==== +-- +-- 1) @{#DATABASE} class, extends @{Base#BASE} +-- =================================================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * CLIENTS +-- * AIRPORTS +-- * PLAYERSJOINED +-- * PLAYERS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Group 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. +-- +-- 1.1) 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 alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerJoined}: Calls a function for each joined 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 + +--- DATABASE class +-- @type DATABASE +-- @extends Core.Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSJOINED = {}, + CLIENTS = {}, + AIRBASES = {}, + COUNTRY_ID = {}, + COUNTRY_NAME = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + ["plane"] = Unit.Category.AIRPLANE, + ["helicopter"] = Unit.Category.HELICOPTER, + ["vehicle"] = Unit.Category.GROUND_UNIT, + ["ship"] = Unit.Category.SHIP, + ["static"] = Unit.Category.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() ) + + self:SetEventPriority( 1 ) + + self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + + -- Follow alive players and clients + self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterClients() + self:_RegisterStatics() + self:_RegisterPlayers() + self:_RegisterAirbases() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Wrapper.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( DCSUnitName ) + + if not self.UNITS[DCSUnitName] then + local UnitRegister = UNIT:Register( DCSUnitName ) + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) + end + + return self.UNITS[DCSUnitName] +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + --self.UNITS[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStaticName ) + + if not self.STATICS[DCSStaticName] then + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) + end +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + --self.STATICS[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Wrapper.Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + +--- Adds a Airbase based on the Airbase Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddAirbase( DCSAirbaseName ) + + if not self.AIRBASES[DCSAirbaseName] then + self.AIRBASES[DCSAirbaseName] = AIRBASE:Register( DCSAirbaseName ) + end +end + + +--- Deletes a Airbase from the DATABASE based on the Airbase Name. +-- @param #DATABASE self +function DATABASE:DeleteAirbase( DCSAirbaseName ) + + --self.AIRBASES[DCSAirbaseName] = nil +end + +--- Finds a AIRBASE based on the AirbaseName. +-- @param #DATABASE self +-- @param #string AirbaseName +-- @return Wrapper.Airbase#AIRBASE The found AIRBASE. +function DATABASE:FindAirbase( AirbaseName ) + + local AirbaseFound = self.AIRBASES[AirbaseName] + return AirbaseFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Wrapper.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 ) + + if not self.CLIENTS[ClientName] then + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + end + + return self.CLIENTS[ClientName] +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Wrapper.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( GroupName ) + + if not self.GROUPS[GroupName] then + self:E( { "Add GROUP:", GroupName } ) + self.GROUPS[GroupName] = GROUP:Register( GroupName ) + end + + return self.GROUPS[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] = self:FindUnit( UnitName ) + self.PLAYERSJOINED[PlayerName] = PlayerName + 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.PLAYERS[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:F( SpawnTemplate.name ) + + self:T( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.CoalitionID + local SpawnCountryID = SpawnTemplate.CountryID + local SpawnCategoryID = SpawnTemplate.CategoryID + + -- Nullify + SpawnTemplate.CoalitionID = nil + SpawnTemplate.CountryID = nil + SpawnTemplate.CategoryID = nil + + self:_RegisterTemplate( SpawnTemplate, SpawnCoalitionID, SpawnCategoryID, SpawnCountryID ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.CoalitionID = SpawnCoalitionID + SpawnTemplate.CountryID = SpawnCountryID + SpawnTemplate.CategoryID = SpawnCategoryID + + local SpawnGroup = self:AddGroup( 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, CoalitionID, CategoryID, CountryID ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + local TraceTable = {} + + 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 + + GroupTemplate.CategoryID = CategoryID + GroupTemplate.CoalitionID = CoalitionID + GroupTemplate.CountryID = CountryID + + 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.Templates.Groups[GroupTemplateName].CategoryID = CategoryID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CountryID = CountryID + + + TraceTable[#TraceTable+1] = "Group" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].GroupName + + TraceTable[#TraceTable+1] = "Coalition" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CoalitionID + TraceTable[#TraceTable+1] = "Category" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CategoryID + TraceTable[#TraceTable+1] = "Country" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CountryID + + TraceTable[#TraceTable+1] = "Units" + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + UnitTemplate.name = env.getValueDictByKey(UnitTemplate.name) + + self.Templates.Units[UnitTemplate.name] = {} + self.Templates.Units[UnitTemplate.name].UnitName = UnitTemplate.name + self.Templates.Units[UnitTemplate.name].Template = UnitTemplate + self.Templates.Units[UnitTemplate.name].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplate.name].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplate.name].GroupId = GroupTemplate.groupId + self.Templates.Units[UnitTemplate.name].CategoryID = CategoryID + self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplate.name].CountryID = CountryID + + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplate.name] = UnitTemplate + self.Templates.ClientsByName[UnitTemplate.name].CategoryID = CategoryID + self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplate.name].CountryID = CountryID + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + + TraceTable[#TraceTable+1] = self.Templates.Units[UnitTemplate.name].UnitName + end + + self:E( TraceTable ) +end + +function DATABASE:GetGroupTemplate( GroupName ) + local GroupTemplate = self.Templates.Groups[GroupName].Template + GroupTemplate.SpawnCoalitionID = self.Templates.Groups[GroupName].CoalitionID + GroupTemplate.SpawnCategoryID = self.Templates.Groups[GroupName].CategoryID + GroupTemplate.SpawnCountryID = self.Templates.Groups[GroupName].CountryID + return GroupTemplate +end + +function DATABASE:GetGroupNameFromUnitName( UnitName ) + return self.Templates.Units[UnitName].GroupName +end + +function DATABASE:GetGroupTemplateFromUnitName( UnitName ) + return self.Templates.Units[UnitName].GroupTemplate +end + +function DATABASE:GetCoalitionFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CoalitionID +end + +function DATABASE:GetCategoryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CategoryID +end + +function DATABASE:GetCountryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CountryID +end + +--- Airbase + +function DATABASE:GetCoalitionFromAirbase( AirbaseName ) + return self.AIRBASES[AirbaseName]:GetCoalition() +end + +function DATABASE:GetCategoryFromAirbase( AirbaseName ) + return self.AIRBASES[AirbaseName]:GetCategory() +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:", DCSGroupName } ) + self:AddGroup( DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnitName } ) + self:AddUnit( DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + return self +end + +--- Private method that registers all Units of skill Client or Player within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterClients() + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Register Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +--- @param #DATABASE self +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:", DCSStaticName } ) + self:AddStatic( DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + +--- @param #DATABASE self +function DATABASE:_RegisterAirbases() + + local CoalitionsData = { AirbasesRed = coalition.getAirbases( coalition.side.RED ), AirbasesBlue = coalition.getAirbases( coalition.side.BLUE ), AirbasesNeutral = coalition.getAirbases( coalition.side.NEUTRAL ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSAirbaseId, DCSAirbase in pairs( CoalitionData ) do + + local DCSAirbaseName = DCSAirbase:getName() + + self:E( { "Register Airbase:", DCSAirbaseName } ) + self:AddAirbase( DCSAirbaseName ) + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if Event.IniObjectCategory == 3 then + self:AddStatic( Event.IniDCSUnitName ) + else + if Event.IniObjectCategory == 1 then + self:AddUnit( Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroupName ) + end + end + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if Event.IniObjectCategory == 3 then + if self.STATICS[Event.IniDCSUnitName] then + self:DeleteStatic( Event.IniDCSUnitName ) + end + else + if Event.IniObjectCategory == 1 then + if self.UNITS[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + end + end + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniUnit then + if Event.IniObjectCategory == 1 then + self:AddUnit( Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroupName ) + local PlayerName = Event.IniUnit:GetPlayerName() + if not self.PLAYERS[PlayerName] then + self:AddPlayer( Event.IniUnitName, PlayerName ) + end + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Core.Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniUnit then + if Event.IniObjectCategory == 1 then + local PlayerName = Event.IniUnit:GetPlayerName() + if self.PLAYERS[PlayerName] then + self:DeletePlayer( PlayerName ) + end + 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, FinalizeFunction, 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 % 100 == 0 then +-- coroutine.yield( false ) +-- end + end + return true + end + +-- local co = coroutine.create( CoRoutine ) + local co = CoRoutine + + local function Schedule() + +-- local status, res = coroutine.resume( co ) + local status, res = co() + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + if FinalizeFunction then + FinalizeFunction( unpack( arg ) ) + 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 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, FinalizeFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, FinalizeFunction, 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 **ALIVE** 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 player who has joined the mission, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is was a player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerJoined( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSJOINED ) + + 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 + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for CoalitionName, coa_data in pairs(env.mission.coalition) do + + if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + local CoalitionSide = coalition.side[string.upper(CoalitionName)] + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[CoalitionName] = {} + 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[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 + self.Navpoints[CoalitionName][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.upper(cntry_data.name) + local CountryID = cntry_data.id + + self.COUNTRY_ID[CountryName] = CountryID + self.COUNTRY_NAME[CountryID] = CountryName + + --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 CategoryName = 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, + CoalitionSide, + _DATABASECategory[string.lower(CategoryName)], + CountryID + ) + 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 + + + + +--- **Core** - SET_ classes define **collections** of objects to perform **bulk actions** and logically **group** objects. +-- +-- ![Banner Image](..\Presentations\SET\Dia1.JPG) +-- +-- === +-- +-- SET_ classes group objects of the same type into a collection, which is either: +-- +-- * Manually managed using the **:Add...()** or **:Remove...()** methods. The initial SET can be filtered with the **@{#SET_BASE.FilterOnce}()** method +-- * Dynamically updated when new objects are created or objects are destroyed using the **@{#SET_BASE.FilterStart}()** method. +-- +-- Various types of SET_ classes are available: +-- +-- * @{#SET_UNIT}: Defines a colleciton of @{Unit}s filtered by filter criteria. +-- * @{#SET_GROUP}: Defines a collection of @{Group}s filtered by filter criteria. +-- * @{#SET_CLIENT}: Defines a collection of @{Client}s filterd by filter criteria. +-- * @{#SET_AIRBASE}: Defines a collection of @{Airbase}s filtered by filter criteria. +-- +-- These classes are derived from @{#SET_BASE}, which contains the main methods to manage SETs. +-- +-- A multitude of other methods are available in SET_ classes that allow to: +-- +-- * Validate the presence of objects in the SET. +-- * Trigger events when objects in the SET change a zone presence. +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Contributions: +-- +-- +-- @module Set + + +--- # 1) SET_BASE class, extends @{Base#BASE} +-- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. +-- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. +-- In this way, large loops can be done while not blocking the simulator main processing loop. +-- The default **"yield interval"** is after 10 objects processed. +-- The default **"time interval"** is after 0.001 seconds. +-- +-- ## 1.1) Add or remove objects from the SET +-- +-- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. +-- +-- ## 1.2) Define the SET iterator **"yield interval"** and the **"time interval"** +-- +-- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. +-- You can set the **"yield interval"**, and the **"time interval"**. (See above). +-- +-- @type SET_BASE +-- @field #table Filter +-- @field #table Set +-- @field #table List +-- @field Core.Scheduler#SCHEDULER CallScheduler +-- @extends Core.Base#BASE +SET_BASE = { + ClassName = "SET_BASE", + Filter = {}, + Set = {}, + List = {}, + Index = {}, +} + +--- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_BASE self +-- @return #SET_BASE +-- @usage +-- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = SET_BASE:New() +function SET_BASE:New( Database ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) -- Core.Set#SET_BASE + + self.Database = Database + + self.YieldInterval = 10 + self.TimeInterval = 0.001 + + self.Set = {} + + self.List = {} + self.List.__index = self.List + self.List = setmetatable( { Count = 0 }, self.List ) + + self.Index = {} + + self.CallScheduler = SCHEDULER:New( self ) + + self:SetEventPriority( 2 ) + + return self +end + +--- Finds an @{Base#BASE} object based on the object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Core.Base#BASE The Object found. +function SET_BASE:_Find( ObjectName ) + + local ObjectFound = self.Set[ObjectName] + return ObjectFound +end + + +--- Gets the Set. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:GetSet() + self:F2() + + return self.Set +end + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using a given ObjectName as the index. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @param Core.Base#BASE Object +-- @return Core.Base#BASE The added BASE Object. +function SET_BASE:Add( ObjectName, Object ) + self:F2( ObjectName ) + + local t = { _ = Object } + + if self.List.last then + self.List.last._next = t + t._prev = self.List.last + self.List.last = t + else + -- this is the first node + self.List.first = t + self.List.last = t + end + + self.List.Count = self.List.Count + 1 + + self.Set[ObjectName] = t._ + + table.insert( self.Index, ObjectName ) + +end + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. +-- @param #SET_BASE self +-- @param Wrapper.Object#OBJECT Object +-- @return Core.Base#BASE The added BASE Object. +function SET_BASE:AddObject( Object ) + self:F2( Object.ObjectName ) + + self:T( Object.UnitName ) + self:T( Object.ObjectName ) + self:Add( Object.ObjectName, Object ) + +end + + + +--- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +function SET_BASE:Remove( ObjectName ) + self:F( ObjectName ) + + local t = self.Set[ObjectName] + + self:E( { ObjectName, t } ) + + if t then + if t._next then + if t._prev then + t._next._prev = t._prev + t._prev._next = t._next + else + -- this was the first node + t._next._prev = nil + self.List._first = t._next + end + elseif t._prev then + -- this was the last node + t._prev._next = nil + self.List._last = t._prev + else + -- this was the only node + self.List._first = nil + self.List._last = nil + end + + t._next = nil + t._prev = nil + self.List.Count = self.List.Count - 1 + + for Index, Key in ipairs( self.Index ) do + if Key == ObjectName then + table.remove( self.Index, Index ) + break + end + end + + self.Set[ObjectName] = nil + + end + +end + +--- Gets a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Core.Base#BASE +function SET_BASE:Get( ObjectName ) + self:F( ObjectName ) + + local t = self.Set[ObjectName] + + self:T3( { ObjectName, t } ) + + return t + +end + +--- Gets the first object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetFirst() + self:F() + + local ObjectName = self.Index[1] + local FirstObject = self.Set[ObjectName] + self:T3( { FirstObject } ) + return FirstObject +end + +--- Gets the last object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetLast() + self:F() + + local ObjectName = self.Index[#self.Index] + local LastObject = self.Set[ObjectName] + self:T3( { LastObject } ) + return LastObject +end + +--- Gets a random object from the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return Core.Base#BASE +function SET_BASE:GetRandom() + self:F() + + local RandomItem = self.Set[self.Index[math.random(#self.Index)]] + + self:T3( { RandomItem } ) + + return RandomItem +end + + +--- Retrieves the amount of objects in the @{Set#SET_BASE} and derived classes. +-- @param #SET_BASE self +-- @return #number Count +function SET_BASE:Count() + + return #self.Index or 0 +end + + + +--- Copies the Filter criteria from a given Set (for rebuilding a new Set based on an existing Set). +-- @param #SET_BASE self +-- @param #SET_BASE BaseSet +-- @return #SET_BASE +function SET_BASE:SetDatabase( BaseSet ) + + -- Copy the filter criteria of the BaseSet + local OtherFilter = routines.utils.deepCopy( BaseSet.Filter ) + self.Filter = OtherFilter + + -- Now base the new Set on the BaseSet + self.Database = BaseSet:GetSet() + return self +end + + + +--- Define the SET iterator **"yield interval"** and the **"time interval"**. +-- @param #SET_BASE self +-- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. +-- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. +-- @return #SET_BASE self +function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) + + self.YieldInterval = YieldInterval + self.TimeInterval = TimeInterval + + return self +end + + +--- Filters for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:FilterOnce() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + end + end + + return self +end + +--- Starts the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:_FilterStart() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:E( { "Adding Object:", ObjectName } ) + self:Add( ObjectName, Object ) + end + end + + self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + + -- Follow alive players and clients + self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) + + + return self +end + +--- Stops the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:FilterStop() + + self:UnHandleEvent( EVENTS.Birth ) + self:UnHandleEvent( EVENTS.Dead ) + self:UnHandleEvent( EVENTS.Crash ) + + return self +end + +--- Iterate the SET_BASE while identifying the nearest object from a @{Point#POINT_VEC2}. +-- @param #SET_BASE self +-- @param Core.Point#POINT_VEC2 PointVec2 A @{Point#POINT_VEC2} object from where to evaluate the closest object in the set. +-- @return Core.Base#BASE The closest object. +function SET_BASE:FindNearestObjectFromPointVec2( PointVec2 ) + self:F2( PointVec2 ) + + local NearestObject = nil + local ClosestDistance = nil + + for ObjectID, ObjectData in pairs( self.Set ) do + if NearestObject == nil then + NearestObject = ObjectData + ClosestDistance = PointVec2:DistanceFromVec2( ObjectData:GetVec2() ) + else + local Distance = PointVec2:DistanceFromVec2( ObjectData:GetVec2() ) + if Distance < ClosestDistance then + NearestObject = ObjectData + ClosestDistance = Distance + end + end + end + + return NearestObject +end + + + +----- Private method that registers all alive players in the mission. +---- @param #SET_BASE self +---- @return #SET_BASE self +--function SET_BASE:_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() +-- if not self.PlayersAlive[UnitName] then +-- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) +-- self.PlayersAlive[UnitName] = UnitData:getPlayerName() +-- end +-- end +-- end +-- end +-- +-- return self +--end + +--- Events + +--- Handles the OnBirth event for the Set. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnBirth( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if Object and self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnDeadOrCrash( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:FindInDatabase( Event ) + if ObjectName and Object ~= nil then + self:Remove( ObjectName ) + end + end +end + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnPlayerEnterUnit( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #SET_BASE self +-- @param Core.Event#EVENTDATA Event +function SET_BASE:_EventOnPlayerLeaveUnit( Event ) + self:F3( { Event } ) + + local ObjectName = Event.IniDCSUnit + if Event.IniDCSUnit then + if Event.IniDCSGroup then + local GroupUnits = Event.IniDCSGroup:getUnits() + local PlayerCount = 0 + for _, DCSUnit in pairs( GroupUnits ) do + if DCSUnit ~= Event.IniDCSUnit then + if DCSUnit:getPlayer() ~= nil then + PlayerCount = PlayerCount + 1 + end + end + end + self:E(PlayerCount) + if PlayerCount == 0 then + self:Remove( Event.IniDCSGroupName ) + end + end + end +end + +-- Iterators + +--- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. +-- @param #SET_BASE self +-- @param #function IteratorFunction The function that will be called. +-- @return #SET_BASE self +function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) + self:F3( arg ) + + Set = Set or self:GetSet() + arg = arg or {} + + local function CoRoutine() + local Count = 0 + for ObjectID, ObjectData in pairs( Set ) do + local Object = ObjectData + self:T3( Object ) + if Function then + if Function( unpack( FunctionArguments ), Object ) == true then + IteratorFunction( Object, unpack( arg ) ) + end + else + IteratorFunction( Object, unpack( arg ) ) + end + Count = Count + 1 +-- if Count % self.YieldInterval == 0 then +-- coroutine.yield( false ) +-- end + end + return true + end + +-- local co = coroutine.create( CoRoutine ) + local co = CoRoutine + + local function Schedule() + +-- local status, res = coroutine.resume( co ) + local status, res = co() + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + --self.CallScheduler:Schedule( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + Schedule() + + return self +end + + +----- Iterate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) +-- +-- return self +--end +-- +----- Iterate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachPlayer( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachClient( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- Decides whether to include the Object +-- @param #SET_BASE self +-- @param #table Object +-- @return #SET_BASE self +function SET_BASE:IsIncludeObject( Object ) + self:F3( Object ) + + return true +end + +--- Flushes the current SET_BASE contents in the log ... (for debugging reasons). +-- @param #SET_BASE self +-- @return #string A string with the names of the objects. +function SET_BASE:Flush() + self:F3() + + local ObjectNames = "" + for ObjectName, Object in pairs( self.Set ) do + ObjectNames = ObjectNames .. ObjectName .. ", " + end + self:E( { "Objects in Set:", ObjectNames } ) + + return ObjectNames +end + +-- SET_GROUP + +--- # 2) SET_GROUP class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Starting with certain prefix strings. +-- +-- ## 2.1) SET_GROUP constructor +-- +-- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: +-- +-- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. +-- +-- ## 2.2) Add or Remove GROUP(s) from SET_GROUP +-- +-- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. +-- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. +-- +-- ## 2.3) SET_GROUP filter criteria +-- +-- You can set filter criteria to define the set of groups within the SET_GROUP. +-- Filter criteria are defined by: +-- +-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). +-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). +-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). +-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: +-- +-- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. +-- +-- ## 2.4) SET_GROUP iterators +-- +-- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. +-- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_GROUP: +-- +-- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- @type SET_GROUP +-- @extends Core.Set#SET_BASE +SET_GROUP = { + ClassName = "SET_GROUP", + Filter = { + Coalitions = nil, + Categories = nil, + Countries = nil, + GroupPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Group.Category.AIRPLANE, + helicopter = Group.Category.HELICOPTER, + ground = Group.Category.GROUND_UNIT, + ship = Group.Category.SHIP, + structure = Group.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_GROUP self +-- @return #SET_GROUP +-- @usage +-- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. +-- DBObject = SET_GROUP:New() +function SET_GROUP:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) + + return self +end + +--- Add GROUP(s) to SET_GROUP. +-- @param Core.Set#SET_GROUP self +-- @param #string AddGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:AddGroupsByName( AddGroupNames ) + + local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } + + for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do + self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) + end + + return self +end + +--- Remove GROUP(s) from SET_GROUP. +-- @param Core.Set#SET_GROUP self +-- @param Wrapper.Group#GROUP RemoveGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) + + local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } + + for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do + self:Remove( RemoveGroupName.GroupName ) + end + + return self +end + + + + +--- Finds a Group based on the Group Name. +-- @param #SET_GROUP self +-- @param #string GroupName +-- @return Wrapper.Group#GROUP The found Group. +function SET_GROUP:FindGroup( GroupName ) + + local GroupFound = self.Set[GroupName] + return GroupFound +end + + + +--- Builds a set of groups of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_GROUP self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_GROUP self +function SET_GROUP:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of groups out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_GROUP self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_GROUP self +function SET_GROUP:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Builds a set of groups of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_GROUP self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_GROUP self +function SET_GROUP:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of groups of defined GROUP prefixes. +-- All the groups starting with the given prefixes will be included within the set. +-- @param #SET_GROUP self +-- @param #string Prefixes The prefix of which the group name starts with. +-- @return #SET_GROUP self +function SET_GROUP:FilterPrefixes( Prefixes ) + if not self.Filter.GroupPrefixes then + self.Filter.GroupPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.GroupPrefixes[Prefix] = Prefix + end + return self +end + + +--- Starts the filtering. +-- @param #SET_GROUP self +-- @return #SET_GROUP self +function SET_GROUP:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_GROUP self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:AddInDatabase( Event ) + self:F3( { Event } ) + + if Event.IniObjectCategory == 1 then + if not self.Database[Event.IniDCSGroupName] then + self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) + self:T3( self.Database[Event.IniDCSGroupName] ) + end + end + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_GROUP self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #SET_GROUP self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsPartlyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + +----- Iterate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_GROUP self +-- @param Wrapper.Group#GROUP MooseGroup +-- @return #SET_GROUP self +function SET_GROUP:IsIncludeObject( MooseGroup ) + self:F2( MooseGroup ) + local MooseGroupInclude = true + + if self.Filter.Coalitions then + local MooseGroupCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then + MooseGroupCoalition = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition + end + + if self.Filter.Categories then + local MooseGroupCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then + MooseGroupCategory = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCategory + end + + if self.Filter.Countries then + local MooseGroupCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) + if country.id[CountryName] == MooseGroup:GetCountry() then + MooseGroupCountry = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCountry + end + + if self.Filter.GroupPrefixes then + local MooseGroupPrefix = false + for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do + self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) + if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then + MooseGroupPrefix = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix + end + + self:T2( MooseGroupInclude ) + return MooseGroupInclude +end + +--- # 3) SET_UNIT class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the SET_UNIT class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Unit types +-- * Starting with certain prefix strings. +-- +-- ## 3.1) SET_UNIT constructor +-- +-- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: +-- +-- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. +-- +-- ## 3.2) Add or Remove UNIT(s) from SET_UNIT +-- +-- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. +-- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. +-- +-- ## 3.3) SET_UNIT filter criteria +-- +-- You can set filter criteria to define the set of units within the SET_UNIT. +-- Filter criteria are defined by: +-- +-- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). +-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). +-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). +-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). +-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: +-- +-- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. +-- +-- ## 3.4) SET_UNIT iterators +-- +-- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. +-- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_UNIT: +-- +-- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- Planned iterators methods in development are (so these are not yet available): +-- +-- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. +-- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- +-- ## 3.5 ) SET_UNIT atomic methods +-- +-- Various methods exist for a SET_UNIT to perform actions or calculations and retrieve results from the SET_UNIT: +-- +-- * @{#SET_UNIT.GetTypeNames}(): Retrieve the type names of the @{Unit}s in the SET, delimited by a comma. +-- +-- +-- @type SET_UNIT +-- @extends Core.Set#SET_BASE +SET_UNIT = { + ClassName = "SET_UNIT", + Units = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + UnitPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_UNIT self +-- @return #SET_UNIT +-- @usage +-- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. +-- DBObject = SET_UNIT:New() +function SET_UNIT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) + + return self +end + +--- Add UNIT(s) to SET_UNIT. +-- @param #SET_UNIT self +-- @param #string AddUnit A single UNIT. +-- @return #SET_UNIT self +function SET_UNIT:AddUnit( AddUnit ) + self:F2( AddUnit:GetName() ) + + self:Add( AddUnit:GetName(), AddUnit ) + + return self +end + + +--- Add UNIT(s) to SET_UNIT. +-- @param #SET_UNIT self +-- @param #string AddUnitNames A single name or an array of UNIT names. +-- @return #SET_UNIT self +function SET_UNIT:AddUnitsByName( AddUnitNames ) + + local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } + + self:T( AddUnitNamesArray ) + for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do + self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) + end + + return self +end + +--- Remove UNIT(s) from SET_UNIT. +-- @param Core.Set#SET_UNIT self +-- @param Wrapper.Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) + + local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } + + for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do + self:Remove( RemoveUnitName ) + end + + return self +end + + +--- Finds a Unit based on the Unit Name. +-- @param #SET_UNIT self +-- @param #string UnitName +-- @return Wrapper.Unit#UNIT The found Unit. +function SET_UNIT:FindUnit( UnitName ) + + local UnitFound = self.Set[UnitName] + return UnitFound +end + + + +--- Builds a set of units of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_UNIT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_UNIT self +function SET_UNIT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of units out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_UNIT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_UNIT self +function SET_UNIT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of units of defined unit types. +-- Possible current types are those types known within DCS world. +-- @param #SET_UNIT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of units of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_UNIT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of units of defined unit prefixes. +-- All the units starting with the given prefixes will be included within the set. +-- @param #SET_UNIT self +-- @param #string Prefixes The prefix of which the unit name starts with. +-- @return #SET_UNIT self +function SET_UNIT:FilterPrefixes( Prefixes ) + if not self.Filter.UnitPrefixes then + self.Filter.UnitPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.UnitPrefixes[Prefix] = Prefix + end + return self +end + +--- Builds a set of units having a radar of give types. +-- All the units having a radar of a given type will be included within the set. +-- @param #SET_UNIT self +-- @param #table RadarTypes The radar types. +-- @return #SET_UNIT self +function SET_UNIT:FilterHasRadar( RadarTypes ) + + self.Filter.RadarTypes = self.Filter.RadarTypes or {} + if type( RadarTypes ) ~= "table" then + RadarTypes = { RadarTypes } + end + for RadarTypeID, RadarType in pairs( RadarTypes ) do + self.Filter.RadarTypes[RadarType] = RadarType + end + return self +end + +--- Builds a set of SEADable units. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterHasSEAD() + + self.Filter.SEAD = true + return self +end + + + +--- Starts the filtering. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_UNIT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:AddInDatabase( Event ) + self:F3( { Event } ) + + if Event.IniObjectCategory == 1 then + if not self.Database[Event.IniDCSUnitName] then + self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) + self:T3( self.Database[Event.IniDCSUnitName] ) + end + end + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_UNIT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:FindInDatabase( Event ) + self:E( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + + + return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] +end + +--- Iterate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #SET_UNIT self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Returns map of unit types. +-- @param #SET_UNIT self +-- @return #map<#string,#number> A map of the unit types found. The key is the UnitTypeName and the value is the amount of unit types found. +function SET_UNIT:GetUnitTypes() + self:F2() + + local MT = {} -- Message Text + local UnitTypes = {} + + for UnitID, UnitData in pairs( self:GetSet() ) do + local TextUnit = UnitData -- Wrapper.Unit#UNIT + if TextUnit:IsAlive() then + local UnitType = TextUnit:GetTypeName() + + if not UnitTypes[UnitType] then + UnitTypes[UnitType] = 1 + else + UnitTypes[UnitType] = UnitTypes[UnitType] + 1 + end + end + end + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return UnitTypes +end + + +--- Returns a comma separated string of the unit types with a count in the @{Set}. +-- @param #SET_UNIT self +-- @return #string The unit types string +function SET_UNIT:GetUnitTypesText() + self:F2() + + local MT = {} -- Message Text + local UnitTypes = self:GetUnitTypes() + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return table.concat( MT, ", " ) +end + +--- Returns map of unit threat levels. +-- @param #SET_UNIT self +-- @return #table. +function SET_UNIT:GetUnitThreatLevels() + self:F2() + + local UnitThreatLevels = {} + + for UnitID, UnitData in pairs( self:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + if ThreatUnit:IsAlive() then + local UnitThreatLevel, UnitThreatLevelText = ThreatUnit:GetThreatLevel() + local ThreatUnitName = ThreatUnit:GetName() + + UnitThreatLevels[UnitThreatLevel] = UnitThreatLevels[UnitThreatLevel] or {} + UnitThreatLevels[UnitThreatLevel].UnitThreatLevelText = UnitThreatLevelText + UnitThreatLevels[UnitThreatLevel].Units = UnitThreatLevels[UnitThreatLevel].Units or {} + UnitThreatLevels[UnitThreatLevel].Units[ThreatUnitName] = ThreatUnit + end + end + + return UnitThreatLevels +end + +--- Calculate the maxium A2G threat level of the SET_UNIT. +-- @param #SET_UNIT self +function SET_UNIT:CalculateThreatLevelA2G() + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( self:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + return MaxThreatLevelA2G + +end + + +--- Returns if the @{Set} has targets having a radar (of a given type). +-- @param #SET_UNIT self +-- @param Dcs.DCSWrapper.Unit#Unit.RadarType RadarType +-- @return #number The amount of radars in the Set with the given type +function SET_UNIT:HasRadar( RadarType ) + self:F2( RadarType ) + + local RadarCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitSensorTest = UnitData -- Wrapper.Unit#UNIT + local HasSensors + if RadarType then + HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR, RadarType ) + else + HasSensors = UnitSensorTest:HasSensors( Unit.SensorType.RADAR ) + end + self:T3(HasSensors) + if HasSensors then + RadarCount = RadarCount + 1 + end + end + + return RadarCount +end + +--- Returns if the @{Set} has targets that can be SEADed. +-- @param #SET_UNIT self +-- @return #number The amount of SEADable units in the Set +function SET_UNIT:HasSEAD() + self:F2() + + local SEADCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitSEAD = UnitData -- Wrapper.Unit#UNIT + if UnitSEAD:IsAlive() then + local UnitSEADAttributes = UnitSEAD:GetDesc().attributes + + local HasSEAD = UnitSEAD:HasSEAD() + + self:T3(HasSEAD) + if HasSEAD then + SEADCount = SEADCount + 1 + end + end + end + + return SEADCount +end + +--- Returns if the @{Set} has ground targets. +-- @param #SET_UNIT self +-- @return #number The amount of ground targets in the Set. +function SET_UNIT:HasGroundUnits() + self:F2() + + local GroundUnitCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitTest = UnitData -- Wrapper.Unit#UNIT + if UnitTest:IsGround() then + GroundUnitCount = GroundUnitCount + 1 + end + end + + return GroundUnitCount +end + +--- Returns if the @{Set} has friendly ground units. +-- @param #SET_UNIT self +-- @return #number The amount of ground targets in the Set. +function SET_UNIT:HasFriendlyUnits( FriendlyCoalition ) + self:F2() + + local FriendlyUnitCount = 0 + for UnitID, UnitData in pairs( self:GetSet()) do + local UnitTest = UnitData -- Wrapper.Unit#UNIT + if UnitTest:IsFriendly( FriendlyCoalition ) then + FriendlyUnitCount = FriendlyUnitCount + 1 + end + end + + return FriendlyUnitCount +end + + + +----- Iterate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Iterate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_UNIT self +-- @param Wrapper.Unit#UNIT MUnit +-- @return #SET_UNIT self +function SET_UNIT:IsIncludeObject( MUnit ) + self:F2( MUnit ) + local MUnitInclude = true + + if self.Filter.Coalitions then + local MUnitCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then + MUnitCoalition = true + end + end + MUnitInclude = MUnitInclude and MUnitCoalition + end + + if self.Filter.Categories then + local MUnitCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then + MUnitCategory = true + end + end + MUnitInclude = MUnitInclude and MUnitCategory + end + + if self.Filter.Types then + local MUnitType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) + if TypeName == MUnit:GetTypeName() then + MUnitType = true + end + end + MUnitInclude = MUnitInclude and MUnitType + end + + if self.Filter.Countries then + local MUnitCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) + if country.id[CountryName] == MUnit:GetCountry() then + MUnitCountry = true + end + end + MUnitInclude = MUnitInclude and MUnitCountry + end + + if self.Filter.UnitPrefixes then + local MUnitPrefix = false + for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do + self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) + if string.find( MUnit:GetName(), UnitPrefix, 1 ) then + MUnitPrefix = true + end + end + MUnitInclude = MUnitInclude and MUnitPrefix + end + + if self.Filter.RadarTypes then + local MUnitRadar = false + for RadarTypeID, RadarType in pairs( self.Filter.RadarTypes ) do + self:T3( { "Radar:", RadarType } ) + if MUnit:HasSensors( Unit.SensorType.RADAR, RadarType ) == true then + if MUnit:GetRadar() == true then -- This call is necessary to evaluate the SEAD capability. + self:T3( "RADAR Found" ) + end + MUnitRadar = true + end + end + MUnitInclude = MUnitInclude and MUnitRadar + end + + if self.Filter.SEAD then + local MUnitSEAD = false + if MUnit:HasSEAD() == true then + self:T3( "SEAD Found" ) + MUnitSEAD = true + end + MUnitInclude = MUnitInclude and MUnitSEAD + end + + self:T2( MUnitInclude ) + return MUnitInclude +end + + +--- Retrieve the type names of the @{Unit}s in the SET, delimited by an optional delimiter. +-- @param #SET_UNIT self +-- @param #string Delimiter (optional) The delimiter, which is default a comma. +-- @return #string The types of the @{Unit}s delimited. +function SET_UNIT:GetTypeNames( Delimiter ) + + Delimiter = Delimiter or ", " + local TypeReport = REPORT:New() + local Types = {} + + for UnitName, UnitData in pairs( self:GetSet() ) do + + local Unit = UnitData -- Wrapper.Unit#UNIT + local UnitTypeName = Unit:GetTypeName() + + if not Types[UnitTypeName] then + Types[UnitTypeName] = UnitTypeName + TypeReport:Add( UnitTypeName ) + end + end + + return TypeReport:Text( Delimiter ) +end + + +--- SET_CLIENT + +--- # 4) SET_CLIENT class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Client types +-- * Starting with certain prefix strings. +-- +-- ## 4.1) SET_CLIENT constructor +-- +-- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: +-- +-- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. +-- +-- ## 4.2) Add or Remove CLIENT(s) from SET_CLIENT +-- +-- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. +-- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. +-- +-- ## 4.3) SET_CLIENT filter criteria +-- +-- You can set filter criteria to define the set of clients within the SET_CLIENT. +-- Filter criteria are defined by: +-- +-- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). +-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). +-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). +-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). +-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: +-- +-- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. +-- +-- ## 4.4) SET_CLIENT iterators +-- +-- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. +-- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_CLIENT: +-- +-- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. +-- +-- @type SET_CLIENT +-- @extends Core.Set#SET_BASE +SET_CLIENT = { + ClassName = "SET_CLIENT", + Clients = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + ClientPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT +-- @usage +-- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. +-- DBObject = SET_CLIENT:New() +function SET_CLIENT:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) + + return self +end + +--- Add CLIENT(s) to SET_CLIENT. +-- @param Core.Set#SET_CLIENT self +-- @param #string AddClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:AddClientsByName( AddClientNames ) + + local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } + + for AddClientID, AddClientName in pairs( AddClientNamesArray ) do + self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + end + + return self +end + +--- Remove CLIENT(s) from SET_CLIENT. +-- @param Core.Set#SET_CLIENT self +-- @param Wrapper.Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) + + local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } + + for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do + self:Remove( RemoveClientName.ClientName ) + end + + return self +end + + +--- Finds a Client based on the Client Name. +-- @param #SET_CLIENT self +-- @param #string ClientName +-- @return Wrapper.Client#CLIENT The found Client. +function SET_CLIENT:FindClient( ClientName ) + + local ClientFound = self.Set[ClientName] + return ClientFound +end + + + +--- Builds a set of clients of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_CLIENT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of clients out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_CLIENT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of clients of defined client types. +-- Possible current types are those types known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of clients of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of clients of defined client prefixes. +-- All the clients starting with the given prefixes will be included within the set. +-- @param #SET_CLIENT self +-- @param #string Prefixes The prefix of which the client name starts with. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterPrefixes( Prefixes ) + if not self.Filter.ClientPrefixes then + self.Filter.ClientPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.ClientPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT self +function SET_CLIENT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_CLIENT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_CLIENT self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Iterate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. +-- @param #SET_CLIENT self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Core.Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Core.Zone#ZONE_BASE ZoneObject + -- @param Wrapper.Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- +-- @param #SET_CLIENT self +-- @param Wrapper.Client#CLIENT MClient +-- @return #SET_CLIENT self +function SET_CLIENT:IsIncludeObject( MClient ) + self:F2( MClient ) + + local MClientInclude = true + + if MClient then + local MClientName = MClient.UnitName + + if self.Filter.Coalitions then + local MClientCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then + MClientCoalition = true + end + end + self:T( { "Evaluated Coalition", MClientCoalition } ) + MClientInclude = MClientInclude and MClientCoalition + end + + if self.Filter.Categories then + local MClientCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then + MClientCategory = true + end + end + self:T( { "Evaluated Category", MClientCategory } ) + MClientInclude = MClientInclude and MClientCategory + end + + if self.Filter.Types then + local MClientType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) + if TypeName == MClient:GetTypeName() then + MClientType = true + end + end + self:T( { "Evaluated Type", MClientType } ) + MClientInclude = MClientInclude and MClientType + end + + if self.Filter.Countries then + local MClientCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + if country.id[CountryName] and country.id[CountryName] == ClientCountryID then + MClientCountry = true + end + end + self:T( { "Evaluated Country", MClientCountry } ) + MClientInclude = MClientInclude and MClientCountry + end + + if self.Filter.ClientPrefixes then + local MClientPrefix = false + for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do + self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) + if string.find( MClient.UnitName, ClientPrefix, 1 ) then + MClientPrefix = true + end + end + self:T( { "Evaluated Prefix", MClientPrefix } ) + MClientInclude = MClientInclude and MClientPrefix + end + end + + self:T2( MClientInclude ) + return MClientInclude +end + +--- SET_AIRBASE + +--- # 5) SET_AIRBASE class, extends @{Set#SET_BASE} +-- +-- Mission designers can use the @{Set#SET_AIRBASE} class to build sets of airbases optionally belonging to certain: +-- +-- * Coalitions +-- +-- ## 5.1) SET_AIRBASE constructor +-- +-- Create a new SET_AIRBASE object with the @{#SET_AIRBASE.New} method: +-- +-- * @{#SET_AIRBASE.New}: Creates a new SET_AIRBASE object. +-- +-- ## 5.2) Add or Remove AIRBASEs from SET_AIRBASE +-- +-- AIRBASEs can be added and removed using the @{Set#SET_AIRBASE.AddAirbasesByName} and @{Set#SET_AIRBASE.RemoveAirbasesByName} respectively. +-- These methods take a single AIRBASE name or an array of AIRBASE names to be added or removed from SET_AIRBASE. +-- +-- ## 5.3) SET_AIRBASE filter criteria +-- +-- You can set filter criteria to define the set of clients within the SET_AIRBASE. +-- Filter criteria are defined by: +-- +-- * @{#SET_AIRBASE.FilterCoalitions}: Builds the SET_AIRBASE with the airbases belonging to the coalition(s). +-- +-- Once the filter criteria have been set for the SET_AIRBASE, you can start filtering using: +-- +-- * @{#SET_AIRBASE.FilterStart}: Starts the filtering of the airbases within the SET_AIRBASE. +-- +-- ## 5.4) SET_AIRBASE iterators +-- +-- Once the filters have been defined and the SET_AIRBASE has been built, you can iterate the SET_AIRBASE with the available iterator methods. +-- The iterator methods will walk the SET_AIRBASE set, and call for each airbase within the set a function that you provide. +-- The following iterator methods are currently available within the SET_AIRBASE: +-- +-- * @{#SET_AIRBASE.ForEachAirbase}: Calls a function for each airbase it finds within the SET_AIRBASE. +-- +-- @type SET_AIRBASE +-- @extends Core.Set#SET_BASE +SET_AIRBASE = { + ClassName = "SET_AIRBASE", + Airbases = {}, + Filter = { + Coalitions = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + airdrome = Airbase.Category.AIRDROME, + helipad = Airbase.Category.HELIPAD, + ship = Airbase.Category.SHIP, + }, + }, +} + + +--- Creates a new SET_AIRBASE object, building a set of airbases belonging to a coalitions and categories. +-- @param #SET_AIRBASE self +-- @return #SET_AIRBASE self +-- @usage +-- -- Define a new SET_AIRBASE Object. The DatabaseSet will contain a reference to all Airbases. +-- DatabaseSet = SET_AIRBASE:New() +function SET_AIRBASE:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.AIRBASES ) ) + + return self +end + +--- Add AIRBASEs to SET_AIRBASE. +-- @param Core.Set#SET_AIRBASE self +-- @param #string AddAirbaseNames A single name or an array of AIRBASE names. +-- @return self +function SET_AIRBASE:AddAirbasesByName( AddAirbaseNames ) + + local AddAirbaseNamesArray = ( type( AddAirbaseNames ) == "table" ) and AddAirbaseNames or { AddAirbaseNames } + + for AddAirbaseID, AddAirbaseName in pairs( AddAirbaseNamesArray ) do + self:Add( AddAirbaseName, AIRBASE:FindByName( AddAirbaseName ) ) + end + + return self +end + +--- Remove AIRBASEs from SET_AIRBASE. +-- @param Core.Set#SET_AIRBASE self +-- @param Wrapper.Airbase#AIRBASE RemoveAirbaseNames A single name or an array of AIRBASE names. +-- @return self +function SET_AIRBASE:RemoveAirbasesByName( RemoveAirbaseNames ) + + local RemoveAirbaseNamesArray = ( type( RemoveAirbaseNames ) == "table" ) and RemoveAirbaseNames or { RemoveAirbaseNames } + + for RemoveAirbaseID, RemoveAirbaseName in pairs( RemoveAirbaseNamesArray ) do + self:Remove( RemoveAirbaseName.AirbaseName ) + end + + return self +end + + +--- Finds a Airbase based on the Airbase Name. +-- @param #SET_AIRBASE self +-- @param #string AirbaseName +-- @return Wrapper.Airbase#AIRBASE The found Airbase. +function SET_AIRBASE:FindAirbase( AirbaseName ) + + local AirbaseFound = self.Set[AirbaseName] + return AirbaseFound +end + + + +--- Builds a set of airbases of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_AIRBASE self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of airbases out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_AIRBASE self +-- @param #string Categories Can take the following values: "airdrome", "helipad", "ship". +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Starts the filtering. +-- @param #SET_AIRBASE self +-- @return #SET_AIRBASE self +function SET_AIRBASE:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_AIRBASE self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the AIRBASE +-- @return #table The AIRBASE +function SET_AIRBASE:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_AIRBASE self +-- @param Core.Event#EVENTDATA Event +-- @return #string The name of the AIRBASE +-- @return #table The AIRBASE +function SET_AIRBASE:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Iterate the SET_AIRBASE and call an interator function for each AIRBASE, providing the AIRBASE and optional parameters. +-- @param #SET_AIRBASE self +-- @param #function IteratorFunction The function that will be called when there is an alive AIRBASE in the SET_AIRBASE. The function needs to accept a AIRBASE parameter. +-- @return #SET_AIRBASE self +function SET_AIRBASE:ForEachAirbase( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_AIRBASE while identifying the nearest @{Airbase#AIRBASE} from a @{Point#POINT_VEC2}. +-- @param #SET_AIRBASE self +-- @param Core.Point#POINT_VEC2 PointVec2 A @{Point#POINT_VEC2} object from where to evaluate the closest @{Airbase#AIRBASE}. +-- @return Wrapper.Airbase#AIRBASE The closest @{Airbase#AIRBASE}. +function SET_AIRBASE:FindNearestAirbaseFromPointVec2( PointVec2 ) + self:F2( PointVec2 ) + + local NearestAirbase = self:FindNearestObjectFromPointVec2( PointVec2 ) + return NearestAirbase +end + + + +--- +-- @param #SET_AIRBASE self +-- @param Wrapper.Airbase#AIRBASE MAirbase +-- @return #SET_AIRBASE self +function SET_AIRBASE:IsIncludeObject( MAirbase ) + self:F2( MAirbase ) + + local MAirbaseInclude = true + + if MAirbase then + local MAirbaseName = MAirbase:GetName() + + if self.Filter.Coalitions then + local MAirbaseCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local AirbaseCoalitionID = _DATABASE:GetCoalitionFromAirbase( MAirbaseName ) + self:T3( { "Coalition:", AirbaseCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == AirbaseCoalitionID then + MAirbaseCoalition = true + end + end + self:T( { "Evaluated Coalition", MAirbaseCoalition } ) + MAirbaseInclude = MAirbaseInclude and MAirbaseCoalition + end + + if self.Filter.Categories then + local MAirbaseCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local AirbaseCategoryID = _DATABASE:GetCategoryFromAirbase( MAirbaseName ) + self:T3( { "Category:", AirbaseCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == AirbaseCategoryID then + MAirbaseCategory = true + end + end + self:T( { "Evaluated Category", MAirbaseCategory } ) + MAirbaseInclude = MAirbaseInclude and MAirbaseCategory + end + end + + self:T2( MAirbaseInclude ) + return MAirbaseInclude +end +--- **Core** - **POINT\_VEC** classes define an **extensive API** to **manage 3D points** in the simulation space. +-- +-- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} +-- ================================================== +-- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. +-- +-- **Important Note:** Most of the functions in this section were taken from MIST, and reworked to OO concepts. +-- In order to keep the credibility of the the author, I want to emphasize that the of the MIST framework was created by Grimes, who you can find on the Eagle Dynamics Forums. +-- +-- ## 1.1) POINT_VEC3 constructor +-- +-- A new POINT_VEC3 instance can be created with: +-- +-- * @{Point#POINT_VEC3.New}(): a 3D point. +-- * @{Point#POINT_VEC3.NewFromVec3}(): a 3D point created from a @{DCSTypes#Vec3}. +-- +-- ## 1.2) Manupulate the X, Y, Z coordinates of the point +-- +-- A POINT_VEC3 class works in 3D space. It contains internally an X, Y, Z coordinate. +-- Methods exist to manupulate these coordinates. +-- +-- The current X, Y, Z axis can be retrieved with the methods @{#POINT_VEC3.GetX}(), @{#POINT_VEC3.GetY}(), @{#POINT_VEC3.GetZ}() respectively. +-- The methods @{#POINT_VEC3.SetX}(), @{#POINT_VEC3.SetY}(), @{#POINT_VEC3.SetZ}() change the respective axis with a new value. +-- The current axis values can be changed by using the methods @{#POINT_VEC3.AddX}(), @{#POINT_VEC3.AddY}(), @{#POINT_VEC3.AddZ}() +-- to add or substract a value from the current respective axis value. +-- Note that the Set and Add methods return the current POINT_VEC3 object, so these manipulation methods can be chained... For example: +-- +-- local Vec3 = PointVec3:AddX( 100 ):AddZ( 150 ):GetVec3() +-- +-- ## 1.3) Create waypoints for routes +-- +-- A POINT_VEC3 can prepare waypoints for Ground, Air and Naval groups to be embedded into a Route. +-- +-- +-- ## 1.5) Smoke, flare, explode, illuminate +-- +-- At the point a smoke, flare, explosion and illumination bomb can be triggered. Use the following methods: +-- +-- ### 1.5.1) Smoke +-- +-- * @{#POINT_VEC3.Smoke}(): To smoke the point in a certain color. +-- * @{#POINT_VEC3.SmokeBlue}(): To smoke the point in blue. +-- * @{#POINT_VEC3.SmokeRed}(): To smoke the point in red. +-- * @{#POINT_VEC3.SmokeOrange}(): To smoke the point in orange. +-- * @{#POINT_VEC3.SmokeWhite}(): To smoke the point in white. +-- * @{#POINT_VEC3.SmokeGreen}(): To smoke the point in green. +-- +-- ### 1.5.2) Flare +-- +-- * @{#POINT_VEC3.Flare}(): To flare the point in a certain color. +-- * @{#POINT_VEC3.FlareRed}(): To flare the point in red. +-- * @{#POINT_VEC3.FlareYellow}(): To flare the point in yellow. +-- * @{#POINT_VEC3.FlareWhite}(): To flare the point in white. +-- * @{#POINT_VEC3.FlareGreen}(): To flare the point in green. +-- +-- ### 1.5.3) Explode +-- +-- * @{#POINT_VEC3.Explosion}(): To explode the point with a certain intensity. +-- +-- ### 1.5.4) Illuminate +-- +-- * @{#POINT_VEC3.IlluminationBomb}(): To illuminate the 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_VEC2 instance can be created with: +-- +-- * @{Point#POINT_VEC2.New}(): a 2D point, taking an additional height parameter. +-- * @{Point#POINT_VEC2.NewFromVec2}(): a 2D point created from a @{DCSTypes#Vec2}. +-- +-- ## 1.2) Manupulate the X, Altitude, Y coordinates of the 2D point +-- +-- A POINT_VEC2 class works in 2D space, with an altitude setting. It contains internally an X, Altitude, Y coordinate. +-- Methods exist to manupulate these coordinates. +-- +-- The current X, Altitude, Y axis can be retrieved with the methods @{#POINT_VEC2.GetX}(), @{#POINT_VEC2.GetAlt}(), @{#POINT_VEC2.GetY}() respectively. +-- The methods @{#POINT_VEC2.SetX}(), @{#POINT_VEC2.SetAlt}(), @{#POINT_VEC2.SetY}() change the respective axis with a new value. +-- The current Lat(itude), Alt(itude), Lon(gitude) values can also be retrieved with the methods @{#POINT_VEC2.GetLat}(), @{#POINT_VEC2.GetAlt}(), @{#POINT_VEC2.GetLon}() respectively. +-- The current axis values can be changed by using the methods @{#POINT_VEC2.AddX}(), @{#POINT_VEC2.AddAlt}(), @{#POINT_VEC2.AddY}() +-- to add or substract a value from the current respective axis value. +-- Note that the Set and Add methods return the current POINT_VEC2 object, so these manipulation methods can be chained... For example: +-- +-- local Vec2 = PointVec2:AddX( 100 ):AddY( 2000 ):GetVec2() +-- +-- === +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-03: POINT\_VEC3:**Explosion( ExplosionIntensity )** added. +-- 2017-03-03: POINT\_VEC3:**IlluminationBomb()** added. +-- +-- 2017-02-18: POINT\_VEC3:**NewFromVec2( Vec2, LandHeightAdd )** added. +-- +-- 2016-08-12: POINT\_VEC3:**Translate( Distance, Angle )** added. +-- +-- 2016-08-06: Made PointVec3 and Vec3, PointVec2 and Vec2 terminology used in the code consistent. +-- +-- * Replaced method _Point_Vec3() to **Vec3**() where the code manages a Vec3. Replaced all references to the method. +-- * Replaced method _Point_Vec2() to **Vec2**() where the code manages a Vec2. Replaced all references to the method. +-- * Replaced method Random_Point_Vec3() to **RandomVec3**() where the code manages a Vec3. Replaced all references to the method. +-- . +-- === +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- ### Contributions: +-- +-- @module Point + +--- The POINT_VEC3 class +-- @type POINT_VEC3 +-- @field #number x The x coordinate in 3D space. +-- @field #number y The y coordinate in 3D space. +-- @field #number z The z coordiante in 3D space. +-- @field Utilities.Utils#SMOKECOLOR SmokeColor +-- @field Utilities.Utils#FLARECOLOR FlareColor +-- @field #POINT_VEC3.RoutePointAltType RoutePointAltType +-- @field #POINT_VEC3.RoutePointType RoutePointType +-- @field #POINT_VEC3.RoutePointAction RoutePointAction +-- @extends Core.Base#BASE +POINT_VEC3 = { + ClassName = "POINT_VEC3", + Metric = true, + RoutePointAltType = { + BARO = "BARO", + }, + RoutePointType = { + TakeOffParking = "TakeOffParking", + TurningPoint = "Turning Point", + }, + RoutePointAction = { + FromParkingArea = "From Parking Area", + TurningPoint = "Turning Point", + }, +} + +--- The POINT_VEC2 class +-- @type POINT_VEC2 +-- @field Dcs.DCSTypes#Distance x The x coordinate in meters. +-- @field Dcs.DCSTypes#Distance y the y coordinate in meters. +-- @extends Core.Point#POINT_VEC3 +POINT_VEC2 = { + ClassName = "POINT_VEC2", +} + + +do -- POINT_VEC3 + +--- RoutePoint AltTypes +-- @type POINT_VEC3.RoutePointAltType +-- @field BARO "BARO" + +--- RoutePoint Types +-- @type POINT_VEC3.RoutePointType +-- @field TakeOffParking "TakeOffParking" +-- @field TurningPoint "Turning Point" + +--- RoutePoint Actions +-- @type POINT_VEC3.RoutePointAction +-- @field FromParkingArea "From Parking Area" +-- @field TurningPoint "Turning Point" + +-- Constructor. + +--- Create a new POINT_VEC3 object. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param Dcs.DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. +-- @param Dcs.DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:New( x, y, z ) + + local self = BASE:Inherit( self, BASE:New() ) + self.x = x + self.y = y + self.z = z + + return self +end + +--- Create a new POINT_VEC3 object from Vec2 coordinates. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 point. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:NewFromVec2( Vec2, LandHeightAdd ) + + local LandHeight = land.getHeight( Vec2 ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = self:New( Vec2.x, LandHeight, Vec2.y ) + + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC3 object from Vec3 coordinates. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec3 Vec3 The Vec3 point. +-- @return Core.Point#POINT_VEC3 self +function POINT_VEC3:NewFromVec3( Vec3 ) + + self = self:New( Vec3.x, Vec3.y, Vec3.z ) + self:F2( self ) + return self +end + + +--- Return the coordinates of the POINT_VEC3 in Vec3 format. +-- @param #POINT_VEC3 self +-- @return Dcs.DCSTypes#Vec3 The Vec3 coodinate. +function POINT_VEC3:GetVec3() + return { x = self.x, y = self.y, z = self.z } +end + +--- Return the coordinates of the POINT_VEC3 in Vec2 format. +-- @param #POINT_VEC3 self +-- @return Dcs.DCSTypes#Vec2 The Vec2 coodinate. +function POINT_VEC3:GetVec2() + return { x = self.x, y = self.z } +end + + +--- Return the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The x coodinate. +function POINT_VEC3:GetX() + return self.x +end + +--- Return the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The y coodinate. +function POINT_VEC3:GetY() + return self.y +end + +--- Return the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number The z coodinate. +function POINT_VEC3:GetZ() + return self.z +end + +--- Set the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetX( x ) + self.x = x + return self +end + +--- Set the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetY( y ) + self.y = y + return self +end + +--- Set the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number z The z coordinate. +-- @return #POINT_VEC3 +function POINT_VEC3:SetZ( z ) + self.z = z + return self +end + +--- Add to the x coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number x The x coordinate value to add to the current x coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddX( x ) + self.x = self.x + x + return self +end + +--- Add to the y coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number y The y coordinate value to add to the current y coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddY( y ) + self.y = self.y + y + return self +end + +--- Add to the z coordinate of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #number z The z coordinate value to add to the current z coodinate. +-- @return #POINT_VEC3 +function POINT_VEC3:AddZ( z ) + self.z = self.z +z + return self +end + +--- Return a random Vec2 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return Dcs.DCSTypes#Vec2 Vec2 +function POINT_VEC3:GetRandomVec2InRadius( OuterRadius, InnerRadius ) + self:F2( { OuterRadius, InnerRadius } ) + + local Theta = 2 * math.pi * math.random() + local Radials = math.random() + math.random() + if Radials > 1 then + Radials = 2 - Radials + end + + local RadialMultiplier + if InnerRadius and InnerRadius <= OuterRadius then + RadialMultiplier = ( OuterRadius - InnerRadius ) * Radials + InnerRadius + else + RadialMultiplier = OuterRadius * Radials + end + + local RandomVec2 + if OuterRadius > 0 then + RandomVec2 = { x = math.cos( Theta ) * RadialMultiplier + self:GetX(), y = math.sin( Theta ) * RadialMultiplier + self:GetZ() } + else + RandomVec2 = { x = self:GetX(), y = self:GetZ() } + end + + return RandomVec2 +end + +--- Return a random POINT_VEC2 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return #POINT_VEC2 +function POINT_VEC3:GetRandomPointVec2InRadius( OuterRadius, InnerRadius ) + self:F2( { OuterRadius, InnerRadius } ) + + return POINT_VEC2:NewFromVec2( self:GetRandomVec2InRadius( OuterRadius, InnerRadius ) ) +end + +--- Return a random Vec3 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return Dcs.DCSTypes#Vec3 Vec3 +function POINT_VEC3:GetRandomVec3InRadius( OuterRadius, InnerRadius ) + + local RandomVec2 = self:GetRandomVec2InRadius( OuterRadius, InnerRadius ) + local y = self:GetY() + math.random( InnerRadius, OuterRadius ) + local RandomVec3 = { x = RandomVec2.x, y = y, z = RandomVec2.y } + + return RandomVec3 +end + +--- Return a random POINT_VEC3 within an Outer Radius and optionally NOT within an Inner Radius of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance OuterRadius +-- @param Dcs.DCSTypes#Distance InnerRadius +-- @return #POINT_VEC3 +function POINT_VEC3:GetRandomPointVec3InRadius( OuterRadius, InnerRadius ) + + return POINT_VEC3:NewFromVec3( self:GetRandomVec3InRadius( OuterRadius, InnerRadius ) ) +end + + +--- Return a direction vector Vec3 from POINT_VEC3 to the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Vec3 DirectionVec3 The direction vector in Vec3 format. +function POINT_VEC3:GetDirectionVec3( TargetPointVec3 ) + return { x = TargetPointVec3:GetX() - self:GetX(), y = TargetPointVec3:GetY() - self:GetY(), z = TargetPointVec3:GetZ() - self:GetZ() } +end + +--- Get a correction in radians of the real magnetic north of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #number CorrectionRadians The correction in radians. +function POINT_VEC3:GetNorthCorrectionRadians() + local TargetVec3 = self:GetVec3() + local lat, lon = coord.LOtoLL(TargetVec3) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2( north_posit.z - TargetVec3.z, north_posit.x - TargetVec3.x ) +end + + +--- Return a direction in radians from the POINT_VEC3 using a direction vector in Vec3 format. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Vec3 DirectionVec3 The direction vector in Vec3 format. +-- @return #number DirectionRadians The direction in radians. +function POINT_VEC3:GetDirectionRadians( DirectionVec3 ) + local DirectionRadians = math.atan2( DirectionVec3.z, DirectionVec3.x ) + --DirectionRadians = DirectionRadians + self:GetNorthCorrectionRadians() + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi -- put dir in range of 0 to 2*pi ( the full circle ) + end + return DirectionRadians +end + +--- Return the 2D distance in meters between the target POINT_VEC3 and the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Distance Distance The distance in meters. +function POINT_VEC3:Get2DDistance( TargetPointVec3 ) + local TargetVec3 = TargetPointVec3:GetVec3() + local SourceVec3 = self:GetVec3() + return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 +end + +--- Return the 3D distance in meters between the target POINT_VEC3 and the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return Dcs.DCSTypes#Distance Distance The distance in meters. +function POINT_VEC3:Get3DDistance( TargetPointVec3 ) + local TargetVec3 = TargetPointVec3:GetVec3() + local SourceVec3 = self:GetVec3() + return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.y - SourceVec3.y ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 +end + +--- Provides a Bearing / Range string +-- @param #POINT_VEC3 self +-- @param #number AngleRadians The angle in randians +-- @param #number Distance The distance +-- @return #string The BR Text +function POINT_VEC3:ToStringBR( AngleRadians, Distance ) + + AngleRadians = UTILS.Round( UTILS.ToDegree( AngleRadians ), 0 ) + if self:IsMetric() then + Distance = UTILS.Round( Distance / 1000, 2 ) + else + Distance = UTILS.Round( UTILS.MetersToNM( Distance ), 2 ) + end + + local s = string.format( '%03d', AngleRadians ) .. ' for ' .. Distance + + s = s .. self:GetAltitudeText() -- When the POINT is a VEC2, there will be no altitude shown. + + return s +end + +--- Provides a Bearing / Range string +-- @param #POINT_VEC3 self +-- @param #number AngleRadians The angle in randians +-- @param #number Distance The distance +-- @return #string The BR Text +function POINT_VEC3:ToStringLL( acc, DMS ) + + acc = acc or 3 + local lat, lon = coord.LOtoLL( self:GetVec3() ) + return UTILS.tostringLL(lat, lon, acc, DMS) +end + +--- Return the altitude text of the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @return #string Altitude text. +function POINT_VEC3:GetAltitudeText() + if self:IsMetric() then + return ' at ' .. UTILS.Round( self:GetY(), 0 ) + else + return ' at ' .. UTILS.Round( UTILS.MetersToFeet( self:GetY() ), 0 ) + end +end + +--- Return a BR string from a POINT_VEC3 to the POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3 TargetPointVec3 The target POINT_VEC3. +-- @return #string The BR text. +function POINT_VEC3:GetBRText( TargetPointVec3 ) + local DirectionVec3 = self:GetDirectionVec3( TargetPointVec3 ) + local AngleRadians = self:GetDirectionRadians( DirectionVec3 ) + local Distance = self:Get2DDistance( TargetPointVec3 ) + return self:ToStringBR( AngleRadians, Distance ) +end + +--- Sets the POINT_VEC3 metric or NM. +-- @param #POINT_VEC3 self +-- @param #boolean Metric true means metric, false means NM. +function POINT_VEC3:SetMetric( Metric ) + self.Metric = Metric +end + +--- Gets if the POINT_VEC3 is metric or NM. +-- @param #POINT_VEC3 self +-- @return #boolean Metric true means metric, false means NM. +function POINT_VEC3:IsMetric() + return self.Metric +end + +--- Add a Distance in meters from the POINT_VEC3 horizontal plane, with the given angle, and calculate the new POINT_VEC3. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Distance Distance The Distance to be added in meters. +-- @param Dcs.DCSTypes#Angle Angle The Angle in degrees. +-- @return #POINT_VEC3 The new calculated POINT_VEC3. +function POINT_VEC3:Translate( Distance, Angle ) + local SX = self:GetX() + local SZ = self:GetZ() + local Radians = Angle / 180 * math.pi + local TX = Distance * math.cos( Radians ) + SX + local TZ = Distance * math.sin( Radians ) + SZ + + return POINT_VEC3:New( TX, self:GetY(), TZ ) +end + + + +--- Build an air type route point. +-- @param #POINT_VEC3 self +-- @param #POINT_VEC3.RoutePointAltType AltType The altitude type. +-- @param #POINT_VEC3.RoutePointType Type The route point type. +-- @param #POINT_VEC3.RoutePointAction Action The route point action. +-- @param Dcs.DCSTypes#Speed Speed Airspeed in km/h. +-- @param #boolean SpeedLocked true means the speed is locked. +-- @return #table The route point. +function POINT_VEC3:RoutePointAir( AltType, Type, Action, Speed, SpeedLocked ) + self:F2( { AltType, Type, Action, Speed, SpeedLocked } ) + + local RoutePoint = {} + RoutePoint.x = self.x + RoutePoint.y = self.z + RoutePoint.alt = self.y + RoutePoint.alt_type = AltType + + RoutePoint.type = Type + RoutePoint.action = Action + + RoutePoint.speed = Speed / 3.6 + RoutePoint.speed_locked = true + +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] + + + RoutePoint.task = {} + RoutePoint.task.id = "ComboTask" + RoutePoint.task.params = {} + RoutePoint.task.params.tasks = {} + + + return RoutePoint +end + +--- Build an ground type route point. +-- @param #POINT_VEC3 self +-- @param Dcs.DCSTypes#Speed Speed Speed in km/h. +-- @param #POINT_VEC3.RoutePointAction Formation The route point Formation. +-- @return #table The route point. +function POINT_VEC3:RoutePointGround( Speed, Formation ) + self:F2( { Formation, Speed } ) + + local RoutePoint = {} + RoutePoint.x = self.x + RoutePoint.y = self.z + + RoutePoint.action = Formation or "" + + + RoutePoint.speed = Speed / 3.6 + RoutePoint.speed_locked = true + +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] + + + RoutePoint.task = {} + RoutePoint.task.id = "ComboTask" + RoutePoint.task.params = {} + RoutePoint.task.params.tasks = {} + + + return RoutePoint +end + +--- Creates an explosion at the point of a certain intensity. +-- @param #POINT_VEC3 self +-- @param #number ExplosionIntensity +function POINT_VEC3:Explosion( ExplosionIntensity ) + self:F2( { ExplosionIntensity } ) + trigger.action.explosion( self:GetVec3(), ExplosionIntensity ) +end + +--- Creates an illumination bomb at the point. +-- @param #POINT_VEC3 self +function POINT_VEC3:IlluminationBomb() + self:F2() + trigger.action.illuminationBomb( self:GetVec3() ) +end + + +--- Smokes the point in a color. +-- @param #POINT_VEC3 self +-- @param Utilities.Utils#SMOKECOLOR SmokeColor +function POINT_VEC3:Smoke( SmokeColor ) + self:F2( { SmokeColor } ) + trigger.action.smoke( self:GetVec3(), SmokeColor ) +end + +--- Smoke the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeGreen() + self:F2() + self:Smoke( SMOKECOLOR.Green ) +end + +--- Smoke the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeRed() + self:F2() + self:Smoke( SMOKECOLOR.Red ) +end + +--- Smoke the POINT_VEC3 White. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeWhite() + self:F2() + self:Smoke( SMOKECOLOR.White ) +end + +--- Smoke the POINT_VEC3 Orange. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeOrange() + self:F2() + self:Smoke( SMOKECOLOR.Orange ) +end + +--- Smoke the POINT_VEC3 Blue. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeBlue() + self:F2() + self:Smoke( SMOKECOLOR.Blue ) +end + +--- Flares the point in a color. +-- @param #POINT_VEC3 self +-- @param Utilities.Utils#FLARECOLOR FlareColor +-- @param Dcs.DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:Flare( FlareColor, Azimuth ) + self:F2( { FlareColor } ) + trigger.action.signalFlare( self:GetVec3(), FlareColor, Azimuth and Azimuth or 0 ) +end + +--- Flare the POINT_VEC3 White. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.White, Azimuth ) +end + +--- Flare the POINT_VEC3 Yellow. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.Yellow, Azimuth ) +end + +--- Flare the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +-- @param Dcs.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( FLARECOLOR.Green, Azimuth ) +end + +--- Flare the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:FlareRed( Azimuth ) + self:F2( Azimuth ) + self:Flare( FLARECOLOR.Red, Azimuth ) +end + +end + +do -- POINT_VEC2 + + + +--- POINT_VEC2 constructor. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param Dcs.DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. +-- @param Dcs.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 Core.Point#POINT_VEC2 +function POINT_VEC2:New( x, y, LandHeightAdd ) + + local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC2 object from Vec2 coordinates. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 point. +-- @return Core.Point#POINT_VEC2 self +function POINT_VEC2:NewFromVec2( Vec2, LandHeightAdd ) + + local LandHeight = land.getHeight( Vec2 ) + + LandHeightAdd = LandHeightAdd or 0 + LandHeight = LandHeight + LandHeightAdd + + self = BASE:Inherit( self, POINT_VEC3:New( Vec2.x, LandHeight, Vec2.y ) ) + self:F2( self ) + + return self +end + +--- Create a new POINT_VEC2 object from Vec3 coordinates. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec3 Vec3 The Vec3 point. +-- @return Core.Point#POINT_VEC2 self +function POINT_VEC2:NewFromVec3( Vec3 ) + + local self = BASE:Inherit( self, BASE:New() ) + local Vec2 = { x = Vec3.x, y = Vec3.z } + + local LandHeight = land.getHeight( Vec2 ) + + self = BASE:Inherit( self, POINT_VEC3:New( Vec2.x, LandHeight, Vec2.y ) ) + self:F2( self ) + + return self +end + +--- Return the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The x coodinate. +function POINT_VEC2:GetX() + return self.x +end + +--- Return the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The y coodinate. +function POINT_VEC2:GetY() + return self.z +end + +--- Return the altitude (height) of the land at the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #number The land altitude. +function POINT_VEC2:GetAlt() + return land.getHeight( { x = self.x, y = self.z } ) +end + +--- Return Return the Lat(itude) coordinate of the POINT_VEC2 (ie: (parent)POINT_VEC3.x). +-- @param #POINT_VEC2 self +-- @return #number The x coodinate. +function POINT_VEC2:GetLat() + return self.x +end + +--- Return the Lon(gitude) coordinate of the POINT_VEC2 (ie: (parent)POINT_VEC3.z). +-- @param #POINT_VEC2 self +-- @return #number The y coodinate. +function POINT_VEC2:GetLon() + return self.z +end + +--- Set the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetX( x ) + self.x = x + return self +end + +--- Set the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetY( y ) + self.z = y + return self +end + +--- Set the Lat(itude) coordinate of the POINT_VEC2 (ie: POINT_VEC3.x). +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetLat( x ) + self.x = x + return self +end + +--- Set the altitude of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number Altitude The land altitude. If nothing (nil) is given, then the current land altitude is set. +-- @return #POINT_VEC2 +function POINT_VEC2:SetAlt( Altitude ) + self.y = Altitude or land.getHeight( { x = self.x, y = self.z } ) + return self +end + +--- Set the Lon(gitude) coordinate of the POINT_VEC2 (ie: POINT_VEC3.z). +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:SetLon( z ) + self.z = z + return self +end + +--- Add to the x coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number x The x coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:AddX( x ) + self.x = self.x + x + return self +end + +--- Add to the y coordinate of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param #number y The y coordinate. +-- @return #POINT_VEC2 +function POINT_VEC2:AddY( y ) + self.z = self.z + y + return self +end + +--- Add to the current land height an altitude. +-- @param #POINT_VEC2 self +-- @param #number Altitude The Altitude to add. If nothing (nil) is given, then the current land altitude is set. +-- @return #POINT_VEC2 +function POINT_VEC2:AddAlt( Altitude ) + self.y = land.getHeight( { x = self.x, y = self.z } ) + Altitude or 0 + return self +end + + + +--- Calculate the distance from a reference @{#POINT_VEC2}. +-- @param #POINT_VEC2 self +-- @param #POINT_VEC2 PointVec2Reference The reference @{#POINT_VEC2}. +-- @return Dcs.DCSTypes#Distance The distance from the reference @{#POINT_VEC2} in meters. +function POINT_VEC2:DistanceFromPointVec2( PointVec2Reference ) + self:F2( PointVec2Reference ) + + local Distance = ( ( PointVec2Reference:GetX() - self:GetX() ) ^ 2 + ( PointVec2Reference:GetY() - self:GetY() ) ^2 ) ^0.5 + + self:T2( Distance ) + return Distance +end + +--- Calculate the distance from a reference @{DCSTypes#Vec2}. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Vec2 Vec2Reference The reference @{DCSTypes#Vec2}. +-- @return Dcs.DCSTypes#Distance The distance from the reference @{DCSTypes#Vec2} in meters. +function POINT_VEC2:DistanceFromVec2( Vec2Reference ) + self:F2( Vec2Reference ) + + local Distance = ( ( Vec2Reference.x - self:GetX() ) ^ 2 + ( Vec2Reference.y - self:GetY() ) ^2 ) ^0.5 + + self:T2( Distance ) + return Distance +end + + +--- Return no text for the altitude of the POINT_VEC2. +-- @param #POINT_VEC2 self +-- @return #string Empty string. +function POINT_VEC2:GetAltitudeText() + return '' +end + +--- Add a Distance in meters from the POINT_VEC2 orthonormal plane, with the given angle, and calculate the new POINT_VEC2. +-- @param #POINT_VEC2 self +-- @param Dcs.DCSTypes#Distance Distance The Distance to be added in meters. +-- @param Dcs.DCSTypes#Angle Angle The Angle in degrees. +-- @return #POINT_VEC2 The new calculated POINT_VEC2. +function POINT_VEC2:Translate( Distance, Angle ) + local SX = self:GetX() + local SY = self:GetY() + local Radians = Angle / 180 * math.pi + local TX = Distance * math.cos( Radians ) + SX + local TY = Distance * math.sin( Radians ) + SY + + return POINT_VEC2:New( TX, TY ) +end + +end + + +--- **Core** - MESSAGE class takes are of the **real-time notifications** and **messages to players** during a simulation. +-- +-- ![Banner Image](..\Presentations\MESSAGE\Dia1.JPG) +-- +-- === +-- +-- # 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- +-- Message System to display Messages to Clients, Coalitions or All. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages can contain a category which is indicating the category of the message. +-- +-- ## 1.1) MESSAGE construction +-- +-- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- ## 1.2) Send messages to an audience +-- +-- Messages are sent: +-- +-- * To a @{Client} using @{Message#MESSAGE.ToClient}(). +-- * To a @{Group} using @{Message#MESSAGE.ToGroup}() +-- * To a coalition using @{Message#MESSAGE.ToCoalition}(). +-- * To the red coalition using @{Message#MESSAGE.ToRed}(). +-- * To the blue coalition using @{Message#MESSAGE.ToBlue}(). +-- * To all Players using @{Message#MESSAGE.ToAll}(). +-- +-- ## 1.3) Send conditionally to an audience +-- +-- Messages can be sent conditionally to an audience (when a condition is true): +-- +-- * To all players using @{Message#MESSAGE.ToAllIf}(). +-- * To a coalition using @{Message#MESSAGE.ToCoalitionIf}(). +-- +-- +-- @module Message + +--- The MESSAGE class +-- @type MESSAGE +-- @extends Core.Base#BASE +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 #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". +-- @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!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageDuration, MessageCategory } ) + + -- When no MessageCategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + if MessageCategory:sub(-1) ~= "\n" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = MessageCategory:sub( 1, -2 ) .. ":\n" + end + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration or 5 + 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 Wrapper.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 a Group. +-- @param #MESSAGE self +-- @param Wrapper.Group#GROUP Group is the Group. +-- @return #MESSAGE +function MESSAGE:ToGroup( Group ) + self:F( Group.GroupName ) + + if Group then + + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( Group:GetID(), 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 a Coalition if the given Condition is true. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +function MESSAGE:ToCoalitionIf( CoalitionSide, Condition ) + self:F( CoalitionSide ) + + if Condition and Condition == true then + self:ToCoalition( CoalitionSide ) + 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 + + +--- Sends a MESSAGE to all players if the given Condition is true. +-- @param #MESSAGE self +-- @return #MESSAGE +function MESSAGE:ToAllIf( Condition ) + + if Condition and Condition == true then + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + end + + return self +end +--- **Core** - The **FSM** (**F**inite **S**tate **M**achine) class and derived **FSM\_** classes +-- are design patterns allowing efficient (long-lasting) processes and workflows. +-- +-- ![Banner Image](..\Presentations\FSM\Dia1.JPG) +-- +-- === +-- +-- A FSM can only be in one of a finite number of states. +-- The machine is in only one state at a time; the state it is in at any given time is called the **current state**. +-- It can change from one state to another when initiated by an **__internal__ or __external__ triggering event**, which is called a **transition**. +-- An **FSM implementation** is defined by **a list of its states**, **its initial state**, and **the triggering events** for **each possible transition**. +-- An FSM implementation is composed out of **two parts**, a set of **state transition rules**, and an implementation set of **state transition handlers**, implementing those transitions. +-- +-- The FSM class supports a **hierarchical implementation of a Finite State Machine**, +-- that is, it allows to **embed existing FSM implementations in a master FSM**. +-- FSM hierarchies allow for efficient FSM re-use, **not having to re-invent the wheel every time again** when designing complex processes. +-- +-- ![Workflow Example](..\Presentations\FSM\Dia2.JPG) +-- +-- The above diagram shows a graphical representation of a FSM implementation for a **Task**, which guides a Human towards a Zone, +-- orders him to destroy x targets and account the results. +-- Other examples of ready made FSM could be: +-- +-- * route a plane to a zone flown by a human +-- * detect targets by an AI and report to humans +-- * account for destroyed targets by human players +-- * handle AI infantry to deploy from or embark to a helicopter or airplane or vehicle +-- * let an AI patrol a zone +-- +-- The **MOOSE framework** uses extensively the FSM class and derived FSM\_ classes, +-- because **the goal of MOOSE is to simplify mission design complexity for mission building**. +-- By efficiently utilizing the FSM class and derived classes, MOOSE allows mission designers to quickly build processes. +-- **Ready made FSM-based implementations classes** exist within the MOOSE framework that **can easily be re-used, +-- and tailored** by mission designers through **the implementation of Transition Handlers**. +-- Each of these FSM implementation classes start either with: +-- +-- * an acronym **AI\_**, which indicates an FSM implementation directing **AI controlled** @{GROUP} and/or @{UNIT}. These AI\_ classes derive the @{#FSM_CONTROLLABLE} class. +-- * an acronym **TASK\_**, which indicates an FSM implementation executing a @{TASK} executed by Groups of players. These TASK\_ classes derive the @{#FSM_TASK} class. +-- * an acronym **ACT\_**, which indicates an Sub-FSM implementation, directing **Humans actions** that need to be done in a @{TASK}, seated in a @{CLIENT} (slot) or a @{UNIT} (CA join). These ACT\_ classes derive the @{#FSM_PROCESS} class. +-- +-- Detailed explanations and API specifics are further below clarified and FSM derived class specifics are described in those class documentation sections. +-- +-- ##__Dislaimer:__ +-- The FSM class development is based on a finite state machine implementation made by Conroy Kyle. +-- The state machine can be found on [github](https://github.com/kyleconroy/lua-state-machine) +-- I've reworked this development (taken the concept), and created a **hierarchical state machine** out of it, embedded within the DCS simulator. +-- Additionally, I've added extendability and created an API that allows seamless FSM implementation. +-- +-- === +-- +-- # 1) @{#FSM} class, extends @{Base#BASE} +-- +-- ![Transition Rules and Transition Handlers and Event Triggers](..\Presentations\FSM\Dia3.JPG) +-- +-- The FSM class is the base class of all FSM\_ derived classes. It implements the main functionality to define and execute Finite State Machines. +-- The derived FSM\_ classes extend the Finite State Machine functionality to run a workflow process for a specific purpose or component. +-- +-- Finite State Machines have **Transition Rules**, **Transition Handlers** and **Event Triggers**. +-- +-- The **Transition Rules** define the "Process Flow Boundaries", that is, +-- the path that can be followed hopping from state to state upon triggered events. +-- If an event is triggered, and there is no valid path found for that event, +-- an error will be raised and the FSM will stop functioning. +-- +-- The **Transition Handlers** are special methods that can be defined by the mission designer, following a defined syntax. +-- If the FSM object finds a method of such a handler, then the method will be called by the FSM, passing specific parameters. +-- The method can then define its own custom logic to implement the FSM workflow, and to conduct other actions. +-- +-- The **Event Triggers** are methods that are defined by the FSM, which the mission designer can use to implement the workflow. +-- Most of the time, these Event Triggers are used within the Transition Handler methods, so that a workflow is created running through the state machine. +-- +-- As explained above, a FSM supports **Linear State Transitions** and **Hierarchical State Transitions**, and both can be mixed to make a comprehensive FSM implementation. +-- The below documentation has a seperate chapter explaining both transition modes, taking into account the **Transition Rules**, **Transition Handlers** and **Event Triggers**. +-- +-- ## 1.1) FSM Linear Transitions +-- +-- Linear Transitions are Transition Rules allowing an FSM to transition from one or multiple possible **From** state(s) towards a **To** state upon a Triggered **Event**. +-- The Lineair transition rule evaluation will always be done from the **current state** of the FSM. +-- If no valid Transition Rule can be found in the FSM, the FSM will log an error and stop. +-- +-- ### 1.1.1) FSM Transition Rules +-- +-- The FSM has transition rules that it follows and validates, as it walks the process. +-- These rules define when an FSM can transition from a specific state towards an other specific state upon a triggered event. +-- +-- The method @{#FSM.AddTransition}() specifies a new possible Transition Rule for the FSM. +-- +-- The initial state can be defined using the method @{#FSM.SetStartState}(). The default start state of an FSM is "None". +-- +-- Find below an example of a Linear Transition Rule definition for an FSM. +-- +-- local Fsm3Switch = FSM:New() -- #FsmDemo +-- FsmSwitch:SetStartState( "Off" ) +-- FsmSwitch:AddTransition( "Off", "SwitchOn", "On" ) +-- FsmSwitch:AddTransition( "Off", "SwitchMiddle", "Middle" ) +-- FsmSwitch:AddTransition( "On", "SwitchOff", "Off" ) +-- FsmSwitch:AddTransition( "Middle", "SwitchOff", "Off" ) +-- +-- The above code snippet models a 3-way switch Linear Transition: +-- +-- * It can be switched **On** by triggering event **SwitchOn**. +-- * It can be switched to the **Middle** position, by triggering event **SwitchMiddle**. +-- * It can be switched **Off** by triggering event **SwitchOff**. +-- * Note that once the Switch is **On** or **Middle**, it can only be switched **Off**. +-- +-- ### Some additional comments: +-- +-- Note that Linear Transition Rules **can be declared in a few variations**: +-- +-- * The From states can be **a table of strings**, indicating that the transition rule will be valid **if the current state** of the FSM will be **one of the given From states**. +-- * The From state can be a **"*"**, indicating that **the transition rule will always be valid**, regardless of the current state of the FSM. +-- +-- The below code snippet shows how the two last lines can be rewritten and consensed. +-- +-- FsmSwitch:AddTransition( { "On", "Middle" }, "SwitchOff", "Off" ) +-- +-- ### 1.1.2) Transition Handling +-- +-- ![Transition Handlers](..\Presentations\FSM\Dia4.JPG) +-- +-- An FSM transitions in **4 moments** when an Event is being triggered and processed. +-- The mission designer can define for each moment specific logic within methods implementations following a defined API syntax. +-- These methods define the flow of the FSM process; because in those methods the FSM Internal Events will be triggered. +-- +-- * To handle **State** transition moments, create methods starting with OnLeave or OnEnter concatenated with the State name. +-- * To handle **Event** transition moments, create methods starting with OnBefore or OnAfter concatenated with the Event name. +-- +-- **The OnLeave and OnBefore transition methods may return false, which will cancel the transition!** +-- +-- Transition Handler methods need to follow the above specified naming convention, but are also passed parameters from the FSM. +-- These parameters are on the correct order: From, Event, To: +-- +-- * From = A string containing the From state. +-- * Event = A string containing the Event name that was triggered. +-- * To = A string containing the To state. +-- +-- On top, each of these methods can have a variable amount of parameters passed. See the example in section [1.1.3](#1.1.3\)-event-triggers). +-- +-- ### 1.1.3) Event Triggers +-- +-- ![Event Triggers](..\Presentations\FSM\Dia5.JPG) +-- +-- The FSM creates for each Event two **Event Trigger methods**. +-- There are two modes how Events can be triggered, which is **synchronous** and **asynchronous**: +-- +-- * The method **FSM:Event()** triggers an Event that will be processed **synchronously** or **immediately**. +-- * The method **FSM:__Event( __seconds__ )** triggers an Event that will be processed **asynchronously** over time, waiting __x seconds__. +-- +-- The destinction between these 2 Event Trigger methods are important to understand. An asynchronous call will "log" the Event Trigger to be executed at a later time. +-- Processing will just continue. Synchronous Event Trigger methods are useful to change states of the FSM immediately, but may have a larger processing impact. +-- +-- The following example provides a little demonstration on the difference between synchronous and asynchronous Event Triggering. +-- +-- function FSM:OnAfterEvent( From, Event, To, Amount ) +-- self:T( { Amount = Amount } ) +-- end +-- +-- local Amount = 1 +-- FSM:__Event( 5, Amount ) +-- +-- Amount = Amount + 1 +-- FSM:Event( Text, Amount ) +-- +-- In this example, the **:OnAfterEvent**() Transition Handler implementation will get called when **Event** is being triggered. +-- Before we go into more detail, let's look at the last 4 lines of the example. +-- The last line triggers synchronously the **Event**, and passes Amount as a parameter. +-- The 3rd last line of the example triggers asynchronously **Event**. +-- Event will be processed after 5 seconds, and Amount is given as a parameter. +-- +-- The output of this little code fragment will be: +-- +-- * Amount = 2 +-- * Amount = 2 +-- +-- Because ... When Event was asynchronously processed after 5 seconds, Amount was set to 2. So be careful when processing and passing values and objects in asynchronous processing! +-- +-- ### 1.1.4) Linear Transition Example +-- +-- This example is fully implemented in the MOOSE test mission on GITHUB: [FSM-100 - Transition Explanation](https://github.com/FlightControl-Master/MOOSE/blob/master/Moose%20Test%20Missions/FSM%20-%20Finite%20State%20Machine/FSM-100%20-%20Transition%20Explanation/FSM-100%20-%20Transition%20Explanation.lua) +-- +-- It models a unit standing still near Batumi, and flaring every 5 seconds while switching between a Green flare and a Red flare. +-- The purpose of this example is not to show how exciting flaring is, but it demonstrates how a Linear Transition FSM can be build. +-- Have a look at the source code. The source code is also further explained below in this section. +-- +-- The example creates a new FsmDemo object from class FSM. +-- It will set the start state of FsmDemo to state **Green**. +-- Two Linear Transition Rules are created, where upon the event **Switch**, +-- the FsmDemo will transition from state **Green** to **Red** and from **Red** back to **Green**. +-- +-- ![Transition Example](..\Presentations\FSM\Dia6.JPG) +-- +-- local FsmDemo = FSM:New() -- #FsmDemo +-- FsmDemo:SetStartState( "Green" ) +-- FsmDemo:AddTransition( "Green", "Switch", "Red" ) +-- FsmDemo:AddTransition( "Red", "Switch", "Green" ) +-- +-- In the above example, the FsmDemo could flare every 5 seconds a Green or a Red flare into the air. +-- The next code implements this through the event handling method **OnAfterSwitch**. +-- +-- ![Transition Flow](..\Presentations\FSM\Dia7.JPG) +-- +-- function FsmDemo:OnAfterSwitch( From, Event, To, FsmUnit ) +-- self:T( { From, Event, To, FsmUnit } ) +-- +-- if From == "Green" then +-- FsmUnit:Flare(FLARECOLOR.Green) +-- else +-- if From == "Red" then +-- FsmUnit:Flare(FLARECOLOR.Red) +-- end +-- end +-- self:__Switch( 5, FsmUnit ) -- Trigger the next Switch event to happen in 5 seconds. +-- end +-- +-- FsmDemo:__Switch( 5, FsmUnit ) -- Trigger the first Switch event to happen in 5 seconds. +-- +-- The OnAfterSwitch implements a loop. The last line of the code fragment triggers the Switch Event within 5 seconds. +-- Upon the event execution (after 5 seconds), the OnAfterSwitch method is called of FsmDemo (cfr. the double point notation!!! ":"). +-- The OnAfterSwitch method receives from the FSM the 3 transition parameter details ( From, Event, To ), +-- and one additional parameter that was given when the event was triggered, which is in this case the Unit that is used within OnSwitchAfter. +-- +-- function FsmDemo:OnAfterSwitch( From, Event, To, FsmUnit ) +-- +-- For debugging reasons the received parameters are traced within the DCS.log. +-- +-- self:T( { From, Event, To, FsmUnit } ) +-- +-- The method will check if the From state received is either "Green" or "Red" and will flare the respective color from the FsmUnit. +-- +-- if From == "Green" then +-- FsmUnit:Flare(FLARECOLOR.Green) +-- else +-- if From == "Red" then +-- FsmUnit:Flare(FLARECOLOR.Red) +-- end +-- end +-- +-- It is important that the Switch event is again triggered, otherwise, the FsmDemo would stop working after having the first Event being handled. +-- +-- FsmDemo:__Switch( 5, FsmUnit ) -- Trigger the next Switch event to happen in 5 seconds. +-- +-- The below code fragment extends the FsmDemo, demonstrating multiple **From states declared as a table**, adding a **Linear Transition Rule**. +-- The new event **Stop** will cancel the Switching process. +-- The transition for event Stop can be executed if the current state of the FSM is either "Red" or "Green". +-- +-- local FsmDemo = FSM:New() -- #FsmDemo +-- FsmDemo:SetStartState( "Green" ) +-- FsmDemo:AddTransition( "Green", "Switch", "Red" ) +-- FsmDemo:AddTransition( "Red", "Switch", "Green" ) +-- FsmDemo:AddTransition( { "Red", "Green" }, "Stop", "Stopped" ) +-- +-- The transition for event Stop can also be simplified, as any current state of the FSM is valid. +-- +-- FsmDemo:AddTransition( "*", "Stop", "Stopped" ) +-- +-- So... When FsmDemo:Stop() is being triggered, the state of FsmDemo will transition from Red or Green to Stopped. +-- And there is no transition handling method defined for that transition, thus, no new event is being triggered causing the FsmDemo process flow to halt. +-- +-- ## 1.5) FSM Hierarchical Transitions +-- +-- Hierarchical Transitions allow to re-use readily available and implemented FSMs. +-- This becomes in very useful for mission building, where mission designers build complex processes and workflows, +-- combining smaller FSMs to one single FSM. +-- +-- The FSM can embed **Sub-FSMs** that will execute and return **multiple possible Return (End) States**. +-- Depending upon **which state is returned**, the main FSM can continue the flow **triggering specific events**. +-- +-- The method @{#FSM.AddProcess}() adds a new Sub-FSM to the FSM. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- YYYY-MM-DD: CLASS:**NewFunction**( Params ) replaces CLASS:_OldFunction_( Params ) +-- YYYY-MM-DD: CLASS:**NewFunction( Params )** added +-- +-- Hereby the change log: +-- +-- * 2016-12-18: Released. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * [**Pikey**](https://forums.eagle.ru/member.php?u=62835): Review of documentation & advice for improvements. +-- +-- ### Authors: +-- +-- * [**FlightControl**](https://forums.eagle.ru/member.php?u=89536): Design & Programming & documentation. +-- +-- @module Fsm + +do -- FSM + + --- FSM class + -- @type FSM + -- @extends Core.Base#BASE + FSM = { + ClassName = "FSM", + } + + --- Creates a new FSM object. + -- @param #FSM self + -- @return #FSM + function FSM:New( FsmT ) + + -- Inherits from BASE + self = BASE:Inherit( self, BASE:New() ) + + self.options = options or {} + self.options.subs = self.options.subs or {} + self.current = self.options.initial or 'none' + self.Events = {} + self.subs = {} + self.endstates = {} + + self.Scores = {} + + self._StartState = "none" + self._Transitions = {} + self._Processes = {} + self._EndStates = {} + self._Scores = {} + self._EventSchedules = {} + + self.CallScheduler = SCHEDULER:New( self ) + + + return self + end + + + --- Sets the start state of the FSM. + -- @param #FSM self + -- @param #string State A string defining the start state. + function FSM:SetStartState( State ) + + self._StartState = State + self.current = State + end + + + --- Returns the start state of the FSM. + -- @param #FSM self + -- @return #string A string containing the start state. + function FSM:GetStartState() + + return self._StartState or {} + end + + --- Add a new transition rule to the FSM. + -- A transition rule defines when and if the FSM can transition from a state towards another state upon a triggered event. + -- @param #FSM self + -- @param #table From Can contain a string indicating the From state or a table of strings containing multiple From states. + -- @param #string Event The Event name. + -- @param #string To The To state. + function FSM:AddTransition( From, Event, To ) + + local Transition = {} + Transition.From = From + Transition.Event = Event + Transition.To = To + + self:T( Transition ) + + self._Transitions[Transition] = Transition + self:_eventmap( self.Events, Transition ) + end + + + --- Returns a table of the transition rules defined within the FSM. + -- @return #table + function FSM:GetTransitions() + + return self._Transitions or {} + end + + --- Set the default @{Process} template with key ProcessName providing the ProcessClass and the process object when it is assigned to a @{Controllable} by the task. + -- @param #FSM self + -- @param #table From Can contain a string indicating the From state or a table of strings containing multiple From states. + -- @param #string Event The Event name. + -- @param Core.Fsm#FSM_PROCESS Process An sub-process FSM. + -- @param #table ReturnEvents A table indicating for which returned events of the SubFSM which Event must be triggered in the FSM. + -- @return Core.Fsm#FSM_PROCESS The SubFSM. + function FSM:AddProcess( From, Event, Process, ReturnEvents ) + self:T( { From, Event, Process, ReturnEvents } ) + + local Sub = {} + Sub.From = From + Sub.Event = Event + Sub.fsm = Process + Sub.StartEvent = "Start" + Sub.ReturnEvents = ReturnEvents + + self._Processes[Sub] = Sub + + self:_submap( self.subs, Sub, nil ) + + self:AddTransition( From, Event, From ) + + return Process + end + + + --- Returns a table of the SubFSM rules defined within the FSM. + -- @return #table + function FSM:GetProcesses() + + return self._Processes or {} + end + + function FSM:GetProcess( From, Event ) + + for ProcessID, Process in pairs( self:GetProcesses() ) do + if Process.From == From and Process.Event == Event then + return Process.fsm + end + end + + error( "Sub-Process from state " .. From .. " with event " .. Event .. " not found!" ) + end + + --- Adds an End state. + function FSM:AddEndState( State ) + + self._EndStates[State] = State + self.endstates[State] = State + end + + --- Returns the End states. + function FSM:GetEndStates() + + return self._EndStates or {} + end + + + --- Adds a score for the FSM to be achieved. + -- @param #FSM self + -- @param #string State is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). + -- @param #string ScoreText is a text describing the score that is given according the status. + -- @param #number Score is a number providing the score of the status. + -- @return #FSM self + function FSM:AddScore( State, ScoreText, Score ) + self:F( { State, ScoreText, Score } ) + + self._Scores[State] = self._Scores[State] or {} + self._Scores[State].ScoreText = ScoreText + self._Scores[State].Score = Score + + return self + end + + --- Adds a score for the FSM_PROCESS to be achieved. + -- @param #FSM self + -- @param #string From is the From State of the main process. + -- @param #string Event is the Event of the main process. + -- @param #string State is the state of the process when the score needs to be given. (See the relevant state descriptions of the process). + -- @param #string ScoreText is a text describing the score that is given according the status. + -- @param #number Score is a number providing the score of the status. + -- @return #FSM self + function FSM:AddScoreProcess( From, Event, State, ScoreText, Score ) + self:F( { From, Event, State, ScoreText, Score } ) + + local Process = self:GetProcess( From, Event ) + + Process._Scores[State] = Process._Scores[State] or {} + Process._Scores[State].ScoreText = ScoreText + Process._Scores[State].Score = Score + + self:T( Process._Scores ) + + return Process + end + + --- Returns a table with the scores defined. + function FSM:GetScores() + + return self._Scores or {} + end + + --- Returns a table with the Subs defined. + function FSM:GetSubs() + + return self.options.subs + end + + + function FSM:LoadCallBacks( CallBackTable ) + + for name, callback in pairs( CallBackTable or {} ) do + self[name] = callback + end + + end + + function FSM:_eventmap( Events, EventStructure ) + + local Event = EventStructure.Event + local __Event = "__" .. EventStructure.Event + self[Event] = self[Event] or self:_create_transition(Event) + self[__Event] = self[__Event] or self:_delayed_transition(Event) + self:T( "Added methods: " .. Event .. ", " .. __Event ) + Events[Event] = self.Events[Event] or { map = {} } + self:_add_to_map( Events[Event].map, EventStructure ) + + end + + function FSM:_submap( subs, sub, name ) + self:F( { sub = sub, name = name } ) + subs[sub.From] = subs[sub.From] or {} + subs[sub.From][sub.Event] = subs[sub.From][sub.Event] or {} + + -- Make the reference table weak. + -- setmetatable( subs[sub.From][sub.Event], { __mode = "k" } ) + + subs[sub.From][sub.Event][sub] = {} + subs[sub.From][sub.Event][sub].fsm = sub.fsm + subs[sub.From][sub.Event][sub].StartEvent = sub.StartEvent + subs[sub.From][sub.Event][sub].ReturnEvents = sub.ReturnEvents or {} -- these events need to be given to find the correct continue event ... if none given, the processing will stop. + subs[sub.From][sub.Event][sub].name = name + subs[sub.From][sub.Event][sub].fsmparent = self + end + + + function FSM:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, unpack( params ) ) end, ErrorHandler ) + return Value + end + end + + function FSM._handler( self, EventName, ... ) + + local Can, to = self:can( EventName ) + + if to == "*" then + to = self.current + end + + if Can then + local from = self.current + local params = { from, EventName, to, ... } + + if self.Controllable then + self:T( "FSM Transition for " .. self.Controllable.ControllableName .. " :" .. self.current .. " --> " .. EventName .. " --> " .. to ) + else + self:T( "FSM Transition:" .. self.current .. " --> " .. EventName .. " --> " .. to ) + end + + if ( self:_call_handler("onbefore" .. EventName, params, EventName ) == false ) + or ( self:_call_handler("OnBefore" .. EventName, params, EventName ) == false ) + or ( self:_call_handler("onleave" .. from, params, EventName ) == false ) + or ( self:_call_handler("OnLeave" .. from, params, EventName ) == false ) then + self:T( "Cancel Transition" ) + return false + end + + self.current = to + + local execute = true + + local subtable = self:_gosub( from, EventName ) + for _, sub in pairs( subtable ) do + --if sub.nextevent then + -- self:F2( "nextevent = " .. sub.nextevent ) + -- self[sub.nextevent]( self ) + --end + self:T( "calling sub start event: " .. sub.StartEvent ) + sub.fsm.fsmparent = self + sub.fsm.ReturnEvents = sub.ReturnEvents + sub.fsm[sub.StartEvent]( sub.fsm ) + execute = false + end + + local fsmparent, Event = self:_isendstate( to ) + if fsmparent and Event then + self:F2( { "end state: ", fsmparent, Event } ) + self:_call_handler("onenter" .. to, params, EventName ) + self:_call_handler("OnEnter" .. to, params, EventName ) + self:_call_handler("onafter" .. EventName, params, EventName ) + self:_call_handler("OnAfter" .. EventName, params, EventName ) + self:_call_handler("onstatechange", params, EventName ) + fsmparent[Event]( fsmparent ) + execute = false + end + + if execute then + -- only execute the call if the From state is not equal to the To state! Otherwise this function should never execute! + --if from ~= to then + self:_call_handler("onenter" .. to, params, EventName ) + self:_call_handler("OnEnter" .. to, params, EventName ) + --end + + self:_call_handler("onafter" .. EventName, params, EventName ) + self:_call_handler("OnAfter" .. EventName, params, EventName ) + + self:_call_handler("onstatechange", params, EventName ) + end + else + self:T( "Cannot execute transition." ) + self:T( { From = self.current, Event = EventName, To = to, Can = Can } ) + end + + return nil + end + + function FSM:_delayed_transition( EventName ) + return function( self, DelaySeconds, ... ) + self:T2( "Delayed Event: " .. EventName ) + local CallID = 0 + if DelaySeconds ~= nil then + if DelaySeconds < 0 then -- Only call the event ONCE! + DelaySeconds = math.abs( DelaySeconds ) + if not self._EventSchedules[EventName] then + CallID = self.CallScheduler:Schedule( self, self._handler, { EventName, ... }, DelaySeconds or 1 ) + self._EventSchedules[EventName] = CallID + else + -- reschedule + end + else + CallID = self.CallScheduler:Schedule( self, self._handler, { EventName, ... }, DelaySeconds or 1 ) + end + else + error( "FSM: An asynchronous event trigger requires a DelaySeconds parameter!!! This can be positive or negative! Sorry, but will not process this." ) + end + self:T2( { CallID = CallID } ) + end + end + + function FSM:_create_transition( EventName ) + return function( self, ... ) return self._handler( self, EventName , ... ) end + end + + function FSM:_gosub( ParentFrom, ParentEvent ) + local fsmtable = {} + if self.subs[ParentFrom] and self.subs[ParentFrom][ParentEvent] then + self:T( { ParentFrom, ParentEvent, self.subs[ParentFrom], self.subs[ParentFrom][ParentEvent] } ) + return self.subs[ParentFrom][ParentEvent] + else + return {} + end + end + + function FSM:_isendstate( Current ) + local FSMParent = self.fsmparent + if FSMParent and self.endstates[Current] then + self:T( { state = Current, endstates = self.endstates, endstate = self.endstates[Current] } ) + FSMParent.current = Current + local ParentFrom = FSMParent.current + self:T( ParentFrom ) + self:T( self.ReturnEvents ) + local Event = self.ReturnEvents[Current] + self:T( { ParentFrom, Event, self.ReturnEvents } ) + if Event then + return FSMParent, Event + else + self:T( { "Could not find parent event name for state ", ParentFrom } ) + end + end + + return nil + end + + function FSM:_add_to_map( Map, Event ) + self:F3( { Map, Event } ) + if type(Event.From) == 'string' then + Map[Event.From] = Event.To + else + for _, From in ipairs(Event.From) do + Map[From] = Event.To + end + end + self:T3( { Map, Event } ) + end + + function FSM:GetState() + return self.current + end + + + function FSM:Is( State ) + return self.current == State + end + + function FSM:is(state) + return self.current == state + end + + function FSM:can(e) + local Event = self.Events[e] + self:F3( { self.current, Event } ) + local To = Event and Event.map[self.current] or Event.map['*'] + return To ~= nil, To + end + + function FSM:cannot(e) + return not self:can(e) + end + +end + +do -- FSM_CONTROLLABLE + + --- FSM_CONTROLLABLE class + -- @type FSM_CONTROLLABLE + -- @field Wrapper.Controllable#CONTROLLABLE Controllable + -- @extends Core.Fsm#FSM + FSM_CONTROLLABLE = { + ClassName = "FSM_CONTROLLABLE", + } + + --- Creates a new FSM_CONTROLLABLE object. + -- @param #FSM_CONTROLLABLE self + -- @param #table FSMT Finite State Machine Table + -- @param Wrapper.Controllable#CONTROLLABLE Controllable (optional) The CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @return #FSM_CONTROLLABLE + function FSM_CONTROLLABLE:New( FSMT, Controllable ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New( FSMT ) ) -- Core.Fsm#FSM_CONTROLLABLE + + if Controllable then + self:SetControllable( Controllable ) + end + + self:AddTransition( "*", "Stop", "Stopped" ) + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnBeforeStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnAfterStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] Stop + -- @param #FSM_CONTROLLABLE self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] __Stop + -- @param #FSM_CONTROLLABLE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#FSM_CONTROLLABLE] OnLeaveStopped + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#FSM_CONTROLLABLE] OnEnterStopped + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + return self + end + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#FSM_CONTROLLABLE] OnAfterStop + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function FSM_CONTROLLABLE:OnAfterStop(Controllable,From,Event,To) + + -- Clear all pending schedules + self.CallScheduler:Clear() + end + + --- Sets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @param #FSM_CONTROLLABLE self + -- @param Wrapper.Controllable#CONTROLLABLE FSMControllable + -- @return #FSM_CONTROLLABLE + function FSM_CONTROLLABLE:SetControllable( FSMControllable ) + self:F( FSMControllable ) + self.Controllable = FSMControllable + end + + --- Gets the CONTROLLABLE object that the FSM_CONTROLLABLE governs. + -- @param #FSM_CONTROLLABLE self + -- @return Wrapper.Controllable#CONTROLLABLE + function FSM_CONTROLLABLE:GetControllable() + return self.Controllable + end + + function FSM_CONTROLLABLE:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self[handler] then + self:F3( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, self.Controllable, unpack( params ) ) end, ErrorHandler ) + return Value + --return self[handler]( self, self.Controllable, unpack( params ) ) + end + end + +end + +do -- FSM_PROCESS + + --- FSM_PROCESS class + -- @type FSM_PROCESS + -- @field Tasking.Task#TASK Task + -- @extends Core.Fsm#FSM_CONTROLLABLE + FSM_PROCESS = { + ClassName = "FSM_PROCESS", + } + + --- Creates a new FSM_PROCESS object. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:New( Controllable, Task ) + + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- Core.Fsm#FSM_PROCESS + + self:F( Controllable, Task ) + + self:Assign( Controllable, Task ) + + return self + end + + function FSM_PROCESS:Init( FsmProcess ) + self:T( "No Initialisation" ) + end + + function FSM_PROCESS:_call_handler( handler, params, EventName ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in FSM_PROCESS call handler:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + if self[handler] then + self:F3( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + local Result, Value = xpcall( function() return self[handler]( self, self.Controllable, self.Task, unpack( params ) ) end, ErrorHandler ) + return Value + --return self[handler]( self, self.Controllable, unpack( params ) ) + end + end + + --- Creates a new FSM_PROCESS object based on this FSM_PROCESS. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:Copy( Controllable, Task ) + self:T( { self:GetClassNameAndID() } ) + + + local NewFsm = self:New( Controllable, Task ) -- Core.Fsm#FSM_PROCESS + + NewFsm:Assign( Controllable, Task ) + + -- Polymorphic call to initialize the new FSM_PROCESS based on self FSM_PROCESS + NewFsm:Init( self ) + + -- Set Start State + NewFsm:SetStartState( self:GetStartState() ) + + -- Copy Transitions + for TransitionID, Transition in pairs( self:GetTransitions() ) do + NewFsm:AddTransition( Transition.From, Transition.Event, Transition.To ) + end + + -- Copy Processes + for ProcessID, Process in pairs( self:GetProcesses() ) do + self:E( { Process} ) + local FsmProcess = NewFsm:AddProcess( Process.From, Process.Event, Process.fsm:Copy( Controllable, Task ), Process.ReturnEvents ) + end + + -- Copy End States + for EndStateID, EndState in pairs( self:GetEndStates() ) do + self:T( EndState ) + NewFsm:AddEndState( EndState ) + end + + -- Copy the score tables + for ScoreID, Score in pairs( self:GetScores() ) do + self:T( Score ) + NewFsm:AddScore( ScoreID, Score.ScoreText, Score.Score ) + end + + return NewFsm + end + + --- Removes an FSM_PROCESS object. + -- @param #FSM_PROCESS self + -- @return #FSM_PROCESS + function FSM_PROCESS:Remove() + self:T( { self:GetClassNameAndID() } ) + + -- Copy Processes + for ProcessID, Process in pairs( self:GetProcesses() ) do + self:E( { Process} ) + Process.fsm:Remove() + Process.fsm = nil + end + + return self + end + + --- Sets the task of the process. + -- @param #FSM_PROCESS self + -- @param Tasking.Task#TASK Task + -- @return #FSM_PROCESS + function FSM_PROCESS:SetTask( Task ) + + self.Task = Task + + return self + end + + --- Gets the task of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.Task#TASK + function FSM_PROCESS:GetTask() + + return self.Task + end + + --- Gets the mission of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.Mission#MISSION + function FSM_PROCESS:GetMission() + + return self.Task.Mission + end + + --- Gets the mission of the process. + -- @param #FSM_PROCESS self + -- @return Tasking.CommandCenter#COMMANDCENTER + function FSM_PROCESS:GetCommandCenter() + + return self:GetTask():GetMission():GetCommandCenter() + end + +-- TODO: Need to check and fix that an FSM_PROCESS is only for a UNIT. Not for a GROUP. + + --- Send a message of the @{Task} to the Group of the Unit. +-- @param #FSM_PROCESS self +function FSM_PROCESS:Message( Message ) + self:F( { Message = Message } ) + + local CC = self:GetCommandCenter() + local TaskGroup = self.Controllable:GetGroup() + + local PlayerName = self.Controllable:GetPlayerName() -- Only for a unit + PlayerName = PlayerName and " (" .. PlayerName .. ")" or "" -- If PlayerName is nil, then keep it nil, otherwise add brackets. + local Callsign = self.Controllable:GetCallsign() + local Prefix = Callsign and " @ " .. Callsign .. PlayerName or "" + + Message = Prefix .. ": " .. Message + CC:MessageToGroup( Message, TaskGroup ) +end + + + + + --- Assign the process to a @{Unit} and activate the process. + -- @param #FSM_PROCESS self + -- @param Task.Tasking#TASK Task + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @return #FSM_PROCESS self + function FSM_PROCESS:Assign( ProcessUnit, Task ) + self:T( { Task, ProcessUnit } ) + + self:SetControllable( ProcessUnit ) + self:SetTask( Task ) + + --self.ProcessGroup = ProcessUnit:GetGroup() + + return self + end + + function FSM_PROCESS:onenterAssigned( ProcessUnit ) + self:T( "Assign" ) + + self.Task:Assign() + end + + function FSM_PROCESS:onenterFailed( ProcessUnit ) + self:T( "Failed" ) + + self.Task:Fail() + end + + function FSM_PROCESS:onenterSuccess( ProcessUnit ) + self:T( "Success" ) + + self.Task:Success() + end + + --- StateMachine callback function for a FSM_PROCESS + -- @param #FSM_PROCESS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function FSM_PROCESS:onstatechange( ProcessUnit, Task, From, Event, To, Dummy ) + self:T( { ProcessUnit, From, Event, To, Dummy, self:IsTrace() } ) + + if self:IsTrace() then + MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + end + + self:T( { Scores = self._Scores, To = To } ) + -- TODO: This needs to be reworked with a callback functions allocated within Task, and set within the mission script from the Task Objects... + if self._Scores[To] then + + local Task = self.Task + local Scoring = Task:GetScoring() + if Scoring then + Scoring:_AddMissionTaskScore( Task.Mission, ProcessUnit, self._Scores[To].ScoreText, self._Scores[To].Score ) + end + end + end + +end + +do -- FSM_TASK + + --- FSM_TASK class + -- @type FSM_TASK + -- @field Tasking.Task#TASK Task + -- @extends Core.Fsm#FSM + FSM_TASK = { + ClassName = "FSM_TASK", + } + + --- Creates a new FSM_TASK object. + -- @param #FSM_TASK self + -- @param #table FSMT + -- @param Tasking.Task#TASK Task + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #FSM_TASK + function FSM_TASK:New( FSMT ) + + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New( FSMT ) ) -- Core.Fsm#FSM_TASK + + self["onstatechange"] = self.OnStateChange + + return self + end + + function FSM_TASK:_call_handler( handler, params, EventName ) + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + return self[handler]( self, unpack( params ) ) + end + end + +end -- FSM_TASK + +do -- FSM_SET + + --- FSM_SET class + -- @type FSM_SET + -- @field Core.Set#SET_BASE Set + -- @extends Core.Fsm#FSM + FSM_SET = { + ClassName = "FSM_SET", + } + + --- Creates a new FSM_SET object. + -- @param #FSM_SET self + -- @param #table FSMT Finite State Machine Table + -- @param Set_SET_BASE FSMSet (optional) The Set object that the FSM_SET governs. + -- @return #FSM_SET + function FSM_SET:New( FSMSet ) + + -- Inherits from BASE + self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM_SET + + if FSMSet then + self:Set( FSMSet ) + end + + return self + end + + --- Sets the SET_BASE object that the FSM_SET governs. + -- @param #FSM_SET self + -- @param Core.Set#SET_BASE FSMSet + -- @return #FSM_SET + function FSM_SET:Set( FSMSet ) + self:F( FSMSet ) + self.Set = FSMSet + end + + --- Gets the SET_BASE object that the FSM_SET governs. + -- @param #FSM_SET self + -- @return Core.Set#SET_BASE + function FSM_SET:Get() + return self.Controllable + end + + function FSM_SET:_call_handler( handler, params, EventName ) + if self[handler] then + self:T( "Calling " .. handler ) + self._EventSchedules[EventName] = nil + return self[handler]( self, self.Set, unpack( params ) ) + end + end + +end -- FSM_SET + +--- This module contains the OBJECT class. +-- +-- 1) @{Object#OBJECT} class, extends @{Base#BASE} +-- =========================================================== +-- The @{Object#OBJECT} class is a wrapper class to handle the DCS Object objects: +-- +-- * Support all DCS Object APIs. +-- * Enhance with Object specific APIs not in the DCS Object API set. +-- * Manage the "state" of the DCS Object. +-- +-- 1.1) OBJECT constructor: +-- ------------------------------ +-- The OBJECT class provides the following functions to construct a OBJECT instance: +-- +-- * @{Object#OBJECT.New}(): Create a OBJECT instance. +-- +-- 1.2) OBJECT methods: +-- -------------------------- +-- The following methods can be used to identify an Object object: +-- +-- * @{Object#OBJECT.GetID}(): Returns the ID of the Object object. +-- +-- === +-- +-- @module Object + +--- The OBJECT class +-- @type OBJECT +-- @extends Core.Base#BASE +-- @field #string ObjectName The name of the Object. +OBJECT = { + ClassName = "OBJECT", + ObjectName = "", +} + +--- A DCSObject +-- @type DCSObject +-- @field id_ The ID of the controllable in DCS + +--- Create a new OBJECT from a DCSObject +-- @param #OBJECT self +-- @param Dcs.DCSWrapper.Object#Object ObjectName The Object name +-- @return #OBJECT self +function OBJECT:New( ObjectName, Test ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( ObjectName ) + self.ObjectName = ObjectName + + return self +end + + +--- Returns the unit's unique identifier. +-- @param Wrapper.Object#OBJECT self +-- @return Dcs.DCSWrapper.Object#Object.ID ObjectID +-- @return #nil The DCS Object is not existing or alive. +function OBJECT:GetID() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + + if DCSObject then + local ObjectID = DCSObject:getID() + return ObjectID + end + + return nil +end + +--- Destroys the OBJECT. +-- @param #OBJECT self +-- @return #nil The DCS Unit is not existing or alive. +function OBJECT:Destroy() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + + if DCSObject then + + DCSObject:destroy() + end + + return nil +end + + + + +--- This module contains the IDENTIFIABLE class. +-- +-- 1) @{#IDENTIFIABLE} class, extends @{Object#OBJECT} +-- =============================================================== +-- The @{#IDENTIFIABLE} class is a wrapper class to handle the DCS Identifiable objects: +-- +-- * Support all DCS Identifiable APIs. +-- * Enhance with Identifiable specific APIs not in the DCS Identifiable API set. +-- * Manage the "state" of the DCS Identifiable. +-- +-- 1.1) IDENTIFIABLE constructor: +-- ------------------------------ +-- The IDENTIFIABLE class provides the following functions to construct a IDENTIFIABLE instance: +-- +-- * @{#IDENTIFIABLE.New}(): Create a IDENTIFIABLE instance. +-- +-- 1.2) IDENTIFIABLE methods: +-- -------------------------- +-- The following methods can be used to identify an identifiable object: +-- +-- * @{#IDENTIFIABLE.GetName}(): Returns the name of the Identifiable. +-- * @{#IDENTIFIABLE.IsAlive}(): Returns if the Identifiable is alive. +-- * @{#IDENTIFIABLE.GetTypeName}(): Returns the type name of the Identifiable. +-- * @{#IDENTIFIABLE.GetCoalition}(): Returns the coalition of the Identifiable. +-- * @{#IDENTIFIABLE.GetCountry}(): Returns the country of the Identifiable. +-- * @{#IDENTIFIABLE.GetDesc}(): Returns the descriptor structure of the Identifiable. +-- +-- +-- === +-- +-- @module Identifiable + +--- The IDENTIFIABLE class +-- @type IDENTIFIABLE +-- @extends Wrapper.Object#OBJECT +-- @field #string IdentifiableName The name of the identifiable. +IDENTIFIABLE = { + ClassName = "IDENTIFIABLE", + IdentifiableName = "", +} + +local _CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Identifiable", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Create a new IDENTIFIABLE from a DCSIdentifiable +-- @param #IDENTIFIABLE self +-- @param Dcs.DCSWrapper.Identifiable#Identifiable IdentifiableName The DCS Identifiable name +-- @return #IDENTIFIABLE self +function IDENTIFIABLE:New( IdentifiableName ) + local self = BASE:Inherit( self, OBJECT:New( IdentifiableName ) ) + self:F2( IdentifiableName ) + self.IdentifiableName = IdentifiableName + return self +end + +--- Returns if the Identifiable is alive. +-- @param #IDENTIFIABLE self +-- @return #boolean true if Identifiable is alive. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:IsAlive() + self:F3( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableIsAlive = DCSIdentifiable:isExist() + return IdentifiableIsAlive + end + + return false +end + + + + +--- Returns DCS Identifiable object name. +-- The function provides access to non-activated objects too. +-- @param #IDENTIFIABLE self +-- @return #string The name of the DCS Identifiable. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetName() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableName = self.IdentifiableName + return IdentifiableName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + +--- Returns the type name of the DCS Identifiable. +-- @param #IDENTIFIABLE self +-- @return #string The type name of the DCS Identifiable. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetTypeName() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableTypeName = DCSIdentifiable:getTypeName() + self:T3( IdentifiableTypeName ) + return IdentifiableTypeName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + +--- Returns category of the DCS Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSWrapper.Object#Object.Category The category ID +function IDENTIFIABLE:GetCategory() + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + local ObjectCategory = DCSObject:getCategory() + self:T3( ObjectCategory ) + return ObjectCategory + end + + return nil +end + + +--- Returns the DCS Identifiable category name as defined within the DCS Identifiable Descriptor. +-- @param #IDENTIFIABLE self +-- @return #string The DCS Identifiable Category Name +function IDENTIFIABLE:GetCategoryName() + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCategoryName = _CategoryName[ self:GetDesc().category ] + return IdentifiableCategoryName + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Returns coalition of the Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSCoalitionWrapper.Object#coalition.side The side of the coalition. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetCoalition() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCoalition = DCSIdentifiable:getCoalition() + self:T3( IdentifiableCoalition ) + return IdentifiableCoalition + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Returns country of the Identifiable. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCScountry#country.id The country identifier. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetCountry() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableCountry = DCSIdentifiable:getCountry() + self:T3( IdentifiableCountry ) + return IdentifiableCountry + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + + + +--- Returns Identifiable descriptor. Descriptor type depends on Identifiable category. +-- @param #IDENTIFIABLE self +-- @return Dcs.DCSWrapper.Identifiable#Identifiable.Desc The Identifiable descriptor. +-- @return #nil The DCS Identifiable is not existing or alive. +function IDENTIFIABLE:GetDesc() + self:F2( self.IdentifiableName ) + + local DCSIdentifiable = self:GetDCSObject() + + if DCSIdentifiable then + local IdentifiableDesc = DCSIdentifiable:getDesc() + self:T2( IdentifiableDesc ) + return IdentifiableDesc + end + + self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" ) + return nil +end + +--- Gets the CallSign of the IDENTIFIABLE, which is a blank by default. +-- @param #IDENTIFIABLE self +-- @return #string The CallSign of the IDENTIFIABLE. +function IDENTIFIABLE:GetCallsign() + return '' +end + + +function IDENTIFIABLE:GetThreatLevel() + + return 0, "Scenery" +end +--- This module contains the POSITIONABLE class. +-- +-- 1) @{Positionable#POSITIONABLE} class, extends @{Identifiable#IDENTIFIABLE} +-- =========================================================== +-- The @{Positionable#POSITIONABLE} class is a wrapper class to handle the POSITIONABLE objects: +-- +-- * Support all DCS APIs. +-- * Enhance with POSITIONABLE specific APIs not in the DCS API set. +-- * Manage the "state" of the POSITIONABLE. +-- +-- 1.1) POSITIONABLE constructor: +-- ------------------------------ +-- The POSITIONABLE class provides the following functions to construct a POSITIONABLE instance: +-- +-- * @{Positionable#POSITIONABLE.New}(): Create a POSITIONABLE instance. +-- +-- 1.2) POSITIONABLE methods: +-- -------------------------- +-- The following methods can be used to identify an measurable object: +-- +-- * @{Positionable#POSITIONABLE.GetID}(): Returns the ID of the measurable object. +-- * @{Positionable#POSITIONABLE.GetName}(): Returns the name of the measurable object. +-- +-- === +-- +-- @module Positionable + +--- The POSITIONABLE class +-- @type POSITIONABLE +-- @extends Wrapper.Identifiable#IDENTIFIABLE +-- @field #string PositionableName The name of the measurable. +POSITIONABLE = { + ClassName = "POSITIONABLE", + PositionableName = "", +} + +--- A DCSPositionable +-- @type DCSPositionable +-- @field id_ The ID of the controllable in DCS + +--- Create a new POSITIONABLE from a DCSPositionable +-- @param #POSITIONABLE self +-- @param Dcs.DCSWrapper.Positionable#Positionable PositionableName The POSITIONABLE name +-- @return #POSITIONABLE self +function POSITIONABLE:New( PositionableName ) + local self = BASE:Inherit( self, IDENTIFIABLE:New( PositionableName ) ) + + self.PositionableName = PositionableName + return self +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Position The 3D position vectors of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPositionVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePosition = DCSPositionable:getPosition().p + self:T3( PositionablePosition ) + return PositionablePosition + end + + return nil +end + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec2 The 2D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVec2() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + + local PositionableVec2 = {} + PositionableVec2.x = PositionableVec3.x + PositionableVec2.y = PositionableVec3.z + + self:T2( PositionableVec2 ) + return PositionableVec2 + end + + return nil +end + +--- Returns a POINT_VEC2 object indicating the point in 2D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Core.Point#POINT_VEC2 The 2D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPointVec2() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + + local PositionablePointVec2 = POINT_VEC2:NewFromVec3( PositionableVec3 ) + + self:T2( PositionablePointVec2 ) + return PositionablePointVec2 + end + + return nil +end + +--- Returns a POINT_VEC3 object indicating the point in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Core.Point#POINT_VEC3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetPointVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = self:GetPositionVec3() + + local PositionablePointVec3 = POINT_VEC3:NewFromVec3( PositionableVec3 ) + + self:T2( PositionablePointVec3 ) + return PositionablePointVec3 + end + + return nil +end + + +--- Returns a random @{DCSTypes#Vec3} vector within a range, indicating the point in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetRandomVec3( Radius ) + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePointVec3 = DCSPositionable:getPosition().p + local PositionableRandomVec3 = {} + local angle = math.random() * math.pi*2; + PositionableRandomVec3.x = PositionablePointVec3.x + math.cos( angle ) * math.random() * Radius; + PositionableRandomVec3.y = PositionablePointVec3.y + PositionableRandomVec3.z = PositionablePointVec3.z + math.sin( angle ) * math.random() * Radius; + + self:T3( PositionableRandomVec3 ) + return PositionableRandomVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Vec3} vector indicating the 3D vector of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The 3D point vector of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVec3 = DCSPositionable:getPosition().p + self:T3( PositionableVec3 ) + return PositionableVec3 + end + + return nil +end + +--- Returns the altitude of the POSITIONABLE. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Distance The altitude of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetAltitude() + self:F2() + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePointVec3 = DCSPositionable:getPoint() --Dcs.DCSTypes#Vec3 + return PositionablePointVec3.y + end + + return nil +end + +--- Returns if the Positionable is located above a runway. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #boolean true if Positionable is above a runway. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:IsAboveRunway() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + + local Vec2 = self:GetVec2() + local SurfaceType = land.getSurfaceType( Vec2 ) + local IsAboveRunway = SurfaceType == land.SurfaceType.RUNWAY + + self:T2( IsAboveRunway ) + return IsAboveRunway + end + + return nil +end + + + +--- Returns the POSITIONABLE heading in degrees. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #number The POSTIONABLE heading +function POSITIONABLE:GetHeading() + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + + local PositionablePosition = DCSPositionable:getPosition() + if PositionablePosition then + local PositionableHeading = math.atan2( PositionablePosition.x.z, PositionablePosition.x.x ) + if PositionableHeading < 0 then + PositionableHeading = PositionableHeading + 2 * math.pi + end + PositionableHeading = PositionableHeading * 180 / math.pi + self:T2( PositionableHeading ) + return PositionableHeading + end + end + + return nil +end + + +--- Returns true if the POSITIONABLE is in the air. +-- Polymorphic, is overridden in GROUP and UNIT. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #boolean true if in the air. +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:InAir() + self:F2( self.PositionableName ) + + return nil +end + + +--- Returns the POSITIONABLE velocity vector. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Vec3 The velocity vector +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVelocity() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionableVelocityVec3 = DCSPositionable:getVelocity() + self:T3( PositionableVelocityVec3 ) + return PositionableVelocityVec3 + end + + return nil +end + +--- Returns the POSITIONABLE velocity in km/h. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return #number The velocity in km/h +-- @return #nil The POSITIONABLE is not existing or alive. +function POSITIONABLE:GetVelocityKMH() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local VelocityVec3 = self:GetVelocity() + local Velocity = ( VelocityVec3.x ^ 2 + VelocityVec3.y ^ 2 + VelocityVec3.z ^ 2 ) ^ 0.5 -- in meters / sec + local Velocity = Velocity * 3.6 -- now it is in km/h. + self:T3( Velocity ) + return Velocity + end + + return nil +end + +--- Returns a message with the callsign embedded (if there is one). +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +-- @return Core.Message#MESSAGE +function POSITIONABLE:GetMessage( Message, Duration, Name ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + Name = Name or self:GetTypeName() + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. Name .. ")" ) + 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToAll( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToAll() + end + + return nil +end + +--- Send a message to a 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTYpes#Duration Duration The duration of the message. +-- @param Dcs.DCScoalition#coalition MessageCoalition The Coalition receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToCoalition( Message, Duration, MessageCoalition, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToCoalition( MessageCoalition ) + 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTYpes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToRed( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToBlue( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Client#CLIENT Client The client object receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToClient( Message, Duration, Client, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToClient( Client ) + end + + return nil +end + +--- Send a message to a @{Group}. +-- 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Group#GROUP MessageGroup The GROUP object receiving the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:MessageToGroup( Message, Duration, MessageGroup, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + if DCSObject:isExist() then + self:GetMessage( Message, Duration, Name ):ToGroup( MessageGroup ) + end + end + + return nil +end + +--- Send a message to the players in the @{Group}. +-- 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 #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. +function POSITIONABLE:Message( Message, Duration, Name ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration, Name ):ToGroup( self ) + end + + return nil +end + + + + + +--- This module contains the CONTROLLABLE class. +-- +-- 1) @{Controllable#CONTROLLABLE} class, extends @{Positionable#POSITIONABLE} +-- =========================================================== +-- The @{Controllable#CONTROLLABLE} class is a wrapper class to handle the DCS Controllable objects: +-- +-- * Support all DCS Controllable APIs. +-- * Enhance with Controllable specific APIs not in the DCS Controllable API set. +-- * Handle local Controllable Controller. +-- * Manage the "state" of the DCS Controllable. +-- +-- 1.1) CONTROLLABLE constructor +-- ----------------------------- +-- The CONTROLLABLE class provides the following functions to construct a CONTROLLABLE instance: +-- +-- * @{#CONTROLLABLE.New}(): Create a CONTROLLABLE instance. +-- +-- 1.2) CONTROLLABLE task methods +-- ------------------------------ +-- Several controllable 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 @{Controllable#CONTROLLABLE.PushTask} or @{Controllable#SetTask} method to assign the task to the CONTROLLABLE. +-- Tasks are specific for the category of the CONTROLLABLE, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which controllable 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 controllable 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: +-- +-- * @{#CONTROLLABLE.TaskAttackGroup}: (AIR) Attack a Controllable. +-- * @{#CONTROLLABLE.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#CONTROLLABLE.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#CONTROLLABLE.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#CONTROLLABLE.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#CONTROLLABLE.TaskEmbarking}: (AIR) Move the controllable to a Vec2 Point, wait for a defined duration and embark a controllable. +-- * @{#CONTROLLABLE.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#CONTROLLABLE.TaskEscort}: (AIR) Escort another airborne controllable. +-- * @{#CONTROLLABLE.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction. +-- * @{#CONTROLLABLE.TaskFireAtPoint}: (GROUND) Fire some or all ammunition at a VEC2 point. +-- * @{#CONTROLLABLE.TaskFollow}: (AIR) Following another airborne controllable. +-- * @{#CONTROLLABLE.TaskHold}: (GROUND) Hold ground controllable from moving. +-- * @{#CONTROLLABLE.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the controllable. +-- * @{#CONTROLLABLE.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#CONTROLLABLE.TaskLandAtZone}: (AIR) Land the controllable at a @{Zone#ZONE_RADIUS). +-- * @{#CONTROLLABLE.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the controllable at a specified alititude. +-- * @{#CONTROLLABLE.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#CONTROLLABLE.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#CONTROLLABLE.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#CONTROLLABLE.TaskRouteToVec2}: (AIR + GROUND) Make the Controllable move to a given point. +-- * @{#CONTROLLABLE.TaskRouteToVec3}: (AIR + GROUND) Make the Controllable move to a given point. +-- * @{#CONTROLLABLE.TaskRouteToZone}: (AIR + GROUND) Route the controllable to a given zone. +-- * @{#CONTROLLABLE.TaskReturnToBase}: (AIR) Route the controllable to an airbase. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the controllable (using its sensors) before the task can be executed: +-- +-- * @{#CONTROLLABLE.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#CONTROLLABLE.EnRouteTaskEngageControllable}: (AIR) Engaging a controllable. The task does not assign the target controllable to the unit/controllable to attack now; it just allows the unit/controllable to engage the target controllable as well as other assigned targets. +-- * @{#CONTROLLABLE.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#CONTROLLABLE.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#CONTROLLABLE.EnRouteTaskFAC}: (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose a targets (enemy ground controllable) around as well as other assigned targets. +-- * @{#CONTROLLABLE.EnRouteTaskFAC_EngageControllable}: (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose the target (enemy ground controllable) as well as other assigned targets. +-- * @{#CONTROLLABLE.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: +-- +-- * @{#CONTROLLABLE.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#CONTROLLABLE.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#CONTROLLABLE.TaskCondition}: Return a condition section for a controlled task. +-- * @{#CONTROLLABLE.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from controllable templates +-- +-- Controllable templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a controllable and assign it to another: +-- +-- * @{#CONTROLLABLE.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) CONTROLLABLE Command methods +-- -------------------------- +-- Controllable **command methods** prepare the execution of commands using the @{#CONTROLLABLE.SetCommand} method: +-- +-- * @{#CONTROLLABLE.CommandDoScript}: Do Script command. +-- * @{#CONTROLLABLE.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) CONTROLLABLE Option methods +-- ------------------------- +-- Controllable **Option methods** change the behaviour of the Controllable while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#CONTROLLABLE.OptionROEWeaponFree} +-- * @{#CONTROLLABLE.OptionROEOpenFire} +-- * @{#CONTROLLABLE.OptionROEReturnFire} +-- * @{#CONTROLLABLE.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific controllable, use: +-- +-- * @{#CONTROLLABLE.OptionROEWeaponFreePossible} +-- * @{#CONTROLLABLE.OptionROEOpenFirePossible} +-- * @{#CONTROLLABLE.OptionROEReturnFirePossible} +-- * @{#CONTROLLABLE.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#CONTROLLABLE.OptionROTNoReaction} +-- * @{#CONTROLLABLE.OptionROTPassiveDefense} +-- * @{#CONTROLLABLE.OptionROTEvadeFire} +-- * @{#CONTROLLABLE.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific controllable, use: +-- +-- * @{#CONTROLLABLE.OptionROTNoReactionPossible} +-- * @{#CONTROLLABLE.OptionROTPassiveDefensePossible} +-- * @{#CONTROLLABLE.OptionROTEvadeFirePossible} +-- * @{#CONTROLLABLE.OptionROTVerticalPossible} +-- +-- === +-- +-- @module Controllable + +--- The CONTROLLABLE class +-- @type CONTROLLABLE +-- @extends Wrapper.Positionable#POSITIONABLE +-- @field Dcs.DCSWrapper.Controllable#Controllable DCSControllable The DCS controllable class. +-- @field #string ControllableName The name of the controllable. +CONTROLLABLE = { + ClassName = "CONTROLLABLE", + ControllableName = "", + WayPointFunctions = {}, +} + +--- Create a new CONTROLLABLE from a DCSControllable +-- @param #CONTROLLABLE self +-- @param Dcs.DCSWrapper.Controllable#Controllable ControllableName The DCS Controllable name +-- @return #CONTROLLABLE self +function CONTROLLABLE:New( ControllableName ) + local self = BASE:Inherit( self, POSITIONABLE:New( ControllableName ) ) + self:F2( ControllableName ) + self.ControllableName = ControllableName + + self.TaskScheduler = SCHEDULER:New( self ) + return self +end + +-- DCS Controllable methods support. + +--- Get the controller for the CONTROLLABLE. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSController#Controller +function CONTROLLABLE:_GetController() + self:F2( { self.ControllableName } ) + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local ControllableController = DCSControllable:getController() + self:T3( ControllableController ) + return ControllableController + end + + return nil +end + +-- Get methods + +--- Returns the UNITs wrappers of the DCS Units of the Controllable (default is a GROUP). +-- @param #CONTROLLABLE self +-- @return #list The UNITs wrappers. +function CONTROLLABLE:GetUnits() + self:F2( { self.ControllableName } ) + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local DCSUnits = DCSControllable: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 health. Dead controllables have health <= 1.0. +-- @param #CONTROLLABLE self +-- @return #number The controllable health value (unit or group average). +-- @return #nil The controllable is not existing or alive. +function CONTROLLABLE:GetLife() + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local UnitLife = 0 + local Units = self:GetUnits() + if #Units == 1 then + local Unit = Units[1] -- Wrapper.Unit#UNIT + UnitLife = Unit:GetLife() + else + local UnitLifeTotal = 0 + for UnitID, Unit in pairs( Units ) do + local Unit = Unit -- Wrapper.Unit#UNIT + UnitLifeTotal = UnitLifeTotal + Unit:GetLife() + end + UnitLife = UnitLifeTotal / #Units + end + return UnitLife + end + + return nil +end + + + +-- Tasks + +--- Clear all tasks from the controllable. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE +function CONTROLLABLE:ClearTasks() + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:resetTask() + return self + end + + return nil +end + + +--- Popping current Task from the controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:PopCurrentTask() + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + + -- When a controllable SPAWNs, it takes about a second to get the controllable in the simulator. Setting tasks to unspawned controllables provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Controllable. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + self.TaskScheduler:Schedule( 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 controllable. +-- @param #CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local Controller = self:_GetController() + self:T3( Controller ) + + -- When a controllable SPAWNs, it takes about a second to get the controllable in the simulator. Setting tasks to unspawned controllables provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Controllable. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + Controller:setTask( DCSTask ) + else + self.TaskScheduler:Schedule( Controller, Controller.setTask, { DCSTask }, WaitTime ) + end + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param Dcs.DCSTime#Time duration +-- @param #number lastWayPoint +-- return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSTasking.Task#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSTasking.Task#TaskArray DCSTasks Array of @{DCSTasking.Task#Task} +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + for TaskID, Task in ipairs( DCSTasks ) do + self:E( Task ) + end + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSCommand#Command DCSCommand +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param Dcs.DCSCommand#Command DCSCommand +-- @return #CONTROLLABLE self +function CONTROLLABLE:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #CONTROLLABLE self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return Dcs.DCSTasking.Task#Task +-- @usage +-- --- This test demonstrates the use(s) of the SwitchWayPoint method of the GROUP class. +-- HeliGroup = GROUP:FindByName( "Helicopter" ) +-- +-- --- Route the helicopter back to the FARP after 60 seconds. +-- -- We use the SCHEDULER class to do this. +-- SCHEDULER:New( nil, +-- function( HeliGroup ) +-- local CommandRTB = HeliGroup:CommandSwitchWayPoint( 2, 8 ) +-- HeliGroup:SetCommand( CommandRTB ) +-- end, { HeliGroup }, 90 +-- ) +function CONTROLLABLE:CommandSwitchWayPoint( FromWayPoint, ToWayPoint ) + self:F2( { FromWayPoint, ToWayPoint } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + +--- Perform stop route command +-- @param #CONTROLLABLE self +-- @param #boolean StopRoute +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:CommandStopRoute( StopRoute, Index ) + self:F2( { StopRoute, Index } ) + + local CommandStopRoute = { + id = 'StopRoute', + params = { + value = StopRoute, + }, + } + + self:T3( { CommandStopRoute } ) + return CommandStopRoute +end + + +-- TASKS FOR AIR CONTROLLABLES + + +--- (AIR) Attack a Controllable. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup The Controllable 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired attack start altitude. Controllable/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/controllable will choose closest altitude to the desired attack start altitude. If the desired altitude is defined controllable/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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.ControllableName, 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 #CONTROLLABLE self +-- @param Wrapper.Unit#UNIT AttackUnit The UNIT. +-- @param #boolean GroupAttack (optional) If true, all units in the group will attack the Unit when found. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/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 ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackUnit( AttackUnit, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack ) + self:F2( { self.ControllableName, AttackUnit, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack } ) + + local DCSTask + DCSTask = { + id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + groupAttack = GroupAttack or false, + visible = Visible or false, + expend = WeaponExpend or "Auto", + directionEnabled = Direction and true or false, + direction = Direction, + altitudeEnabled = Altitude and true or false, + altitude = Altitude or 30, + attackQtyLimit = AttackQty and true or false, + attackQty = AttackQty, + }, + } + + self:E( DCSTask ) + + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable 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 Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskBombing( Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = Vec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + 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 #CONTROLLABLE self +-- @param Dcs.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 #CONTROLLABLE self +function CONTROLLABLE:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.ControllableName, 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 controllable at a specified alititude. +-- @param #CONTROLLABLE self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.ControllableName, Altitude, Speed } ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local ControllablePoint = self:GetVec2() + return self:TaskOrbitCircleAtVec2( ControllablePoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the controllable. +-- @param #CONTROLLABLE self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskHoldPosition() + self:F2( { self.ControllableName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskAttackMapObject( Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Vec2, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = Vec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #CONTROLLABLE self +-- @param Wrapper.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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack ) + self:F2( { self.ControllableName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, ControllableAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- controllableAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + controllableAttack = ControllableAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskRefueling() + self:F2( { self.ControllableName } ) + +-- 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskLandAtVec2( Point, Duration ) + self:F2( { self.ControllableName, 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 controllable at a @{Zone#ZONE_RADIUS). +-- @param #CONTROLLABLE self +-- @param Core.Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #CONTROLLABLE self +function CONTROLLABLE:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.ControllableName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomVec2() + else + Point = Zone:GetVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne controllable. +-- The unit / controllable will follow lead unit of another controllable, wingmens of both controllables will continue following their leaders. +-- If another controllable is on land the unit / controllable will orbit around. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE FollowControllable The controllable to be followed. +-- @param Dcs.DCSTypes#Vec3 Vec3 Position of the unit / lead unit of the controllable relative lead unit of another controllable in frame reference oriented by course of lead unit of another controllable. If another controllable is on land the unit / controllable will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another controllable. Once reached the unit / controllable Follow task is finished. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFollow( FollowControllable, Vec3, LastWaypointIndex ) + self:F2( { self.ControllableName, FollowControllable, Vec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = false + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { + id = 'Follow', + params = { + groupId = FollowControllable:GetID(), + pos = Vec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne controllable. +-- The unit / controllable will follow lead unit of another controllable, wingmens of both controllables will continue following their leaders. +-- The unit / controllable will also protect that controllable from threats of specified types. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE EscortControllable The controllable to be escorted. +-- @param Dcs.DCSTypes#Vec3 Vec3 Position of the unit / lead unit of the controllable relative lead unit of another controllable in frame reference oriented by course of lead unit of another controllable. If another controllable is on land the unit / controllable will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another controllable. Once reached the unit / controllable Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted controllable to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param Dcs.DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskEscort( FollowControllable, Vec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.ControllableName, FollowControllable, Vec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = false + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Escort', + params = { + groupId = FollowControllable:GetID(), + pos = Vec3, + 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 The point to fire at. +-- @param Dcs.DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @param #number AmmoCount (optional) Quantity of ammunition to expand (omit to fire until ammunition is depleted). +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFireAtPoint( Vec2, Radius, AmmoCount ) + self:F2( { self.ControllableName, Vec2, Radius, AmmoCount } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- expendQty = number, + -- expendQtyEnabled = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = Vec2, + radius = Radius, + expendQty = 100, -- dummy value + expendQtyEnabled = false, + } + } + + if AmmoCount then + DCSTask.params.expendQty = AmmoCount + DCSTask.params.expendQtyEnabled = true + end + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground controllable from moving. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskHold() + self:F2( { self.ControllableName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/CONTROLLABLES + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup Target CONTROLLABLE. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.ControllableName, 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-ACT_ROUTE TASKS FOR AIRBORNE CONTROLLABLES + +--- (AIR) Engaging targets of defined types. +-- @param #CONTROLLABLE self +-- @param Dcs.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 Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.ControllableName, 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 #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Vec2 2D-coordinates of the zone. +-- @param Dcs.DCSTypes#Distance Radius Radius of the zone. +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageTargets( Vec2, Radius, TargetTypes, Priority ) + self:F2( { self.ControllableName, Vec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = Vec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a controllable. The task does not assign the target controllable to the unit/controllable to attack now; it just allows the unit/controllable to engage the target controllable as well as other assigned targets. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup The Controllable 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 Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired attack start altitude. Controllable/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/controllable will choose closest altitude to the desired attack start altitude. If the desired altitude is defined controllable/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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.ControllableName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageControllable = { + -- id = 'EngageControllable ', + -- 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 = 'EngageControllable', + 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) Search and attack the Unit. +-- @param #CONTROLLABLE self +-- @param Wrapper.Unit#UNIT EngageUnit The UNIT. +-- @param #number Priority (optional) 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 #boolean GroupAttack (optional) If true, all units in the group will attack the Unit when found. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +-- @param Dcs.DCSTypes#Distance Altitude (optional) Desired altitude to perform the unit engagement. +-- @param #boolean Visible (optional) Unit must be visible. +-- @param #boolean ControllableAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the controllable. Has effect only if the task is assigned to a controllable, not to a single aircraft. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEngageUnit( EngageUnit, Priority, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack ) + self:F2( { self.ControllableName, EngageUnit, Priority, GroupAttack, WeaponExpend, AttackQty, Direction, Altitude, Visible, ControllableAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- controllableAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = EngageUnit:GetID(), + priority = Priority or 1, + groupAttack = GroupAttack or false, + visible = Visible or false, + expend = WeaponExpend or "Auto", + directionEnabled = Direction and true or false, + direction = Direction, + altitudeEnabled = Altitude and true or false, + altitude = Altitude, + attackQtyLimit = AttackQty and true or false, + attackQty = AttackQty, + controllableAttack = ControllableAttack, + }, + }, + + 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 #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskAWACS( ) + self:F2( { self.ControllableName } ) + +-- 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 #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskTanker( ) + self:F2( { self.ControllableName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/controllables + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #CONTROLLABLE self +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskEWR( ) + self:F2( { self.ControllableName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/controllables + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose the target (enemy ground controllable) 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 controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Wrapper.Controllable#CONTROLLABLE AttackGroup Target CONTROLLABLE. +-- @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 Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.ControllableName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageControllable = { +-- id = 'FAC_EngageControllable', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageControllable', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the controllable/unit a FAC and lets the FAC to choose a targets (enemy ground controllable) 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 controllable lead unit will be a FAC. +-- @param #CONTROLLABLE self +-- @param Dcs.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 Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.ControllableName, 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 controllable to a Vec2 Point, wait for a defined duration and embark a controllable. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #CONTROLLABLE EmbarkingControllable The controllable to be embarked. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure +function CONTROLLABLE:TaskEmbarking( Point, Duration, EmbarkingControllable ) + self:F2( { self.ControllableName, Point, Duration, EmbarkingControllable.DCSControllable } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + controllablesForEmbarking = { EmbarkingControllable.ControllableID }, + 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 controllable when arrived within a defined Radius. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return Dcs.DCSTasking.Task#Task The DCS task structure. +function CONTROLLABLE:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.ControllableName, Point, Radius } ) + + local DCSTask --Dcs.DCSTasking.Task#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 #CONTROLLABLE self +-- @param #table TaskMission A table containing the mission task. +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE: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 #CONTROLLABLE self +-- @param #table Points A table of route points. +-- @return Dcs.DCSTasking.Task#Task +function CONTROLLABLE:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Controllable move to fly to a given point. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #CONTROLLABLE self +function CONTROLLABLE:RouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local ControllablePoint = self:GetUnit( 1 ):GetVec2() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.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 Controllable move to a given point. +-- @param #CONTROLLABLE self +-- @param Dcs.DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #CONTROLLABLE self +function CONTROLLABLE:RouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local ControllableVec3 = self:GetUnit( 1 ):GetVec3() + + local PointFrom = {} + PointFrom.x = ControllableVec3.x + PointFrom.y = ControllableVec3.z + PointFrom.alt = ControllableVec3.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 controllable to follow a given route. +-- @param #CONTROLLABLE self +-- @param #table GoPoints A table of Route Points. +-- @return #CONTROLLABLE self +function CONTROLLABLE:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + self.TaskScheduler:Schedule( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the controllable to a given zone. +-- The controllable final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #CONTROLLABLE self +-- @param Core.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 CONTROLLABLE:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local ControllablePoint = self:GetVec2() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.y + PointFrom.type = "Turning Point" + PointFrom.action = Formation or "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomVec2() + else + ZonePoint = Zone:GetVec2() + 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 + +--- (AIR) Return the Controllable to an @{Airbase#AIRBASE} +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #CONTROLLABLE self +-- @param Wrapper.Airbase#AIRBASE ReturnAirbase The @{Airbase#AIRBASE} to return to. +-- @param #number Speed (optional) The speed. +-- @return #string The route +function CONTROLLABLE:RouteReturnToAirbase( ReturnAirbase, Speed ) + self:F2( { ReturnAirbase, Speed } ) + +-- Example +-- [4] = +-- { +-- ["alt"] = 45, +-- ["type"] = "Land", +-- ["action"] = "Landing", +-- ["alt_type"] = "BARO", +-- ["formation_template"] = "", +-- ["properties"] = +-- { +-- ["vnav"] = 1, +-- ["scale"] = 0, +-- ["angle"] = 0, +-- ["vangle"] = 0, +-- ["steer"] = 2, +-- }, -- end of ["properties"] +-- ["ETA"] = 527.81058817743, +-- ["airdromeId"] = 12, +-- ["y"] = 243127.2973737, +-- ["x"] = -5406.2803440839, +-- ["name"] = "DictKey_WptName_53", +-- ["speed"] = 138.88888888889, +-- ["ETA_locked"] = false, +-- ["task"] = +-- { +-- ["id"] = "ComboTask", +-- ["params"] = +-- { +-- ["tasks"] = +-- { +-- }, -- end of ["tasks"] +-- }, -- end of ["params"] +-- }, -- end of ["task"] +-- ["speed_locked"] = true, +-- }, -- end of [4] + + + local DCSControllable = self:GetDCSObject() + + if DCSControllable then + + local ControllablePoint = self:GetVec2() + local ControllableVelocity = self:GetMaxVelocity() + + local PointFrom = {} + PointFrom.x = ControllablePoint.x + PointFrom.y = ControllablePoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = ControllableVelocity + + + local PointTo = {} + local AirbasePoint = ReturnAirbase:GetVec2() + + PointTo.x = AirbasePoint.x + PointTo.y = AirbasePoint.y + PointTo.type = "Land" + PointTo.action = "Landing" + PointTo.airdromeId = ReturnAirbase:GetID()-- Airdrome ID + self:T(PointTo.airdromeId) + --PointTo.alt = 0 + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + local Route = { points = Points, } + + return Route + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #CONTROLLABLE self +-- @param #string DoScript +-- @return #DCSCommand +function CONTROLLABLE:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the controllable. +-- @param #CONTROLLABLE self +-- @return #table The MissionTemplate +-- TODO: Rework the method how to retrieve a template ... +function CONTROLLABLE:GetTaskMission() + self:F2( self.ControllableName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Controllables[self.ControllableName].Template ) +end + +--- Return the mission route of the controllable. +-- @param #CONTROLLABLE self +-- @return #table The mission route defined by points. +function CONTROLLABLE:GetTaskRoute() + self:F2( self.ControllableName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Controllables[self.ControllableName].Template.route.points ) +end + +--- Return the route of a controllable by using the @{Database#DATABASE} class. +-- @param #CONTROLLABLE 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 CONTROLLABLE:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Controllable + local ControllableName = string.match( self:GetName(), ".*#" ) + if ControllableName then + ControllableName = ControllableName:sub( 1, -2 ) + else + ControllableName = self:GetName() + end + + self:T3( { ControllableName } ) + + local Template = _DATABASE.Templates.Controllables[ControllableName].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 + else + error( "Template not found for Controllable : " .. ControllableName ) + end + + return nil +end + + +--- Return the detected targets of the controllable. +-- The optional parametes specify the detection methods that can be applied. +-- If no detection method is given, the detection will use all the available methods by default. +-- @param Wrapper.Controllable#CONTROLLABLE self +-- @param #boolean DetectVisual (optional) +-- @param #boolean DetectOptical (optional) +-- @param #boolean DetectRadar (optional) +-- @param #boolean DetectIRST (optional) +-- @param #boolean DetectRWR (optional) +-- @param #boolean DetectDLINK (optional) +-- @return #table DetectedTargets +function CONTROLLABLE:GetDetectedTargets( DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK ) + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + local DetectionVisual = ( DetectVisual and DetectVisual == true ) and Controller.Detection.VISUAL or nil + local DetectionOptical = ( DetectOptical and DetectOptical == true ) and Controller.Detection.OPTICAL or nil + local DetectionRadar = ( DetectRadar and DetectRadar == true ) and Controller.Detection.RADAR or nil + local DetectionIRST = ( DetectIRST and DetectIRST == true ) and Controller.Detection.IRST or nil + local DetectionRWR = ( DetectRWR and DetectRWR == true ) and Controller.Detection.RWR or nil + local DetectionDLINK = ( DetectDLINK and DetectDLINK == true ) and Controller.Detection.DLINK or nil + + + return self:_GetController():getDetectedTargets( DetectionVisual, DetectionOptical, DetectionRadar, DetectionIRST, DetectionRWR, DetectionDLINK ) + end + + return nil +end + +function CONTROLLABLE:IsTargetDetected( DCSObject ) + self:F2( self.ControllableName ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE hold their weapons? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEHoldFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Wrapper.Controllable#CONTROLLABLE self +-- @return Wrapper.Controllable#CONTROLLABLE self +function CONTROLLABLE:OptionROEHoldFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack returning on enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEReturnFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEReturnFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack designated targets? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEOpenFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEOpenFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE attack targets of opportunity? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROEWeaponFreePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROEWeaponFree() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE ignore enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTNoReactionPossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTNoReaction() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade using passive defenses? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTPassiveDefensePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTPassiveDefense() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade on enemy fire? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTEvadeFirePossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTEvadeFire() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 CONTROLLABLE evade on fire using vertical manoeuvres? +-- @param #CONTROLLABLE self +-- @return #boolean +function CONTROLLABLE:OptionROTVerticalPossible() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:OptionROTVertical() + self:F2( { self.ControllableName } ) + + local DCSControllable = self:GetDCSObject() + if DCSControllable 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 + +--- Retrieve the controllable mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Controllable#CONTROLLABLE:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Controllable@CONTROLLABLE:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the controllable is RESTARTED! +-- @param #CONTROLLABLE self +-- @param #table WayPoints If WayPoints is given, then use the route. +-- @return #CONTROLLABLE +function CONTROLLABLE:WayPointInitialize( WayPoints ) + self:F( { WayPoints } ) + + if WayPoints then + self.WayPoints = WayPoints + else + self.WayPoints = self:GetTaskRoute() + end + + return self +end + +--- Get the current WayPoints set with the WayPoint functions( Note that the WayPoints can be nil, although there ARE waypoints). +-- @param #CONTROLLABLE self +-- @return #table WayPoints If WayPoints is given, then return the WayPoints structure. +function CONTROLLABLE:GetWayPoints() + self:F( ) + + if self.WayPoints then + return self.WayPoints + end + + return nil +end + +--- Registers a waypoint function that will be executed when the controllable moves over the WayPoint. +-- @param #CONTROLLABLE 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 controllable moves over the waypoint. The waypoint function takes variable parameters. +-- @return #CONTROLLABLE +function CONTROLLABLE: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 CONTROLLABLE:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + self:F2( { WayPoint, WayPointIndex, FunctionString, FunctionArguments } ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionControllable = GROUP:Find( ... ) " + + if FunctionArguments and #FunctionArguments > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionControllable, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionControllable )" + 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 controllable will be 1! +-- @param #CONTROLLABLE 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 #CONTROLLABLE +function CONTROLLABLE:WayPointExecute( WayPoint, WaitTime ) + self:F( { 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 + +-- Message APIs--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Controllable#CONTROLLABLE} +-- ============================================================= +-- 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 +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} task methods section for a description of the task methods. +-- +-- ### 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: +-- +-- * @{Controllable#CONTROLLABLE.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- ## 1.3) GROUP Command methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} command methods section for a description of the command methods. +-- +-- ## 1.4) GROUP option methods +-- +-- A GROUP is a @{Controllable}. See the @{Controllable} option methods section for a description of the option methods. +-- +-- ## 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. +-- +-- ## 1.6) GROUP AI methods +-- +-- A GROUP has AI methods to control the AI activation. +-- +-- * @{#GROUP.SetAIOnOff}(): Turns the GROUP AI On or Off. +-- * @{#GROUP.SetAIOn}(): Turns the GROUP AI On. +-- * @{#GROUP.SetAIOff}(): Turns the GROUP AI Off. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-07: GROUP:**HandleEvent( Event, EventFunction )** added. +-- 2017-03-07: GROUP:**UnHandleEvent( Event )** added. +-- +-- 2017-01-24: GROUP:**SetAIOnOff( AIOnOff )** added. +-- +-- 2017-01-24: GROUP:**SetAIOn()** added. +-- +-- 2017-01-24: GROUP:**SetAIOff()** added. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * [**Entropy**](https://forums.eagle.ru/member.php?u=111471), **Afinegan**: Came up with the requirement for AIOnOff(). +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Group +-- @author FlightControl + +--- The GROUP class +-- @type GROUP +-- @extends Wrapper.Controllable#CONTROLLABLE +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", +} + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param Dcs.DCSWrapper.Group#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) ) + self:F2( GroupName ) + self.GroupName = GroupName + + self:SetEventPriority( 4 ) + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param Dcs.DCSWrapper.Group#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Wrapper.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 Dcs.DCSWrapper.Group#Group The DCS Group. +function GROUP:GetDCSObject() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the POSITIONABLE within the mission. +-- @param Wrapper.Positionable#POSITIONABLE self +-- @return Dcs.DCSTypes#Position The 3D position vectors of the POSITIONABLE. +-- @return #nil The POSITIONABLE is not existing or alive. +function GROUP:GetPositionVec3() -- Overridden from POSITIONABLE:GetPositionVec3() + self:F2( self.PositionableName ) + + local DCSPositionable = self:GetDCSObject() + + if DCSPositionable then + local PositionablePosition = DCSPositionable:getUnits()[1]:getPosition().p + self:T3( PositionablePosition ) + return PositionablePosition + 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:GetDCSObject() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() and DCSGroup:getUnit(1) ~= nil + 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:GetDCSObject() + + 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 Dcs.DCSWrapper.Group#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the #GROUP. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + 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 Dcs.DCSCoalitionWrapper.Object#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + 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 Dcs.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:GetDCSObject() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + 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 Wrapper.Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSObject() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + 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 Dcs.DCSWrapper.Unit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + 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:GetDCSObject() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSObject() ) + return self:GetDCSObject() +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:GetDCSObject() + + 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:GetDCSObject() + + 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. +-- @param #GROUP self +-- @return Dcs.DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetVec2() + self:F2( self.GroupName ) + + local UnitPoint = self:GetUnit(1) + UnitPoint:GetVec2() + local GroupPointVec2 = UnitPoint:GetVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current Vec3 vector of the first DCS Unit in the GROUP. +-- @return Dcs.DCSTypes#Vec3 Current Vec3 of the first DCS Unit of the GROUP. +function GROUP:GetVec3() + self:F2( self.GroupName ) + + local GroupVec3 = self:GetUnit(1):GetVec3() + self:T3( GroupVec3 ) + return GroupVec3 +end + + + +do -- Is Zone methods + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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 Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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 Core.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 -- Wrapper.Unit#UNIT + if Zone:IsVec3InZone( Unit:GetVec3() ) 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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:GetDCSObject() + + 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 + +end + +do -- AI methods + + --- Turns the AI On or Off for the GROUP. + -- @param #GROUP self + -- @param #boolean AIOnOff The value true turns the AI On, the value false turns the AI Off. + -- @return #GROUP The GROUP. + function GROUP:SetAIOnOff( AIOnOff ) + + local DCSGroup = self:GetDCSObject() -- Dcs.DCSGroup#Group + + if DCSGroup then + local DCSController = DCSGroup:getController() -- Dcs.DCSController#Controller + if DCSController then + DCSController:setOnOff( AIOnOff ) + return self + end + end + + return nil + end + + --- Turns the AI On for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOn() + + return self:SetAIOnOff( true ) + end + + --- Turns the AI Off for the GROUP. + -- @param #GROUP self + -- @return #GROUP The GROUP. + function GROUP:SetAIOff() + + return self:SetAIOnOff( false ) + end + +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:GetDCSObject() + + if DCSGroup then + local GroupVelocityMax = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local UnitVelocityVec3 = UnitData:getVelocity() + local UnitVelocity = math.abs( UnitVelocityVec3.x ) + math.abs( UnitVelocityVec3.y ) + math.abs( UnitVelocityVec3.z ) + + if UnitVelocity > GroupVelocityMax then + GroupVelocityMax = UnitVelocity + end + end + + return GroupVelocityMax + 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 + +-- SPAWNING + +--- Respawn the @{GROUP} using a (tweaked) template of the Group. +-- The template must be retrieved with the @{Group#GROUP.GetTemplate}() function. +-- The template contains all the definitions as declared within the mission file. +-- To understand templates, do the following: +-- +-- * unpack your .miz file into a directory using 7-zip. +-- * browse in the directory created to the file **mission**. +-- * open the file and search for the country group definitions. +-- +-- Your group template will contain the fields as described within the mission file. +-- +-- This function will: +-- +-- * Get the current position and heading of the group. +-- * When the group is alive, it will tweak the template x, y and heading coordinates of the group and the embedded units to the current units positions. +-- * Then it will destroy the current alive group. +-- * And it will respawn the group using your new template definition. +-- @param Wrapper.Group#GROUP self +-- @param #table Template The template of the Group retrieved with GROUP:GetTemplate() +function GROUP:Respawn( Template ) + + local Vec3 = self:GetVec3() + Template.x = Vec3.x + Template.y = Vec3.z + --Template.x = nil + --Template.y = nil + + self:E( #Template.units ) + for UnitID, UnitData in pairs( self:GetUnits() ) do + local GroupUnit = UnitData -- Wrapper.Unit#UNIT + self:E( GroupUnit:GetName() ) + if GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + Template.units[UnitID].alt = GroupUnitVec3.y + Template.units[UnitID].x = GroupUnitVec3.x + Template.units[UnitID].y = GroupUnitVec3.z + Template.units[UnitID].heading = GroupUnitHeading + self:E( { UnitID, Template.units[UnitID], Template.units[UnitID] } ) + end + end + + self:Destroy() + _DATABASE:Spawn( Template ) +end + +--- Returns the group template from the @{DATABASE} (_DATABASE object). +-- @param #GROUP self +-- @return #table +function GROUP:GetTemplate() + local GroupName = self:GetName() + self:E( GroupName ) + return _DATABASE:GetGroupTemplate( GroupName ) +end + +--- Sets the controlled status in a Template. +-- @param #GROUP self +-- @param #boolean Controlled true is controlled, false is uncontrolled. +-- @return #table +function GROUP:SetTemplateControlled( Template, Controlled ) + Template.uncontrolled = not Controlled + return Template +end + +--- Sets the CountryID of the group in a Template. +-- @param #GROUP self +-- @param Dcs.DCScountry#country.id CountryID The country ID. +-- @return #table +function GROUP:SetTemplateCountry( Template, CountryID ) + Template.CountryID = CountryID + return Template +end + +--- Sets the CoalitionID of the group in a Template. +-- @param #GROUP self +-- @param Dcs.DCSCoalitionWrapper.Object#coalition.side CoalitionID The coalition ID. +-- @return #table +function GROUP:SetTemplateCoalition( Template, CoalitionID ) + Template.CoalitionID = CoalitionID + return Template +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 + else + error( "Template not found for Group : " .. GroupName ) + end + + return nil +end + +--- Calculate the maxium A2G threat level of the Group. +-- @param #GROUP self +function GROUP:CalculateThreatLevelA2G() + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( self:GetUnits() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + return MaxThreatLevelA2G +end + +--- Returns true if the first unit of the GROUP is in the air. +-- @param Wrapper.Group#GROUP self +-- @return #boolean true if in the first unit of the group is in the air. +-- @return #nil The GROUP is not existing or not alive. +function GROUP:InAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSObject() + + if DCSGroup then + local DCSUnit = DCSGroup:getUnit(1) + if DCSUnit then + local GroupInAir = DCSGroup:getUnit(1):inAir() + self:T3( GroupInAir ) + return GroupInAir + end + end + + return nil +end + +function GROUP:OnReSpawn( ReSpawnFunction ) + + self.ReSpawnFunction = ReSpawnFunction +end + +do -- Event Handling + + --- Subscribe to a DCS Event. + -- @param #GROUP self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the GROUP. + -- @return #GROUP + function GROUP:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventForGroup( self:GetName(), EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #GROUP self + -- @param Core.Event#EVENTS Event + -- @return #GROUP + function GROUP:UnHandleEvent( Event ) + + self:EventDispatcher():RemoveForGroup( self:GetName(), self, Event ) + + return self + end + +end + +do -- Players + + --- Get player names + -- @param #GROUP self + -- @return #table The group has players, an array of player names is returned. + -- @return #nil The group has no players + function GROUP:GetPlayerNames() + + local PlayerNames = nil + + local Units = self:GetUnits() + for UnitID, UnitData in pairs( Units ) do + local Unit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = Unit:GetPlayerName() + if PlayerName and PlayerName ~= "" then + PlayerNames = PlayerNames or {} + table.insert( PlayerNames, PlayerName ) + end + end + + self:F( PlayerNames ) + return PlayerNames + end + +end--- This module contains the UNIT class. +-- +-- 1) @{#UNIT} class, extends @{Controllable#CONTROLLABLE} +-- =========================================================== +-- 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. +-- +-- +-- 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 @{DCSWrapper.Unit#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.GetVec3}() 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 + + + + + +--- The UNIT class +-- @type UNIT +-- @extends Wrapper.Controllable#CONTROLLABLE +UNIT = { + ClassName="UNIT", +} + + +--- Unit.SensorType +-- @type Unit.SensorType +-- @field OPTIC +-- @field RADAR +-- @field IRST +-- @field RWR + + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param #string UnitName The name of the DCS unit. +-- @return #UNIT +function UNIT:Register( UnitName ) + local self = BASE:Inherit( self, CONTROLLABLE:New( UnitName ) ) + self.UnitName = UnitName + + self:SetEventPriority( 3 ) + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param Dcs.DCSWrapper.Unit#Unit DCSUnit An existing DCS Unit object reference. +-- @return #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 self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Return the name of the UNIT. +-- @param #UNIT self +-- @return #string The UNIT name. +function UNIT:Name() + + return self.UnitName +end + + +--- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit +function UNIT:GetDCSObject() + + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Respawn the @{Unit} using a (tweaked) template of the parent Group. +-- +-- This function will: +-- +-- * Get the current position and heading of the group. +-- * When the unit is alive, it will tweak the template x, y and heading coordinates of the group and the embedded units to the current units positions. +-- * Then it will respawn the re-modelled group. +-- +-- @param #UNIT self +-- @param Dcs.DCSTypes#Vec3 SpawnVec3 The position where to Spawn the new Unit at. +-- @param #number Heading The heading of the unit respawn. +function UNIT:ReSpawn( SpawnVec3, Heading ) + + local SpawnGroupTemplate = UTILS.DeepCopy( _DATABASE:GetGroupTemplateFromUnitName( self:Name() ) ) + self:T( SpawnGroupTemplate ) + + local SpawnGroup = self:GetGroup() + + if SpawnGroup then + + local Vec3 = SpawnGroup:GetVec3() + SpawnGroupTemplate.x = SpawnVec3.x + SpawnGroupTemplate.y = SpawnVec3.z + + self:E( #SpawnGroupTemplate.units ) + for UnitID, UnitData in pairs( SpawnGroup:GetUnits() ) do + local GroupUnit = UnitData -- #UNIT + self:E( GroupUnit:GetName() ) + if GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + SpawnGroupTemplate.units[UnitID].alt = GroupUnitVec3.y + SpawnGroupTemplate.units[UnitID].x = GroupUnitVec3.x + SpawnGroupTemplate.units[UnitID].y = GroupUnitVec3.z + SpawnGroupTemplate.units[UnitID].heading = GroupUnitHeading + self:E( { UnitID, SpawnGroupTemplate.units[UnitID], SpawnGroupTemplate.units[UnitID] } ) + end + end + end + + for UnitTemplateID, UnitTemplateData in pairs( SpawnGroupTemplate.units ) do + self:T( UnitTemplateData.name ) + if UnitTemplateData.name == self:Name() then + self:T("Adjusting") + SpawnGroupTemplate.units[UnitTemplateID].alt = SpawnVec3.y + SpawnGroupTemplate.units[UnitTemplateID].x = SpawnVec3.x + SpawnGroupTemplate.units[UnitTemplateID].y = SpawnVec3.z + SpawnGroupTemplate.units[UnitTemplateID].heading = Heading + self:E( { UnitTemplateID, SpawnGroupTemplate.units[UnitTemplateID], SpawnGroupTemplate.units[UnitTemplateID] } ) + else + self:E( SpawnGroupTemplate.units[UnitTemplateID].name ) + local GroupUnit = UNIT:FindByName( SpawnGroupTemplate.units[UnitTemplateID].name ) -- #UNIT + if GroupUnit and GroupUnit:IsAlive() then + local GroupUnitVec3 = GroupUnit:GetVec3() + local GroupUnitHeading = GroupUnit:GetHeading() + UnitTemplateData.alt = GroupUnitVec3.y + UnitTemplateData.x = GroupUnitVec3.x + UnitTemplateData.y = GroupUnitVec3.z + UnitTemplateData.heading = GroupUnitHeading + else + if SpawnGroupTemplate.units[UnitTemplateID].name ~= self:Name() then + self:T("nilling") + SpawnGroupTemplate.units[UnitTemplateID].delete = true + end + end + end + end + + -- Remove obscolete units from the group structure + i = 1 + while i <= #SpawnGroupTemplate.units do + + local UnitTemplateData = SpawnGroupTemplate.units[i] + self:T( UnitTemplateData.name ) + + if UnitTemplateData.delete then + table.remove( SpawnGroupTemplate.units, i ) + else + i = i + 1 + end + end + + _DATABASE:Spawn( SpawnGroupTemplate ) +end + + + +--- Returns if the unit is activated. +-- @param #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:GetDCSObject() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + + + +--- Returns the Unit's callsign - the localized string. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + self:E( self.ClassName .. " " .. self.UnitName .. " not found!" ) + return nil +end + + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param #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:GetDCSObject() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + 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 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:GetDCSObject() + + 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 Wrapper.Unit#UNIT self +-- @return Wrapper.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:GetDCSObject() + + if DCSUnit then + local UnitGroup = GROUP:Find( DCSUnit:getGroup() ) + return UnitGroup + end + + return nil +end + + +-- Need to add here functions to check if radar is on and which object etc. + +--- 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 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:GetDCSObject() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param #UNIT self +-- @return Dcs.DCSWrapper.Unit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + 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 if the unit has sensors of a certain type. +-- @param #UNIT self +-- @return #boolean returns true if the unit has specified types of sensors. This function is more preferable than Unit.getSensors() if you don't want to get information about all the unit's sensors, and just want to check if the unit has specified types of sensors. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:HasSensors( ... ) + self:F2( arg ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local HasSensors = DCSUnit:hasSensors( unpack( arg ) ) + return HasSensors + end + + return nil +end + +--- Returns if the unit is SEADable. +-- @param #UNIT self +-- @return #boolean returns true if the unit is SEADable. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:HasSEAD() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitSEADAttributes = DCSUnit:getDesc().attributes + + local HasSEAD = false + if UnitSEADAttributes["RADAR_BAND1_FOR_ARM"] and UnitSEADAttributes["RADAR_BAND1_FOR_ARM"] == true or + UnitSEADAttributes["RADAR_BAND2_FOR_ARM"] and UnitSEADAttributes["RADAR_BAND2_FOR_ARM"] == true then + HasSEAD = true + end + return HasSEAD + end + + return nil +end + +--- 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 self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return Dcs.DCSWrapper.Object#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:GetDCSObject() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, 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 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:GetDCSObject() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the UNIT in a UNIT list of one element. +-- @param #UNIT self +-- @return #list The UNITs wrappers. +function UNIT:GetUnits() + self:F2( { self.UnitName } ) + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local DCSUnits = DCSUnit:getUnits() + local Units = {} + Units[1] = UNIT:Find( DCSUnit ) + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns the category name of the #UNIT. +-- @param #UNIT self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function UNIT:GetCategoryName() + self:F3( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + if DCSUnit then + local CategoryNames = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + local UnitCategory = DCSUnit:getDesc().category + self:T3( UnitCategory ) + + return CategoryNames[UnitCategory] + end + + return nil +end + + +--- Returns the Unit's A2G threat level on a scale from 1 to 10 ... +-- The following threat levels are foreseen: +-- +-- * Threat level 0: Unit is unarmed. +-- * Threat level 1: Unit is infantry. +-- * Threat level 2: Unit is an infantry vehicle. +-- * Threat level 3: Unit is ground artillery. +-- * Threat level 4: Unit is a tank. +-- * Threat level 5: Unit is a modern tank or ifv with ATGM. +-- * Threat level 6: Unit is a AAA. +-- * Threat level 7: Unit is a SAM or manpad, IR guided. +-- * Threat level 8: Unit is a Short Range SAM, radar guided. +-- * Threat level 9: Unit is a Medium Range SAM, radar guided. +-- * Threat level 10: Unit is a Long Range SAM, radar guided. +-- @param #UNIT self +function UNIT:GetThreatLevel() + + local Attributes = self:GetDesc().attributes + self:T( Attributes ) + + local ThreatLevel = 0 + local ThreatText = "" + + if self:IsGround() then + + self:T( "Ground" ) + + local ThreatLevels = { + "Unarmed", + "Infantry", + "Old Tanks & APCs", + "Tanks & IFVs without ATGM", + "Tanks & IFV with ATGM", + "Modern Tanks", + "AAA", + "IR Guided SAMs", + "SR SAMs", + "MR SAMs", + "LR SAMs" + } + + + if Attributes["LR SAM"] then ThreatLevel = 10 + elseif Attributes["MR SAM"] then ThreatLevel = 9 + elseif Attributes["SR SAM"] and + not Attributes["IR Guided SAM"] then ThreatLevel = 8 + elseif ( Attributes["SR SAM"] or Attributes["MANPADS"] ) and + Attributes["IR Guided SAM"] then ThreatLevel = 7 + elseif Attributes["AAA"] then ThreatLevel = 6 + elseif Attributes["Modern Tanks"] then ThreatLevel = 5 + elseif ( Attributes["Tanks"] or Attributes["IFV"] ) and + Attributes["ATGM"] then ThreatLevel = 4 + elseif ( Attributes["Tanks"] or Attributes["IFV"] ) and + not Attributes["ATGM"] then ThreatLevel = 3 + elseif Attributes["Old Tanks"] or Attributes["APC"] or Attributes["Artillery"] then ThreatLevel = 2 + elseif Attributes["Infantry"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + if self:IsAir() then + + self:T( "Air" ) + + local ThreatLevels = { + "Unarmed", + "Tanker", + "AWACS", + "Transport Helicpter", + "UAV", + "Bomber", + "Strategic Bomber", + "Attack Helicopter", + "Interceptor", + "Multirole Fighter", + "Fighter" + } + + + if Attributes["Fighters"] then ThreatLevel = 10 + elseif Attributes["Multirole fighters"] then ThreatLevel = 9 + elseif Attributes["Battleplanes"] then ThreatLevel = 8 + elseif Attributes["Attack helicopters"] then ThreatLevel = 7 + elseif Attributes["Strategic bombers"] then ThreatLevel = 6 + elseif Attributes["Bombers"] then ThreatLevel = 5 + elseif Attributes["UAVs"] then ThreatLevel = 4 + elseif Attributes["Transport helicopters"] then ThreatLevel = 3 + elseif Attributes["AWACS"] then ThreatLevel = 2 + elseif Attributes["Tankers"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + if self:IsShip() then + + self:T( "Ship" ) + +--["Aircraft Carriers"] = {"Heavy armed ships",}, +--["Cruisers"] = {"Heavy armed ships",}, +--["Destroyers"] = {"Heavy armed ships",}, +--["Frigates"] = {"Heavy armed ships",}, +--["Corvettes"] = {"Heavy armed ships",}, +--["Heavy armed ships"] = {"Armed ships", "Armed Air Defence", "HeavyArmoredUnits",}, +--["Light armed ships"] = {"Armed ships","NonArmoredUnits"}, +--["Armed ships"] = {"Ships"}, +--["Unarmed ships"] = {"Ships","HeavyArmoredUnits",}, + + local ThreatLevels = { + "Unarmed ship", + "Light armed ships", + "Corvettes", + "", + "Frigates", + "", + "Cruiser", + "", + "Destroyer", + "", + "Aircraft Carrier" + } + + + if Attributes["Aircraft Carriers"] then ThreatLevel = 10 + elseif Attributes["Destroyers"] then ThreatLevel = 8 + elseif Attributes["Cruisers"] then ThreatLevel = 6 + elseif Attributes["Frigates"] then ThreatLevel = 4 + elseif Attributes["Corvettes"] then ThreatLevel = 2 + elseif Attributes["Light armed ships"] then ThreatLevel = 1 + end + + ThreatText = ThreatLevels[ThreatLevel+1] + end + + self:T2( ThreatLevel ) + return ThreatLevel, ThreatText + +end + + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Core.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 } ) + + if self:IsAlive() then + local IsInZone = Zone:IsVec3InZone( self:GetVec3() ) + + self:T( { IsInZone } ) + return IsInZone + end + + return false +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Core.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 } ) + + if self:IsAlive() then + local IsInZone = not Zone:IsVec3InZone( self:GetVec3() ) + + self:T( { IsInZone } ) + return IsInZone + else + return false + end +end + + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param #UNIT self +-- @param #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:GetDCSObject() + + if DCSUnit then + local UnitVec3 = self:GetVec3() + local AwaitUnitVec3 = AwaitUnit:GetVec3() + + if (((UnitVec3.x - AwaitUnitVec3.x)^2 + (UnitVec3.z - AwaitUnitVec3.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + + + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +-- @param Utilities.Utils#FLARECOLOR FlareColor +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetVec3(), 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:GetVec3(), 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:GetVec3(), 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:GetVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + local Vec3 = self:GetVec3() + if Vec3 then + trigger.action.signalFlare( Vec3, trigger.flareColor.Red, 0 ) + end +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor, Range ) + self:F2() + if Range then + trigger.action.smoke( self:GetRandomVec3( Range ), SmokeColor ) + else + trigger.action.smoke( self:GetVec3(), SmokeColor ) + end + +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetVec3(), 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 DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = 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 + + return nil +end + +--- Returns if the unit is of an ground category. +-- If the unit is a ground vehicle or infantry, this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Ground category evaluation result. +function UNIT:IsGround() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.GROUND_UNIT } ) + + local IsGroundResult = ( UnitDescriptor.category == Unit.Category.GROUND_UNIT ) + + self:T3( IsGroundResult ) + return IsGroundResult + end + + return nil +end + +--- Returns if the unit is a friendly unit. +-- @param #UNIT self +-- @return #boolean IsFriendly evaluation result. +function UNIT:IsFriendly( FriendlyCoalition ) + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( { UnitCoalition, FriendlyCoalition } ) + + local IsFriendlyResult = ( UnitCoalition == FriendlyCoalition ) + + self:E( IsFriendlyResult ) + return IsFriendlyResult + end + + return nil +end + +--- Returns if the unit is of a ship category. +-- If the unit is a ship, this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Ship category evaluation result. +function UNIT:IsShip() + self:F2() + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitDescriptor = DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.SHIP } ) + + local IsShipResult = ( UnitDescriptor.category == Unit.Category.SHIP ) + + self:T3( IsShipResult ) + return IsShipResult + end + + return nil +end + +--- Returns true if the UNIT is in the air. +-- @param Wrapper.Positionable#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The UNIT is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSObject() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +do -- Event Handling + + --- Subscribe to a DCS Event. + -- @param #UNIT self + -- @param Core.Event#EVENTS Event + -- @param #function EventFunction (optional) The function to be called when the event occurs for the unit. + -- @return #UNIT + function UNIT:HandleEvent( Event, EventFunction ) + + self:EventDispatcher():OnEventForUnit( self:GetName(), EventFunction, self, Event ) + + return self + end + + --- UnSubscribe to a DCS event. + -- @param #UNIT self + -- @param Core.Event#EVENTS Event + -- @return #UNIT + function UNIT:UnHandleEvent( Event ) + + self:EventDispatcher():RemoveForUnit( self:GetName(), self, Event ) + + return self + end + +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 + +--- The CLIENT class +-- @type CLIENT +-- @extends Wrapper.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, Error ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + if not Error then + error( "CLIENT not found for: " .. ClientName ) + end +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. +-- @param #boolean Error A flag that indicates whether an error should be raised if the CLIENT cannot be found. By default an error will be raised. +-- @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, Error ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + if not Error then + error( "CLIENT not found for: " .. ClientName ) + end +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, { "Client Alive " .. ClientName }, 1, 5 ) + + self:E( self ) + 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, "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, "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 CallBackFunction Create a function that will be called when a player joins the slot. +-- @return #CLIENT +function CLIENT:Alive( CallBackFunction, ... ) + self:F() + + self.ClientCallBack = CallBackFunction + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler( SchedulerName ) + self:F3( { SchedulerName, self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) + + if self:IsAlive() then + 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 Dcs.DCSWrapper.Group#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 Dcs.DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return Dcs.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 Wrapper.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 Dcs.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 @{AI_Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{AI_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, "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 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. +-- @param #string MessageID is the identifier of the message when displayed with intervals. +function CLIENT:Message( Message, MessageDuration, MessageCategory, MessageInterval, MessageID ) + self:F( { Message, MessageDuration, MessageCategory, MessageInterval } ) + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if MessageID ~= nil then + 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, MessageDuration, MessageCategory ):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, MessageDuration , MessageCategory):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, MessageDuration, MessageCategory ):ToClient( self ) + self.Messages[MessageID].MessageTime = timer.getTime() + end + end + end + else + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + end + end +end +--- This module contains the STATIC class. +-- +-- 1) @{Static#STATIC} class, extends @{Positionable#POSITIONABLE} +-- =============================================================== +-- 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 + + + + + + +--- The STATIC class +-- @type STATIC +-- @extends Wrapper.Positionable#POSITIONABLE +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. +-- @param #boolean RaiseError Raise an error if not found. +-- @return #STATIC +function STATIC:FindByName( StaticName, RaiseError ) + local StaticFound = _DATABASE:FindStatic( StaticName ) + + self.StaticName = StaticName + + if StaticFound then + StaticFound:F3( { StaticName } ) + + return StaticFound + end + + if RaiseError == nil or RaiseError == true then + error( "STATIC not found for: " .. StaticName ) + end + + return nil +end + +function STATIC:Register( StaticName ) + local self = BASE:Inherit( self, POSITIONABLE:New( StaticName ) ) + self.StaticName = StaticName + return self +end + + +function STATIC:GetDCSObject() + local DCSStatic = StaticObject.getByName( self.StaticName ) + + if DCSStatic then + return DCSStatic + end + + return nil +end + +function STATIC:GetThreatLevel() + + return 1, "Static" +end--- This module contains the AIRBASE classes. +-- +-- === +-- +-- 1) @{Airbase#AIRBASE} class, extends @{Positionable#POSITIONABLE} +-- ================================================================= +-- The @{AIRBASE} class is a wrapper class to handle the DCS Airbase objects: +-- +-- * Support all DCS Airbase APIs. +-- * Enhance with Airbase specific APIs not in the DCS Airbase API set. +-- +-- +-- 1.1) AIRBASE reference methods +-- ------------------------------ +-- For each DCS Airbase object alive within a running mission, a AIRBASE wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The AIRBASE class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Airbase or the DCS AirbaseName. +-- +-- Another thing to know is that AIRBASE objects do not "contain" the DCS Airbase object. +-- The AIRBASE methods will reference the DCS Airbase object by name when it is needed during API execution. +-- If the DCS Airbase object does not exist or is nil, the AIRBASE methods will return nil and log an exception in the DCS.log file. +-- +-- The AIRBASE class provides the following functions to retrieve quickly the relevant AIRBASE instance: +-- +-- * @{#AIRBASE.Find}(): Find a AIRBASE instance from the _DATABASE object using a DCS Airbase object. +-- * @{#AIRBASE.FindByName}(): Find a AIRBASE instance from the _DATABASE object using a DCS Airbase name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these AIRBASE OBJECT REFERENCES! (make the AIRBASE object references nil). +-- +-- 1.2) DCS AIRBASE APIs +-- --------------------- +-- The DCS Airbase APIs are used extensively within MOOSE. The AIRBASE class has for each DCS Airbase API a corresponding method. +-- To be able to distinguish easily in your code the difference between a AIRBASE API call and a DCS Airbase API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Airbase method @{DCSWrapper.Airbase#Airbase.getName}() +-- is implemented in the AIRBASE class as @{#AIRBASE.GetName}(). +-- +-- More functions will be added +-- ---------------------------- +-- During the MOOSE development, more functions will be added. +-- +-- @module Airbase +-- @author FlightControl + + + + + +--- The AIRBASE class +-- @type AIRBASE +-- @extends Wrapper.Positionable#POSITIONABLE +AIRBASE = { + ClassName="AIRBASE", + CategoryName = { + [Airbase.Category.AIRDROME] = "Airdrome", + [Airbase.Category.HELIPAD] = "Helipad", + [Airbase.Category.SHIP] = "Ship", + }, + } + +-- Registration. + +--- Create a new AIRBASE from DCSAirbase. +-- @param #AIRBASE self +-- @param #string AirbaseName The name of the airbase. +-- @return Wrapper.Airbase#AIRBASE +function AIRBASE:Register( AirbaseName ) + + local self = BASE:Inherit( self, POSITIONABLE:New( AirbaseName ) ) + self.AirbaseName = AirbaseName + return self +end + +-- Reference methods. + +--- Finds a AIRBASE from the _DATABASE using a DCSAirbase object. +-- @param #AIRBASE self +-- @param Dcs.DCSWrapper.Airbase#Airbase DCSAirbase An existing DCS Airbase object reference. +-- @return Wrapper.Airbase#AIRBASE self +function AIRBASE:Find( DCSAirbase ) + + local AirbaseName = DCSAirbase:getName() + local AirbaseFound = _DATABASE:FindAirbase( AirbaseName ) + return AirbaseFound +end + +--- Find a AIRBASE in the _DATABASE using the name of an existing DCS Airbase. +-- @param #AIRBASE self +-- @param #string AirbaseName The Airbase Name. +-- @return Wrapper.Airbase#AIRBASE self +function AIRBASE:FindByName( AirbaseName ) + + local AirbaseFound = _DATABASE:FindAirbase( AirbaseName ) + return AirbaseFound +end + +function AIRBASE:GetDCSObject() + local DCSAirbase = Airbase.getByName( self.AirbaseName ) + + if DCSAirbase then + return DCSAirbase + end + + return nil +end + + + +--- This module contains the SCENERY class. +-- +-- 1) @{Scenery#SCENERY} class, extends @{Positionable#POSITIONABLE} +-- =============================================================== +-- Scenery objects are defined on the map. +-- The @{Scenery#SCENERY} class is a wrapper class to handle the DCS Scenery objects: +-- +-- * Wraps the DCS Scenery objects. +-- * Support all DCS Scenery APIs. +-- * Enhance with Scenery specific APIs not in the DCS API set. +-- +-- @module Scenery +-- @author FlightControl + + + +--- The SCENERY class +-- @type SCENERY +-- @extends Wrapper.Positionable#POSITIONABLE +SCENERY = { + ClassName = "SCENERY", +} + + +function SCENERY:Register( SceneryName, SceneryObject ) + local self = BASE:Inherit( self, POSITIONABLE:New( SceneryName ) ) + self.SceneryName = SceneryName + self.SceneryObject = SceneryObject + return self +end + +function SCENERY:GetDCSObject() + return self.SceneryObject +end + +function SCENERY:GetThreatLevel() + + return 0, "Scenery" +end +--- Single-Player:**Yes** / Multi-Player:**Yes** / Core:**Yes** -- **Administer the scoring of player achievements, +-- and create a CSV file logging the scoring events for use at team or squadron websites.** +-- +-- ![Banner Image](..\Presentations\SCORING\Dia1.JPG) +-- +-- === +-- +-- The @{#SCORING} class administers the scoring of player achievements, +-- and creates a CSV file logging the scoring events and results for use at team or squadron websites. +-- +-- SCORING automatically calculates the threat level of the objects hit and destroyed by players, +-- which can be @{Unit}, @{Static) and @{Scenery} objects. +-- +-- Positive score points are granted when enemy or neutral targets are destroyed. +-- Negative score points or penalties are given when a friendly target is hit or destroyed. +-- This brings a lot of dynamism in the scoring, where players need to take care to inflict damage on the right target. +-- By default, penalties weight heavier in the scoring, to ensure that players don't commit fratricide. +-- The total score of the player is calculated by **adding the scores minus the penalties**. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia4.JPG) +-- +-- The score value is calculated based on the **threat level of the player** and the **threat level of the target**. +-- A calculated score takes the threat level of the target divided by a balanced threat level of the player unit. +-- As such, if the threat level of the target is high, and the player threat level is low, a higher score will be given than +-- if the threat level of the player would be high too. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia5.JPG) +-- +-- When multiple players hit the same target, and finally succeed in destroying the target, then each player who contributed to the target +-- destruction, will receive a score. This is important for targets that require significant damage before it can be destroyed, like +-- ships or heavy planes. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia13.JPG) +-- +-- Optionally, the score values can be **scaled** by a **scale**. Specific scales can be set for positive cores or negative penalties. +-- The default range of the scores granted is a value between 0 and 10. The default range of penalties given is a value between 0 and 30. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia7.JPG) +-- +-- **Additional scores** can be granted to **specific objects**, when the player(s) destroy these objects. +-- +-- ![Banner Image](..\Presentations\SCORING\Dia9.JPG) +-- +-- Various @{Zone}s can be defined for which scores are also granted when objects in that @{Zone} are destroyed. +-- This is **specifically useful** to designate **scenery targets on the map** that will generate points when destroyed. +-- +-- With a small change in MissionScripting.lua, the scoring results can also be logged in a **CSV file**. +-- These CSV files can be used to: +-- +-- * Upload scoring to a database or a BI tool to publish the scoring results to the player community. +-- * Upload scoring in an (online) Excel like tool, using pivot tables and pivot charts to show mission results. +-- * Share scoring amoung players after the mission to discuss mission results. +-- +-- Scores can be **reported**. **Menu options** are automatically added to **each player group** when a player joins a client slot or a CA unit. +-- Use the radio menu F10 to consult the scores while running the mission. +-- Scores can be reported for your user, or an overall score can be reported of all players currently active in the mission. +-- +-- # 1) @{Scoring#SCORING} class, extends @{Base#BASE} +-- +-- ## 1.1) Set the destroy score or penalty scale +-- +-- Score scales can be set for scores granted when enemies or friendlies are destroyed. +-- Use the method @{#SCORING.SetScaleDestroyScore}() to set the scale of enemy destroys (positive destroys). +-- Use the method @{#SCORING.SetScaleDestroyPenalty}() to set the scale of friendly destroys (negative destroys). +-- +-- local Scoring = SCORING:New( "Scoring File" ) +-- Scoring:SetScaleDestroyScore( 10 ) +-- Scoring:SetScaleDestroyPenalty( 40 ) +-- +-- The above sets the scale for valid scores to 10. So scores will be given in a scale from 0 to 10. +-- The penalties will be given in a scale from 0 to 40. +-- +-- ## 1.2) Define special targets that will give extra scores. +-- +-- Special targets can be set that will give extra scores to the players when these are destroyed. +-- Use the methods @{#SCORING.AddUnitScore}() and @{#SCORING.RemoveUnitScore}() to specify a special additional score for a specific @{Unit}s. +-- Use the methods @{#SCORING.AddStaticScore}() and @{#SCORING.RemoveStaticScore}() to specify a special additional score for a specific @{Static}s. +-- Use the method @{#SCORING.SetGroupGroup}() to specify a special additional score for a specific @{Group}s. +-- +-- local Scoring = SCORING:New( "Scoring File" ) +-- Scoring:AddUnitScore( UNIT:FindByName( "Unit #001" ), 200 ) +-- Scoring:AddStaticScore( STATIC:FindByName( "Static #1" ), 100 ) +-- +-- The above grants an additional score of 200 points for Unit #001 and an additional 100 points of Static #1 if these are destroyed. +-- Note that later in the mission, one can remove these scores set, for example, when the a goal achievement time limit is over. +-- For example, this can be done as follows: +-- +-- Scoring:RemoveUnitScore( UNIT:FindByName( "Unit #001" ) ) +-- +-- ## 1.3) Define destruction zones that will give extra scores. +-- +-- Define zones of destruction. Any object destroyed within the zone of the given category will give extra points. +-- Use the method @{#SCORING.AddZoneScore}() to add a @{Zone} for additional scoring. +-- Use the method @{#SCORING.RemoveZoneScore}() to remove a @{Zone} for additional scoring. +-- There are interesting variations that can be achieved with this functionality. For example, if the @{Zone} is a @{Zone#ZONE_UNIT}, +-- then the zone is a moving zone, and anything destroyed within that @{Zone} will generate points. +-- The other implementation could be to designate a scenery target (a building) in the mission editor surrounded by a @{Zone}, +-- just large enough around that building. +-- +-- ## 1.4) Add extra Goal scores upon an event or a condition. +-- +-- A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens. +-- Use the method @{#SCORING.AddGoalScore}() to add a score for a Player at any time in your mission. +-- +-- ## 1.5) Configure fratricide level. +-- +-- When a player commits too much damage to friendlies, his penalty score will reach a certain level. +-- Use the method @{#SCORING.SetFratricide}() to define the level when a player gets kicked. +-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score. +-- +-- ## 1.6) Penalty score when a player changes the coalition. +-- +-- When a player changes the coalition, he can receive a penalty score. +-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition. +-- By default, the penalty for changing coalition is the default penalty scale. +-- +-- ## 1.8) Define output CSV files. +-- +-- The CSV file is given the name of the string given in the @{#SCORING.New}{} constructor, followed by the .csv extension. +-- The file is incrementally saved in the **\\Saved Games\\DCS\\Logs** folder, and has a time stamp indicating each mission run. +-- See the following example: +-- +-- local ScoringFirstMission = SCORING:New( "FirstMission" ) +-- local ScoringSecondMission = SCORING:New( "SecondMission" ) +-- +-- The above documents that 2 Scoring objects are created, ScoringFirstMission and ScoringSecondMission. +-- +-- ## 1.9) Configure messages. +-- +-- When players hit or destroy targets, messages are sent. +-- Various methods exist to configure: +-- +-- * Which messages are sent upon the event. +-- * Which audience receives the message. +-- +-- ### 1.9.1) Configure the messages sent upon the event. +-- +-- Use the following methods to configure when to send messages. By default, all messages are sent. +-- +-- * @{#SCORING.SetMessagesHit}(): Configure to send messages after a target has been hit. +-- * @{#SCORING.SetMessagesDestroy}(): Configure to send messages after a target has been destroyed. +-- * @{#SCORING.SetMessagesAddon}(): Configure to send messages for additional score, after a target has been destroyed. +-- * @{#SCORING.SetMessagesZone}(): Configure to send messages for additional score, after a target has been destroyed within a given zone. +-- +-- ### 1.9.2) Configure the audience of the messages. +-- +-- Use the following methods to configure the audience of the messages. By default, the messages are sent to all players in the mission. +-- +-- * @{#SCORING.SetMessagesToAll}(): Configure to send messages to all players. +-- * @{#SCORING.SetMessagesToCoalition}(): Configure to send messages to only those players within the same coalition as the player. +-- +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-02-26: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **Wingthor (TAW)**: Testing & Advice. +-- * **Dutch-Baron (TAW)**: Testing & Advice. +-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing and Advice. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Scoring + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Core.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() ) -- #SCORING + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + -- Additional Object scores + self.ScoringObjects = {} + + -- Additional Zone scores. + self.ScoringZones = {} + + -- Configure Messages + self:SetMessagesToAll() + self:SetMessagesHit( true ) + self:SetMessagesDestroy( true ) + self:SetMessagesScore( true ) + self:SetMessagesZone( true ) + + -- Scales + self:SetScaleDestroyScore( 10 ) + self:SetScaleDestroyPenalty( 30 ) + + -- Default fratricide penalty level (maximum penalty that can be assigned to a player before he gets kicked). + self:SetFratricide( self.ScaleDestroyPenalty * 3 ) + + -- Default penalty when a player changes coalition. + self:SetCoalitionChangePenalty( self.ScaleDestroyPenalty ) + + -- Event handlers + self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) + self:HandleEvent( EVENTS.Hit, self._EventOnHit ) + self:HandleEvent( EVENTS.PlayerEnterUnit ) + self:HandleEvent( EVENTS.PlayerLeaveUnit ) + + -- Create the CSV file. + self:OpenCSV( GameName ) + + return self + +end + +--- Set the scale for scoring valid destroys (enemy destroys). +-- A default calculated score is a value between 1 and 10. +-- The scale magnifies the scores given to the players. +-- @param #SCORING self +-- @param #number Scale The scale of the score given. +function SCORING:SetScaleDestroyScore( Scale ) + + self.ScaleDestroyScore = Scale + + return self +end + +--- Set the scale for scoring penalty destroys (friendly destroys). +-- A default calculated penalty is a value between 1 and 10. +-- The scale magnifies the scores given to the players. +-- @param #SCORING self +-- @param #number Scale The scale of the score given. +-- @return #SCORING +function SCORING:SetScaleDestroyPenalty( Scale ) + + self.ScaleDestroyPenalty = Scale + + return self +end + +--- Add a @{Unit} for additional scoring when the @{Unit} is destroyed. +-- Note that if there was already a @{Unit} declared within the scoring with the same name, +-- then the old @{Unit} will be replaced with the new @{Unit}. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score needs to be given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddUnitScore( ScoreUnit, Score ) + + local UnitName = ScoreUnit:GetName() + + self.ScoringObjects[UnitName] = Score + + return self +end + +--- Removes a @{Unit} for additional scoring when the @{Unit} is destroyed. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score needs to be given. +-- @return #SCORING +function SCORING:RemoveUnitScore( ScoreUnit ) + + local UnitName = ScoreUnit:GetName() + + self.ScoringObjects[UnitName] = nil + + return self +end + +--- Add a @{Static} for additional scoring when the @{Static} is destroyed. +-- Note that if there was already a @{Static} declared within the scoring with the same name, +-- then the old @{Static} will be replaced with the new @{Static}. +-- @param #SCORING self +-- @param Wrapper.Static#UNIT ScoreStatic The @{Static} for which the Score needs to be given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddStaticScore( ScoreStatic, Score ) + + local StaticName = ScoreStatic:GetName() + + self.ScoringObjects[StaticName] = Score + + return self +end + +--- Removes a @{Static} for additional scoring when the @{Static} is destroyed. +-- @param #SCORING self +-- @param Wrapper.Static#UNIT ScoreStatic The @{Static} for which the Score needs to be given. +-- @return #SCORING +function SCORING:RemoveStaticScore( ScoreStatic ) + + local StaticName = ScoreStatic:GetName() + + self.ScoringObjects[StaticName] = nil + + return self +end + + +--- Specify a special additional score for a @{Group}. +-- @param #SCORING self +-- @param Wrapper.Group#GROUP ScoreGroup The @{Group} for which each @{Unit} a Score is given. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddScoreGroup( ScoreGroup, Score ) + + local ScoreUnits = ScoreGroup:GetUnits() + + for ScoreUnitID, ScoreUnit in pairs( ScoreUnits ) do + local UnitName = ScoreUnit:GetName() + self.ScoringObjects[UnitName] = Score + end + + return self +end + +--- Add a @{Zone} to define additional scoring when any object is destroyed in that zone. +-- Note that if a @{Zone} with the same name is already within the scoring added, the @{Zone} (type) and Score will be replaced! +-- This allows for a dynamic destruction zone evolution within your mission. +-- @param #SCORING self +-- @param Core.Zone#ZONE_BASE ScoreZone The @{Zone} which defines the destruction score perimeters. +-- Note that a zone can be a polygon or a moving zone. +-- @param #number Score The Score value. +-- @return #SCORING +function SCORING:AddZoneScore( ScoreZone, Score ) + + local ZoneName = ScoreZone:GetName() + + self.ScoringZones[ZoneName] = {} + self.ScoringZones[ZoneName].ScoreZone = ScoreZone + self.ScoringZones[ZoneName].Score = Score + + return self +end + +--- Remove a @{Zone} for additional scoring. +-- The scoring will search if any @{Zone} is added with the given name, and will remove that zone from the scoring. +-- This allows for a dynamic destruction zone evolution within your mission. +-- @param #SCORING self +-- @param Core.Zone#ZONE_BASE ScoreZone The @{Zone} which defines the destruction score perimeters. +-- Note that a zone can be a polygon or a moving zone. +-- @return #SCORING +function SCORING:RemoveZoneScore( ScoreZone ) + + local ZoneName = ScoreZone:GetName() + + self.ScoringZones[ZoneName] = nil + + return self +end + + +--- Configure to send messages after a target has been hit. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesHit( OnOff ) + + self.MessagesHit = OnOff + return self +end + +--- If to send messages after a target has been hit. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesHit() + + return self.MessagesHit +end + +--- Configure to send messages after a target has been destroyed. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesDestroy( OnOff ) + + self.MessagesDestroy = OnOff + return self +end + +--- If to send messages after a target has been destroyed. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesDestroy() + + return self.MessagesDestroy +end + +--- Configure to send messages after a target has been destroyed and receives additional scores. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesScore( OnOff ) + + self.MessagesScore = OnOff + return self +end + +--- If to send messages after a target has been destroyed and receives additional scores. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesScore() + + return self.MessagesScore +end + +--- Configure to send messages after a target has been hit in a zone, and additional score is received. +-- @param #SCORING self +-- @param #boolean OnOff If true is given, the messages are sent. +-- @return #SCORING +function SCORING:SetMessagesZone( OnOff ) + + self.MessagesZone = OnOff + return self +end + +--- If to send messages after a target has been hit in a zone, and additional score is received. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesZone() + + return self.MessagesZone +end + +--- Configure to send messages to all players. +-- @param #SCORING self +-- @return #SCORING +function SCORING:SetMessagesToAll() + + self.MessagesAudience = 1 + return self +end + +--- If to send messages to all players. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesToAll() + + return self.MessagesAudience == 1 +end + +--- Configure to send messages to only those players within the same coalition as the player. +-- @param #SCORING self +-- @return #SCORING +function SCORING:SetMessagesToCoalition() + + self.MessagesAudience = 2 + return self +end + +--- If to send messages to only those players within the same coalition as the player. +-- @param #SCORING self +-- @return #boolean +function SCORING:IfMessagesToCoalition() + + return self.MessagesAudience == 2 +end + + +--- When a player commits too much damage to friendlies, his penalty score will reach a certain level. +-- Use this method to define the level when a player gets kicked. +-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score. +-- @param #SCORING self +-- @param #number Fratricide The amount of maximum penalty that may be inflicted by a friendly player before he gets kicked. +-- @return #SCORING +function SCORING:SetFratricide( Fratricide ) + + self.Fratricide = Fratricide + return self +end + + +--- When a player changes the coalition, he can receive a penalty score. +-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition. +-- By default, the penalty for changing coalition is the default penalty scale. +-- @param #SCORING self +-- @param #number CoalitionChangePenalty The amount of penalty that is given. +-- @return #SCORING +function SCORING:SetCoalitionChangePenalty( CoalitionChangePenalty ) + + self.CoalitionChangePenalty = CoalitionChangePenalty + return self +end + + +--- Add a new player entering a Unit. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT UnitData +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData:IsAlive() 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() + local UnitThreatLevel, UnitThreatType = UnitData:GetThreatLevel() + + 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].Destroy = {} + self.Players[PlayerName].Goals = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Destroy[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + 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 + ):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 + self.Players[PlayerName].UNIT = UnitData + self.Players[PlayerName].ThreatLevel = UnitThreatLevel + self.Players[PlayerName].ThreatType = UnitThreatType + + if self.Players[PlayerName].Penalty > self.Fratricide * 0.50 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 " .. self.Fratricide .. ", you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + 30 + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > self.Fratricide then + UnitData:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + 10 + ):ToAll() + end + + end +end + + +--- Add a goal score for a player. +-- The method takes the PlayerUnit for which the Goal score needs to be set. +-- The GoalTag is a string or identifier that is taken into the CSV file scoring log to identify the goal. +-- A free text can be given that is shown to the players. +-- The Score can be both positive and negative. +-- @param #SCORING self +-- @param Wrapper.Unit#UNIT PlayerUnit The @{Unit} of the Player. Other Properties for the scoring are taken from this PlayerUnit, like coalition, type etc. +-- @param #string GoalTag The string or identifier that is used in the CSV file to identify the goal (sort or group later in Excel). +-- @param #string Text A free text that is shown to the players. +-- @param #number Score The score can be both positive or negative ( Penalty ). +function SCORING:AddGoalScore( PlayerUnit, GoalTag, Text, Score ) + + local PlayerName = PlayerUnit:GetPlayerName() + + self:E( { PlayerUnit.UnitName, PlayerName, GoalTag, Text, Score } ) + + -- PlayerName can be nil, if the Unit with the player crashed or due to another reason. + if PlayerName then + local PlayerData = self.Players[PlayerName] + + PlayerData.Goals[GoalTag] = PlayerData.Goals[GoalTag] or { Score = 0 } + PlayerData.Goals[GoalTag].Score = PlayerData.Goals[GoalTag].Score + Score + PlayerData.Score = PlayerData.Score + Score + + MESSAGE:New( Text, 30 ):ToAll() + + self:ScoreCSV( PlayerName, "", "GOAL_" .. string.upper( GoalTag ), 1, Score, PlayerUnit:GetName() ) + end +end + + +--- Registers Scores the players completing a Mission Task. +-- @param #SCORING self +-- @param Tasking.Mission#MISSION Mission +-- @param Wrapper.Unit#UNIT PlayerUnit +-- @param #string Text +-- @param #number Score +function SCORING:_AddMissionTaskScore( Mission, PlayerUnit, Text, Score ) + + local PlayerName = PlayerUnit:GetPlayerName() + local MissionName = Mission:GetName() + + self:E( { Mission:GetName(), PlayerUnit.UnitName, PlayerName, Text, Score } ) + + -- PlayerName can be nil, if the Unit with the player crashed or due to another reason. + if PlayerName then + local PlayerData = self.Players[PlayerName] + + if not PlayerData.Mission[MissionName] then + PlayerData.Mission[MissionName] = {} + PlayerData.Mission[MissionName].ScoreTask = 0 + PlayerData.Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( PlayerData.Mission[MissionName] ) + + PlayerData.Score = self.Players[PlayerName].Score + Score + PlayerData.Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has " .. Text .. " in Mission '" .. MissionName .. "'. " .. + Score .. " task score!", + 30 ):ToAll() + + self:ScoreCSV( PlayerName, "", "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:GetName() ) + end +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +-- @param #SCORING self +-- @param Tasking.Mission#MISSION Mission +-- @param Wrapper.Unit#UNIT PlayerUnit +-- @param #string Text +-- @param #number Score +function SCORING:_AddMissionScore( Mission, Text, Score ) + + local MissionName = Mission:GetName() + + self:E( { Mission, Text, Score } ) + self:E( self.Players ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + self:E( PlayerData ) + if PlayerData.Mission[MissionName] then + + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has " .. Text .. " in Mission '" .. MissionName .. "'. " .. + Score .. " mission score!", + 60 ):ToAll() + + self:ScoreCSV( PlayerName, "", "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + + +--- Handles the OnPlayerEnterUnit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:OnEventPlayerEnterUnit( Event ) + if Event.IniUnit then + self:_AddPlayerFromUnit( Event.IniUnit ) + local Menu = MENU_GROUP:New( Event.IniGroup, 'Scoring' ) + local ReportGroupSummary = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Summary report players in group', Menu, SCORING.ReportScoreGroupSummary, self, Event.IniGroup ) + local ReportGroupDetailed = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Detailed report players in group', Menu, SCORING.ReportScoreGroupDetailed, self, Event.IniGroup ) + local ReportToAllSummary = MENU_GROUP_COMMAND:New( Event.IniGroup, 'Summary report all players', Menu, SCORING.ReportScoreAllSummary, self, Event.IniGroup ) + self:SetState( Event.IniUnit, "ScoringMenu", Menu ) + end +end + +--- Handles the OnPlayerLeaveUnit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:OnEventPlayerLeaveUnit( Event ) + if Event.IniUnit then + local Menu = self:GetState( Event.IniUnit, "ScoringMenu" ) -- Core.Menu#MENU_GROUP + if Menu then + Menu:Remove() + end + end +end + + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Core.Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + 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 TargetUNIT = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = nil + + 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 + InitUNIT = Event.IniUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = Event.IniPlayerName + + InitCoalition = Event.IniCoalition + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + --InitCategory = InitUnit:getDesc().category + InitCategory = Event.IniCategory + InitType = Event.IniTypeName + + 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 + TargetUNIT = Event.TgtUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = Event.TgtPlayerName + + TargetCoalition = Event.TgtCoalition + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + --TargetCategory = TargetUnit:getDesc().category + TargetCategory = Event.TgtCategory + TargetType = Event.TgtTypeName + + 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 ) + end + + self:T( "Hitting Something" ) + + -- What is he hitting? + if TargetCategory then + + -- A target got hit, score it. + -- Player contains the score data from self.Players[InitPlayerName] + local Player = self.Players[InitPlayerName] + + -- Ensure there is a hit table per TargetCategory and TargetUnitName. + Player.Hit[TargetCategory] = Player.Hit[TargetCategory] or {} + Player.Hit[TargetCategory][TargetUnitName] = Player.Hit[TargetCategory][TargetUnitName] or {} + + -- PlayerHit contains the score counters and data per unit that was hit. + local PlayerHit = Player.Hit[TargetCategory][TargetUnitName] + + PlayerHit.Score = PlayerHit.Score or 0 + PlayerHit.Penalty = PlayerHit.Penalty or 0 + PlayerHit.ScoreHit = PlayerHit.ScoreHit or 0 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit or 0 + PlayerHit.TimeStamp = PlayerHit.TimeStamp or 0 + PlayerHit.UNIT = PlayerHit.UNIT or TargetUNIT + PlayerHit.ThreatLevel, PlayerHit.ThreatType = PlayerHit.UNIT:GetThreatLevel() + + -- Only grant hit scores if there was more than one second between the last hit. + if timer.getTime() - PlayerHit.TimeStamp > 1 then + PlayerHit.TimeStamp = timer.getTime() + + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + + -- Ensure there is a Player to Player hit reference table. + Player.HitPlayers[TargetPlayerName] = true + end + + local Score = 0 + + if InitCoalition then -- A coalition object was hit. + if InitCoalition == TargetCoalition then + Player.Penalty = Player.Penalty + 10 + PlayerHit.Penalty = PlayerHit.Penalty + 10 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit + 1 + + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit friendly player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit a friendly target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + end + self:ScoreCSV( InitPlayerName, TargetPlayerName, "HIT_PENALTY", 1, -10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + Player.Score = Player.Score + 1 + PlayerHit.Score = PlayerHit.Score + 1 + PlayerHit.ScoreHit = PlayerHit.ScoreHit + 1 + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit enemy player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit an enemy target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + end + self:ScoreCSV( InitPlayerName, TargetPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + else -- A scenery object was hit. + MESSAGE + :New( "Player '" .. InitPlayerName .. "' hit a scenery object.", + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( InitPlayerName, "", "HIT_SCORE", 1, 0, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end + + -- It is a weapon initiated by a player, that is hitting something + -- This seems to occur only with scenery and static objects. + if Event.WeaponPlayerName ~= nil then + self:_AddPlayerFromUnit( Event.WeaponUNIT ) + if self.Players[Event.WeaponPlayerName] 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 ) + end + + self:T( "Hitting Scenery" ) + + -- What is he hitting? + if TargetCategory then + + -- A scenery or static got hit, score it. + -- Player contains the score data from self.Players[WeaponPlayerName] + local Player = self.Players[Event.WeaponPlayerName] + + -- Ensure there is a hit table per TargetCategory and TargetUnitName. + Player.Hit[TargetCategory] = Player.Hit[TargetCategory] or {} + Player.Hit[TargetCategory][TargetUnitName] = Player.Hit[TargetCategory][TargetUnitName] or {} + + -- PlayerHit contains the score counters and data per unit that was hit. + local PlayerHit = Player.Hit[TargetCategory][TargetUnitName] + + PlayerHit.Score = PlayerHit.Score or 0 + PlayerHit.Penalty = PlayerHit.Penalty or 0 + PlayerHit.ScoreHit = PlayerHit.ScoreHit or 0 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit or 0 + PlayerHit.TimeStamp = PlayerHit.TimeStamp or 0 + PlayerHit.UNIT = PlayerHit.UNIT or TargetUNIT + PlayerHit.ThreatLevel, PlayerHit.ThreatType = PlayerHit.UNIT:GetThreatLevel() + + -- Only grant hit scores if there was more than one second between the last hit. + if timer.getTime() - PlayerHit.TimeStamp > 1 then + PlayerHit.TimeStamp = timer.getTime() + + local Score = 0 + + if InitCoalition then -- A coalition object was hit, probably a static. + if InitCoalition == TargetCoalition then + -- TODO: Penalty according scale + Player.Penalty = Player.Penalty + 10 + PlayerHit.Penalty = PlayerHit.Penalty + 10 + PlayerHit.PenaltyHit = PlayerHit.PenaltyHit + 1 + + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit a friendly target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.PenaltyHit .. " times. " .. + "Penalty: -" .. PlayerHit.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( Event.WeaponCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, TargetPlayerName, "HIT_PENALTY", 1, -10, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + Player.Score = Player.Score + 1 + PlayerHit.Score = PlayerHit.Score + 1 + PlayerHit.ScoreHit = PlayerHit.ScoreHit + 1 + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit an enemy target " .. + TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerHit.ScoreHit .. " times. " .. + "Score: " .. PlayerHit.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( Event.WeaponCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, TargetPlayerName, "HIT_SCORE", 1, 1, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + else -- A scenery object was hit. + MESSAGE + :New( "Player '" .. Event.WeaponPlayerName .. "' hit a scenery object.", + 2 + ) + :ToAllIf( self:IfMessagesHit() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesHit() and self:IfMessagesToCoalition() ) + self:ScoreCSV( Event.WeaponPlayerName, "", "HIT_SCORE", 1, 0, Event.WeaponName, Event.WeaponCoalition, Event.WeaponCategory, Event.WeaponTypeName, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + end + end +end + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Core.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.IniUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = Event.IniPlayerName + + TargetCoalition = Event.IniCoalition + --TargetCategory = TargetUnit:getCategory() + --TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetCategory = Event.IniCategory + TargetType = Event.IniTypeName + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + -- Player contains the score and reference data for the player. + for PlayerName, Player in pairs( self.Players ) do + if Player then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got destroyed" ) + + -- Some variables + local InitUnitName = Player.UnitName + local InitUnitType = Player.UnitType + local InitCoalition = Player.UnitCoalition + local InitCategory = Player.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + local Destroyed = false + + -- What is the player destroying? + if Player and Player.Hit and Player.Hit[TargetCategory] and Player.Hit[TargetCategory][TargetUnitName] and Player.Hit[TargetCategory][TargetUnitName].TimeStamp ~= 0 then -- Was there a hit for this unit for this player before registered??? + + local TargetThreatLevel = Player.Hit[TargetCategory][TargetUnitName].ThreatLevel + local TargetThreatType = Player.Hit[TargetCategory][TargetUnitName].ThreatType + + Player.Destroy[TargetCategory] = Player.Destroy[TargetCategory] or {} + Player.Destroy[TargetCategory][TargetType] = Player.Destroy[TargetCategory][TargetType] or {} + + -- PlayerDestroy contains the destroy score data per category and target type of the player. + local TargetDestroy = Player.Destroy[TargetCategory][TargetType] + TargetDestroy.Score = TargetDestroy.Score or 0 + TargetDestroy.ScoreDestroy = TargetDestroy.ScoreDestroy or 0 + TargetDestroy.Penalty = TargetDestroy.Penalty or 0 + TargetDestroy.PenaltyDestroy = TargetDestroy.PenaltyDestroy or 0 + + if TargetCoalition then + if InitCoalition == TargetCoalition then + local ThreatLevelTarget = TargetThreatLevel + local ThreatTypeTarget = TargetThreatType + local ThreatLevelPlayer = Player.ThreatLevel / 10 + 1 + local ThreatPenalty = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.ScaleDestroyPenalty / 10 ) + self:E( { ThreatLevel = ThreatPenalty, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } ) + + Player.Penalty = Player.Penalty + ThreatPenalty + TargetDestroy.Penalty = TargetDestroy.Penalty + ThreatPenalty + TargetDestroy.PenaltyDestroy = TargetDestroy.PenaltyDestroy + 1 + + if Player.HitPlayers[TargetPlayerName] then -- A player destroyed another player + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed friendly player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.PenaltyDestroy .. " times. " .. + "Penalty: -" .. TargetDestroy.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed a friendly target " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.PenaltyDestroy .. " times. " .. + "Penalty: -" .. TargetDestroy.Penalty .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + end + + Destroyed = true + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_PENALTY", 1, ThreatPenalty, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + + local ThreatLevelTarget = TargetThreatLevel + local ThreatTypeTarget = TargetThreatType + local ThreatLevelPlayer = Player.ThreatLevel / 10 + 1 + local ThreatScore = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.ScaleDestroyScore / 10 ) + + self:E( { ThreatLevel = ThreatScore, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } ) + + Player.Score = Player.Score + ThreatScore + TargetDestroy.Score = TargetDestroy.Score + ThreatScore + TargetDestroy.ScoreDestroy = TargetDestroy.ScoreDestroy + 1 + if Player.HitPlayers[TargetPlayerName] then -- A player destroyed another player + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed enemy player '" .. TargetPlayerName .. "' " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.ScoreDestroy .. " times. " .. + "Score: " .. TargetDestroy.Score .. ". Score Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + else + MESSAGE + :New( "Player '" .. PlayerName .. "' destroyed an enemy " .. + TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. TargetDestroy.ScoreDestroy .. " times. " .. + "Score: " .. TargetDestroy.Score .. ". Total:" .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesDestroy() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesDestroy() and self:IfMessagesToCoalition() ) + end + Destroyed = true + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, ThreatScore, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + + local UnitName = TargetUnit:GetName() + local Score = self.ScoringObjects[UnitName] + if Score then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Special target '" .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " .. " destroyed! " .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! Total: " .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesScore() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesScore() and self:IfMessagesToCoalition() ) + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + Destroyed = true + end + + -- Check if there are Zones where the destruction happened. + for ZoneName, ScoreZoneData in pairs( self.ScoringZones ) do + self:E( { ScoringZone = ScoreZoneData } ) + local ScoreZone = ScoreZoneData.ScoreZone -- Core.Zone#ZONE_BASE + local Score = ScoreZoneData.Score + if ScoreZone:IsVec2InZone( TargetUnit:GetVec2() ) then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Target destroyed in zone '" .. ScoreZone:GetName() .. "'." .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! " .. + "Total: " .. Player.Score - Player.Penalty, + 15 ) + :ToAllIf( self:IfMessagesZone() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesZone() and self:IfMessagesToCoalition() ) + self:ScoreCSV( PlayerName, TargetPlayerName, "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + Destroyed = true + end + end + + end + else + -- Check if there are Zones where the destruction happened. + for ZoneName, ScoreZoneData in pairs( self.ScoringZones ) do + self:E( { ScoringZone = ScoreZoneData } ) + local ScoreZone = ScoreZoneData.ScoreZone -- Core.Zone#ZONE_BASE + local Score = ScoreZoneData.Score + if ScoreZone:IsVec2InZone( TargetUnit:GetVec2() ) then + Player.Score = Player.Score + Score + TargetDestroy.Score = TargetDestroy.Score + Score + MESSAGE + :New( "Scenery destroyed in zone '" .. ScoreZone:GetName() .. "'." .. + "Player '" .. PlayerName .. "' receives an extra " .. Score .. " points! " .. + "Total: " .. Player.Score - Player.Penalty, + 15 + ) + :ToAllIf( self:IfMessagesZone() and self:IfMessagesToAll() ) + :ToCoalitionIf( InitCoalition, self:IfMessagesZone() and self:IfMessagesToCoalition() ) + Destroyed = true + self:ScoreCSV( PlayerName, "", "DESTROY_SCORE", 1, Score, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, "", "Scenery", TargetUnitType ) + end + end + end + + -- Delete now the hit cache if the target was destroyed. + -- Otherwise points will be granted every time a target gets killed by the players that hit that target. + -- This is only relevant for player to player destroys. + if Destroyed then + Player.Hit[TargetCategory][TargetUnitName].TimeStamp = 0 + end + end + end + end +end + + +--- Produce detailed report of player hit scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerHits( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageHits = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + self:T( "Hit scores exist for player " .. PlayerName ) + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + 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 = "Hits: " .. ScoreMessageHits + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + + +--- Produce detailed report of player destroy scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerDestroys( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageDestroys = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + if PlayerData.Destroy[CategoryID] then + self:T( "Destroy scores exist for player " .. PlayerName ) + local Score = 0 + local ScoreDestroy = 0 + local Penalty = 0 + local PenaltyDestroy = 0 + + for UnitName, UnitData in pairs( PlayerData.Destroy[CategoryID] ) do + self:E( { UnitData = UnitData } ) + if UnitData ~= {} then + Score = Score + UnitData.Score + ScoreDestroy = ScoreDestroy + UnitData.ScoreDestroy + Penalty = Penalty + UnitData.Penalty + PenaltyDestroy = PenaltyDestroy + UnitData.PenaltyDestroy + end + end + + local ScoreMessageDestroy = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageDestroy ) + ScoreMessageDestroys = ScoreMessageDestroys .. ScoreMessageDestroy + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageDestroys = ScoreMessageDestroys .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageDestroys ~= "" then + ScoreMessage = "Destroys: " .. ScoreMessageDestroys + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player penalty scores because of changing the coalition. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerCoalitionChanges( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 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 + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player goal scores. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerGoals( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 ScoreMessageGoal = "" + local ScoreGoal = 0 + local ScoreTask = 0 + for GoalName, GoalData in pairs( PlayerData.Goals ) do + ScoreGoal = ScoreGoal + GoalData.Score + ScoreMessageGoal = ScoreMessageGoal .. "'" .. GoalName .. "':" .. GoalData.Score .. "; " + end + PlayerScore = PlayerScore + ScoreGoal + + if ScoreMessageGoal ~= "" then + ScoreMessage = "Goals: " .. ScoreMessageGoal + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + +--- Produce detailed report of player penalty scores because of changing the coalition. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @return #string The report. +function SCORING:ReportDetailedPlayerMissions( PlayerName ) + + local ScoreMessage = "" + local PlayerScore = 0 + local PlayerPenalty = 0 + + local PlayerData = self.Players[PlayerName] + 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 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 = "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")" + end + end + + return ScoreMessage, PlayerScore, PlayerPenalty +end + + +--- Report Group Score Summary +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreGroupSummary( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score Group Summary" ) + + local PlayerUnits = PlayerGroup:GetUnits() + for UnitID, PlayerUnit in pairs( PlayerUnits ) do + local PlayerUnit = PlayerUnit -- Wrapper.Unit#UNIT + local PlayerName = PlayerUnit:GetPlayerName() + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +end + +--- Report Group Score Detailed +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreGroupDetailed( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score Group Detailed" ) + + local PlayerUnits = PlayerGroup:GetUnits() + for UnitID, PlayerUnit in pairs( PlayerUnits ) do + local PlayerUnit = PlayerUnit -- Wrapper.Unit#UNIT + local PlayerName = PlayerUnit:GetPlayerName() + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty, + ReportHits, + ReportDestroys, + ReportCoalitionChanges, + ReportGoals, + ReportMissions + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +end + +--- Report all players score +-- @param #SCORING self +-- @param Wrapper.Group#GROUP PlayerGroup The player group. +function SCORING:ReportScoreAllSummary( PlayerGroup ) + + local PlayerMessage = "" + + self:T( "Report Score All Players" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerName then + + local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName ) + ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits + self:E( { ReportHits, ScoreHits, PenaltyHits } ) + + local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName ) + ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys + self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } ) + + local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName ) + ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges + self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } ) + + local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName ) + ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals + self:E( { ReportGoals, ScoreGoals, PenaltyGoals } ) + + local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName ) + ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions + self:E( { ReportMissions, ScoreMissions, PenaltyMissions } ) + + local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions + local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions + + PlayerMessage = + string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )", + PlayerName, + PlayerScore - PlayerPenalty, + PlayerScore, + PlayerPenalty + ) + MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup ) + end + end + +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","TargetPlayerName","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 TargetPlayerName The name of the target 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, TargetPlayerName, 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( '"', '_' ) + + TargetPlayerName = TargetPlayerName or "" + TargetPlayerName = TargetPlayerName: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 + + TargetUnitCoalition = TargetUnitCoalition or "" + TargetUnitCategory = TargetUnitCategory or "" + TargetUnitType = TargetUnitType or "" + TargetUnitName = TargetUnitName or "" + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. TargetPlayerName .. '"' .. ',' .. + '"' .. 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 + +--- 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 + + + + + + + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Core.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() ) -- #CLEANUP + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + self:HandleEvent( EVENTS.Birth ) + + 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 Dcs.DCSWrapper.Group#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 + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSWrapper.Unit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param Dcs.DCSWrapper.Unit#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 + 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 Dcs.DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param Dcs.DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +--- @param #CLEANUP self +-- @param Core.Event#EVENTDATA EventData +function CLEANUP:_OnEventBirth( EventData ) + self:F( { EventData } ) + + self.CleanUpList[EventData.IniDCSUnitName] = {} + self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnit = EventData.IniDCSUnit + self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroup = EventData.IniDCSGroup + self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroupName = EventData.IniDCSGroupName + self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnitName = EventData.IniDCSUnitName + + EventData.IniUnit:HandleEvent( EVENTS.EngineShutdown , self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.EngineStartup, self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.Hit, self._EventAddForCleanUp ) + EventData.IniUnit:HandleEvent( EVENTS.PilotDead, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Dead, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Crash, self._EventCrash ) + EventData.IniUnit:HandleEvent( EVENTS.Shot, self._EventShot ) + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param Dcs.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. + -- 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 Dcs.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() + 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 Dcs.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 ) + 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 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSWrapper.Unit#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 Dcs.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 ) + + 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 + 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 + +--- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**All** -- +-- **Spawn groups of units dynamically in your missions.** +-- +-- ![Banner Image](..\Presentations\SPAWN\SPAWN.JPG) +-- +-- === +-- +-- # 1) @{#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 methods (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 represents the GROUP Template (definition). +-- * @{#SPAWN.NewWithAlias}(): Creates a new SPAWN object taking the name of the group that represents the GROUP Template (definition), and gives each spawned @{Group} an different name. +-- +-- 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 methods 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, which all start with the **Init** prefix: +-- +-- * @{#SPAWN.InitKeepUnitNames}(): Keeps the unit names as defined within the mission editor, but note that anything after a # mark is ignored, and any spaces before and after the resulting name are removed. IMPORTANT! This method MUST be the first used after :New !!! +-- * @{#SPAWN.InitLimit}(): Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.InitRandomizeRoute}(): Randomize the routes of spawned groups, and for air groups also optionally the height. +-- * @{#SPAWN.InitRandomizeTemplate}(): 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.InitUnControlled}(): Spawn plane groups uncontrolled. +-- * @{#SPAWN.InitArray}(): 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 methods are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- * @{#SPAWN.InitRandomizePosition}(): Randomizes the position of @{Group}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. +-- * @{#SPAWN.InitRandomizeUnits}(): Randomizes the @{Unit}s in the @{Group} that is spawned within a **radius band**, given an Outer and Inner radius. +-- * @{#SPAWN.InitRandomizeZones}(): Randomizes the spawning between a predefined list of @{Zone}s that are declared using this function. Each zone can be given a probability factor. +-- * @{#SPAWN.InitAIOn}(): Turns the AI On when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOff}(): Turns the AI Off when spawning the new @{Group} object. +-- * @{#SPAWN.InitAIOnOff}(): Turns the AI On or Off when spawning the new @{Group} object. +-- +-- ## 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.SpawnFromVec3}(): Spawn a new group from a Vec3 coordinate. (The group will can be spawned at a point in the air). +-- * @{#SPAWN.SpawnFromVec2}(): Spawn a new group from a Vec2 coordinate. (The group will be spawned at land height ). +-- * @{#SPAWN.SpawnFromStatic}(): Spawn a new group from a structure, taking the position of a @{Static}. +-- * @{#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) Retrieve alive GROUPs spawned by the SPAWN object +-- +-- The SPAWN class administers which GROUPS it has reserved (in stock) or has created during mission execution. +-- Every time a SPAWN object spawns a new GROUP object, a reference to the GROUP object is added to an internal table of GROUPS. +-- SPAWN provides methods to iterate through that internal GROUP object reference table: +-- +-- * @{#SPAWN.GetFirstAliveGroup}(): Will find the first alive GROUP it has spawned, and return the alive GROUP object and the first Index where the first alive GROUP object has been found. +-- * @{#SPAWN.GetNextAliveGroup}(): Will find the next alive GROUP object from a given Index, and return a reference to the alive GROUP object and the next Index where the alive GROUP has been found. +-- * @{#SPAWN.GetLastAliveGroup}(): Will find the last alive GROUP object, and will return a reference to the last live GROUP object and the last Index where the last alive GROUP object has been found. +-- +-- You can use the methods @{#SPAWN.GetFirstAliveGroup}() and sequently @{#SPAWN.GetNextAliveGroup}() to iterate through the alive GROUPS within the SPAWN object, and to actions... See the respective methods for an example. +-- The method @{#SPAWN.GetGroupFromIndex}() will return the GROUP object reference from the given Index, dead or alive... +-- +-- ## 1.5) 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.InitCleanUp}() 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.InitCleanUp}() for further info. +-- +-- ## 1.6) Catch the @{Group} spawn event in a callback function! +-- +-- When using the SpawnScheduled method, new @{Group}s are created following the schedule timing parameters. +-- When a new @{Group} is spawned, you maybe want to execute actions with that group spawned at the spawn event. +-- To SPAWN class supports this functionality through the @{#SPAWN.OnSpawnGroup}( **function( SpawnedGroup ) end ** ) method, which takes a function as a parameter that you can define locally. +-- Whenever a new @{Group} is spawned, the given function is called, and the @{Group} that was just spawned, is given as a parameter. +-- As a result, your spawn event handling function requires one parameter to be declared, which will contain the spawned @{Group} object. +-- A coding example is provided at the description of the @{#SPAWN.OnSpawnGroup}( **function( SpawnedGroup ) end ** ) method. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-14: SPAWN:**InitKeepUnitNames()** added. +-- 2017-03-14: SPAWN:**InitRandomizePosition( RandomizePosition, OuterRadious, InnerRadius )** added. +-- +-- 2017-02-04: SPAWN:InitUnControlled( **UnControlled** ) replaces SPAWN:InitUnControlled(). +-- +-- 2017-01-24: SPAWN:**InitAIOnOff( AIOnOff )** added. +-- +-- 2017-01-24: SPAWN:**InitAIOn()** added. +-- +-- 2017-01-24: SPAWN:**InitAIOff()** added. +-- +-- 2016-08-15: SPAWN:**InitCleanUp**( SpawnCleanUpInterval ) replaces SPAWN:_CleanUp_( SpawnCleanUpInterval ). +-- +-- 2016-08-15: SPAWN:**InitRandomizeZones( SpawnZones )** added. +-- +-- 2016-08-14: SPAWN:**OnSpawnGroup**( SpawnCallBackFunction, ... ) replaces SPAWN:_SpawnFunction_( SpawnCallBackFunction, ... ). +-- +-- 2016-08-14: SPAWN.SpawnInZone( Zone, __RandomizeGroup__, SpawnIndex ) replaces SpawnInZone( Zone, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ). +-- +-- 2016-08-14: SPAWN.SpawnFromVec3( Vec3, SpawnIndex ) replaces SpawnFromVec3( Vec3, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromVec2( Vec2, SpawnIndex ) replaces SpawnFromVec2( Vec2, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromUnit( SpawnUnit, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromStatic( SpawnStatic, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- 2016-08-14: SPAWN.**InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius )** added: +-- +-- 2016-08-14: SPAWN.**Init**Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) replaces SPAWN._Limit_( SpawnMaxUnitsAlive, SpawnMaxGroups ): +-- +-- 2016-08-14: SPAWN.**Init**Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) replaces SPAWN._Array_( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ). +-- +-- 2016-08-14: SPAWN.**Init**RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) replaces SPAWN._RandomizeRoute_( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ). +-- +-- 2016-08-14: SPAWN.**Init**RandomizeTemplate( SpawnTemplatePrefixTable ) replaces SPAWN._RandomizeTemplate_( SpawnTemplatePrefixTable ). +-- +-- 2016-08-14: SPAWN.**Init**UnControlled() replaces SPAWN._UnControlled_(). +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **Aaron**: Posed the idea for Group position randomization at SpawnInZone and make the Unit randomization separate from the Group randomization. +-- * [**Entropy**](https://forums.eagle.ru/member.php?u=111471), **Afinegan**: Came up with the requirement for AIOnOff(). +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module Spawn + + + +--- SPAWN Class +-- @type SPAWN +-- @extends Core.Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +-- @field #number AliveUnits +-- @field #number MaxAliveUnits +-- @field #number SpawnIndex +-- @field #number MaxAliveGroups +-- @field #SPAWN.SpawnZoneTable SpawnZoneTable +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + +--- @type SPAWN.SpawnZoneTable +-- @list SpawnZone + + +--- 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() ) -- #SPAWN + 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.SpawnInitLimit = false -- By default, no InitLimit + 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.AIOnOff = true -- The AI is on by default when spawning a group. + self.SpawnUnControlled = false + self.SpawnInitKeepUnitNames = false -- Overwrite unit names by default with group name. + + 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.SpawnInitLimit = false -- By default, no InitLimit + 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.AIOnOff = true -- The AI is on by default when spawning a group. + self.SpawnUnControlled = false + self.SpawnInitKeepUnitNames = false -- Overwrite unit names by default with group name. + + 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 method 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' ):InitLimit( 2, 24 ) +function SPAWN:InitLimit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnInitLimit = true + 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 + +--- Keeps the unit names as defined within the mission editor, +-- but note that anything after a # mark is ignored, +-- and any spaces before and after the resulting name are removed. +-- IMPORTANT! This method MUST be the first used after :New !!! +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitKeepUnitNames() + self:F( ) + + self.SpawnInitKeepUnitNames = true + + 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 ... +-- @param #number SpawnHeight (optional) Specifies the **additional** height in meters that can be added to the base height specified at each waypoint in the ME. +-- @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' ):InitRandomizeRoute( 2, 2, 2000 ) +function SPAWN:InitRandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + self.SpawnRandomizeRouteHeight = SpawnHeight + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + +--- Randomizes the position of @{Group}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. +-- @param #SPAWN self +-- @param #boolean RandomizePosition If true, SPAWN will perform the randomization of the @{Group}s position between a given outer and inner radius. +-- @param Dcs.DCSTypes#Distance OuterRadius (optional) The outer radius in meters where the new group will be spawned. +-- @param Dcs.DCSTypes#Distance InnerRadius (optional) The inner radius in meters where the new group will NOT be spawned. +-- @return #SPAWN +function SPAWN:InitRandomizePosition( RandomizePosition, OuterRadius, InnerRadius ) + self:F( { self.SpawnTemplatePrefix, RandomizePosition, OuterRadius, InnerRadius } ) + + self.SpawnRandomizePosition = RandomizePosition or false + self.SpawnRandomizePositionOuterRadius = OuterRadius or 0 + self.SpawnRandomizePositionInnerRadius = InnerRadius or 0 + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- Randomizes the UNITs that are spawned within a radius band given an Outer and Inner radius. +-- @param #SPAWN self +-- @param #boolean RandomizeUnits If true, SPAWN will perform the randomization of the @{UNIT}s position within the group between a given outer and inner radius. +-- @param Dcs.DCSTypes#Distance OuterRadius (optional) The outer radius in meters where the new group will be spawned. +-- @param Dcs.DCSTypes#Distance InnerRadius (optional) The inner radius in meters where the new group will NOT be spawned. +-- @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' ):InitRandomizeRoute( 2, 2, 2000 ) +function SPAWN:InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ) + self:F( { self.SpawnTemplatePrefix, RandomizeUnits, OuterRadius, InnerRadius } ) + + self.SpawnRandomizeUnits = RandomizeUnits or false + self.SpawnOuterRadius = OuterRadius or 0 + self.SpawnInnerRadius = InnerRadius or 0 + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + +--- This method is rather complicated to understand. But I'll try to explain. +-- This method 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' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):InitLimit( 12, 150 ):Schedule( 200, 0.4 ):InitRandomizeTemplate( Spawn_US_Platoon ):InitRandomizeRoute( 3, 3, 2000 ) +function SPAWN:InitRandomizeTemplate( 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 + +--TODO: Add example. +--- This method provides the functionality to randomize the spawning of the Groups at a given list of zones of different types. +-- @param #SPAWN self +-- @param #table SpawnZoneTable A table with @{Zone} objects. If this table is given, then each spawn will be executed within the given list of @{Zone}s objects. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 3 different zones for each new SPAWN the Group to be executed, regardless of the zone type. +function SPAWN:InitRandomizeZones( SpawnZoneTable ) + self:F( { self.SpawnTemplatePrefix, SpawnZoneTable } ) + + self.SpawnZoneTable = SpawnZoneTable + self.SpawnRandomizeZones = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeZones( 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 method 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():InitRandomizeRoute( 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:InitCleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup() + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + --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' ):InitLimit( 2, 24 ):InitArray( 90, "Diamond", 10, 100, 50 ) +function SPAWN:InitArray( 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 + +do -- AI methods + --- Turns the AI On or Off for the @{Group} when spawning. + -- @param #SPAWN self + -- @param #boolean AIOnOff A value of true sets the AI On, a value of false sets the AI Off. + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOnOff( AIOnOff ) + + self.AIOnOff = AIOnOff + return self + end + + --- Turns the AI On for the @{Group} when spawning. + -- @param #SPAWN self + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOn() + + return self:InitAIOnOff( true ) + end + + --- Turns the AI Off for the @{Group} when spawning. + -- @param #SPAWN self + -- @return #SPAWN The SPAWN object + function SPAWN:InitAIOff() + + return self:InitAIOnOff( false ) + end + +end -- AI methods + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex, self.AliveUnits } ) + + 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 Wrapper.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 ) + local WayPoints = SpawnGroup and SpawnGroup.WayPoints or nil + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSObject() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + local SpawnGroup = self:SpawnWithIndex( SpawnIndex ) + if SpawnGroup and WayPoints then + -- If there were WayPoints set, then Re-Execute those WayPoints! + SpawnGroup:WayPointInitialize( WayPoints ) + SpawnGroup:WayPointExecute( 1, 5 ) + end + + if SpawnGroup.ReSpawnFunction then + SpawnGroup:ReSpawnFunction() + end + + return SpawnGroup +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Wrapper.Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F2( { SpawnTemplatePrefix = self.SpawnTemplatePrefix, SpawnIndex = SpawnIndex, AliveUnits = self.AliveUnits, SpawnMaxGroups = self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + self:T( SpawnTemplate.name ) + + if SpawnTemplate then + + local PointVec3 = POINT_VEC3:New( SpawnTemplate.route.points[1].x, SpawnTemplate.route.points[1].alt, SpawnTemplate.route.points[1].y ) + self:T( { "Current point of ", self.SpawnTemplatePrefix, PointVec3 } ) + + -- If RandomizePosition, then Randomize the formation in the zone band, keeping the template. + if self.SpawnRandomizePosition then + local RandomVec2 = PointVec3:GetRandomVec2InRadius( self.SpawnRandomizePositionOuterRadius, self.SpawnRandomizePositionInnerRadius ) + local CurrentX = SpawnTemplate.units[1].x + local CurrentY = SpawnTemplate.units[1].y + SpawnTemplate.x = RandomVec2.x + SpawnTemplate.y = RandomVec2.y + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].x = SpawnTemplate.units[UnitID].x + ( RandomVec2.x - CurrentX ) + SpawnTemplate.units[UnitID].y = SpawnTemplate.units[UnitID].y + ( RandomVec2.y - CurrentY ) + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + end + + -- If RandomizeUnits, then Randomize the formation at the start point. + if self.SpawnRandomizeUnits then + for UnitID = 1, #SpawnTemplate.units do + local RandomVec2 = PointVec3:GetRandomVec2InRadius( self.SpawnOuterRadius, self.SpawnInnerRadius ) + SpawnTemplate.units[UnitID].x = RandomVec2.x + SpawnTemplate.units[UnitID].y = RandomVec2.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + end + + if SpawnTemplate.CategoryID == Group.Category.HELICOPTER or SpawnTemplate.CategoryID == Group.Category.AIRPLANE then + if SpawnTemplate.route.points[1].type == "TakeOffParking" then + SpawnTemplate.uncontrolled = self.SpawnUnControlled + end + end + end + + _EVENTDISPATCHER:OnBirthForTemplate( SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( SpawnTemplate, self._OnEngineShutDown, self ) + end + self:T3( SpawnTemplate.name ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( SpawnTemplate ) + + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Wrapper.Group#GROUP + + --TODO: Need to check if this function doesn't need to be scheduled, as the group may not be immediately there! + if SpawnGroup then + + SpawnGroup:SetAIOnOff( self.AIOnOff ) + end + + -- 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 method 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 method 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 SpawnCallBackFunction 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 +-- @usage +-- -- Declare SpawnObject and call a function when a new Group is spawned. +-- local SpawnObject = SPAWN +-- :New( "SpawnObject" ) +-- :InitLimit( 2, 10 ) +-- :OnSpawnGroup( +-- function( SpawnGroup ) +-- SpawnGroup:E( "I am spawned" ) +-- end +-- ) +-- :SpawnScheduled( 300, 0.3 ) +function SPAWN:OnSpawnGroup( SpawnCallBackFunction, ... ) + self:F( "OnSpawnGroup" ) + + self.SpawnFunctionHook = SpawnCallBackFunction + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + +--- Will spawn a group from a Vec3 in 3D space. +-- This method is mostly advisable to be used if you want to simulate spawning units in the air, like helicopters or airplanes. +-- 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 Dcs.DCSTypes#Vec3 Vec3 The Vec3 coordinates where to spawn the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Vec3, SpawnIndex } ) + + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + self:T2(PointVec3) + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + self:T( { "Current point of ", self.SpawnTemplatePrefix, Vec3 } ) + + -- Translate the position of the Group Template to the Vec3. + for UnitID = 1, #SpawnTemplate.units do + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + local UnitTemplate = SpawnTemplate.units[UnitID] + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = Vec3.x + ( SX - BX ) + local TY = Vec3.z + ( SY - BY ) + SpawnTemplate.units[UnitID].x = TX + SpawnTemplate.units[UnitID].y = TY + SpawnTemplate.units[UnitID].alt = Vec3.y + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + SpawnTemplate.route.points[1].x = Vec3.x + SpawnTemplate.route.points[1].y = Vec3.z + SpawnTemplate.route.points[1].alt = Vec3.y + + SpawnTemplate.x = Vec3.x + SpawnTemplate.y = Vec3.z + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + + return nil +end + +--- Will spawn a group from a Vec2 in 3D space. +-- This method is mostly advisable to be used if you want to simulate spawning groups on the ground from air units, like vehicles. +-- 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 Dcs.DCSTypes#Vec2 Vec2 The Vec2 coordinates where to spawn the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromVec2( Vec2, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Vec2, SpawnIndex } ) + + local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) + return self:SpawnFromVec3( PointVec2:GetVec3(), SpawnIndex ) +end + + +--- Will spawn a group from a hosting unit. This method 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 Wrapper.Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + return self:SpawnFromVec3( HostUnit:GetVec3(), SpawnIndex ) + end + + return nil +end + +--- Will spawn a group from a hosting static. This method is mostly advisable to be used if you want to simulate spawning from buldings and structures (static buildings). +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Wrapper.Static#STATIC HostStatic The static dropping or unloading the group. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromStatic( HostStatic, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostStatic, SpawnIndex } ) + + if HostStatic and HostStatic:IsAlive() then + return self:SpawnFromVec3( HostStatic:GetVec3(), SpawnIndex ) + end + + return nil +end + +--- Will spawn a Group within a given @{Zone}. +-- The @{Zone} can be of any type derived from @{Zone#ZONE_BASE}. +-- Once the @{Group} is spawned within the zone, the @{Group} will continue on its route. +-- The **first waypoint** (where the group is spawned) is replaced with the zone location coordinates. +-- @param #SPAWN self +-- @param Core.Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #boolean RandomizeGroup (optional) Randomization of the @{Group} position in the zone. +-- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. +-- @return Wrapper.Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, RandomizeGroup, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, SpawnIndex } ) + + if Zone then + if RandomizeGroup then + return self:SpawnFromVec2( Zone:GetRandomVec2(), SpawnIndex ) + else + return self:SpawnFromVec2( Zone:GetVec2(), SpawnIndex ) + end + end + + return nil +end + +--- (**AIR**) Will spawn a plane group in UnControlled or Controlled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- You can use UnControlled mode to simulate planes startup and ready for take-off but aren't moving (yet). +-- ReSpawn the plane in Controlled mode, and the plane will move... +-- @param #SPAWN self +-- @param #boolean UnControlled true if UnControlled, false if Controlled. +-- @return #SPAWN self +function SPAWN:InitUnControlled( UnControlled ) + self:F2( { self.SpawnTemplatePrefix, UnControlled } ) + + self.SpawnUnControlled = UnControlled + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = UnControlled + 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 + +--- Will find the first alive @{Group} it has spawned, and return the alive @{Group} object and the first Index where the first alive @{Group} object has been found. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP, #number The @{Group} object found, the new Index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +-- @usage +-- -- Find the first alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetFirstAliveGroup() +-- while GroupPlane ~= nil do +-- -- Do actions with the GroupPlane object. +-- GroupPlane, Index = SpawnPlanes:GetNextAliveGroup( Index ) +-- end +function SPAWN:GetFirstAliveGroup() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + return SpawnGroup, SpawnIndex + end + end + + return nil, nil +end + + +--- Will find the next alive @{Group} object from a given Index, and return a reference to the alive @{Group} object and the next Index where the alive @{Group} has been found. +-- @param #SPAWN self +-- @param #number SpawnIndexStart A Index holding the start position to search from. This method can also be used to find the first alive @{Group} object from the given Index. +-- @return Wrapper.Group#GROUP, #number The next alive @{Group} object found, the next Index where the next alive @{Group} object was found. +-- @return #nil, #nil When no alive @{Group} object is found from the start Index position, #nil is returned. +-- @usage +-- -- Find the first alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetFirstAliveGroup() +-- while GroupPlane ~= nil do +-- -- Do actions with the GroupPlane object. +-- GroupPlane, Index = SpawnPlanes:GetNextAliveGroup( Index ) +-- end +function SPAWN:GetNextAliveGroup( SpawnIndexStart ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndexStart } ) + + SpawnIndexStart = SpawnIndexStart + 1 + for SpawnIndex = SpawnIndexStart, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + return SpawnGroup, SpawnIndex + end + end + + return nil, nil +end + +--- Will find the last alive @{Group} object, and will return a reference to the last live @{Group} object and the last Index where the last alive @{Group} object has been found. +-- @param #SPAWN self +-- @return Wrapper.Group#GROUP, #number The last alive @{Group} object found, the last Index where the last alive @{Group} object was found. +-- @return #nil, #nil When no alive @{Group} object is found, #nil is returned. +-- @usage +-- -- Find the last alive @{Group} object of the SpawnPlanes SPAWN object @{Group} collection that it has spawned during the mission. +-- local GroupPlane, Index = SpawnPlanes:GetLastAliveGroup() +-- if GroupPlane then -- GroupPlane can be nil!!! +-- -- Do actions with the GroupPlane object. +-- end +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 Wrapper.Group#GROUP self +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 Dcs.DCSWrapper.Unit#Unit DCSUnit The @{DCSUnit} to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + local SpawnUnitName = ( DCSUnit and DCSUnit:getName() ) or nil + if SpawnUnitName then + local IndexString = string.match( SpawnUnitName, "#.*-" ):sub( 2, -2 ) + if IndexString then + local Index = tonumber( IndexString ) + return Index + end + end + + return nil +end + +--- Return the prefix of a SpawnUnit. +-- 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 Dcs.DCSWrapper.Unit#UNIT DCSUnit The @{DCSUnit} to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + local DCSGroup = DCSUnit:getGroup() + local DCSUnitName = ( DCSGroup and DCSGroup:getName() ) or nil + if DCSUnitName then + local SpawnPrefix = string.match( DCSUnitName, ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +-- @param #SPAWN self +-- @param Dcs.DCSWrapper.Unit#Unit DCSUnit The @{DCSUnit} to be searched. +-- @return Wrapper.Group#GROUP The Group +-- @return #nil Nothing found +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + 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 + + 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:F3( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T3( 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. +-- @param #SPAWN self +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F3( { 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:T3( { 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 + + if SpawnTemplate.CategoryID == Group.Category.GROUND then + self:T3( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false + end + + if self.SpawnInitKeepUnitNames == false then + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + end + else + for UnitID = 1, #SpawnTemplate.units do + local UnitPrefix, Rest = string.match( SpawnTemplate.units[UnitID].name, "^([^#]+)#?" ):gsub( "^%s*(.-)%s*$", "%1" ) + self:T( { UnitPrefix, Rest } ) + + SpawnTemplate.units[UnitID].name = string.format( '%s#%03d-%02d', UnitPrefix, SpawnIndex, UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + end + end + + self:T3( { "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 ) + + -- Manage randomization of altitude for airborne units ... + if SpawnTemplate.CategoryID == Group.Category.AIRPLANE or SpawnTemplate.CategoryID == Group.Category.HELICOPTER then + if SpawnTemplate.route.points[t].alt and self.SpawnRandomizeRouteHeight then + SpawnTemplate.route.points[t].alt = SpawnTemplate.route.points[t].alt + math.random( 1, self.SpawnRandomizeRouteHeight ) + end + else + SpawnTemplate.route.points[t].alt = nil + end + + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + self:_RandomizeZones( SpawnIndex ) + + 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 + local OldX = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].x + local OldY = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].y + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x = self.SpawnTemplate.units[1].x + ( self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x - OldX ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y = self.SpawnTemplate.units[1].y + ( self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y - OldY ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].alt = self.SpawnTemplate.units[1].alt + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +--- Private method that randomizes the @{Zone}s where the Group will be spawned. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeZones( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeZones } ) + + if self.SpawnRandomizeZones then + local SpawnZone = nil -- Core.Zone#ZONE_BASE + while not SpawnZone do + self:T( { SpawnZoneTableCount = #self.SpawnZoneTable, self.SpawnZoneTable } ) + local ZoneID = math.random( #self.SpawnZoneTable ) + self:T( ZoneID ) + SpawnZone = self.SpawnZoneTable[ ZoneID ]:GetZoneMaybe() + end + + self:T( "Preparing Spawn in Zone", SpawnZone:GetName() ) + + local SpawnVec2 = SpawnZone:GetRandomVec2() + + self:T( { SpawnVec2 = SpawnVec2 } ) + + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + + self:T( { Route = SpawnTemplate.route } ) + + for UnitID = 1, #SpawnTemplate.units do + local UnitTemplate = SpawnTemplate.units[UnitID] + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = SpawnVec2.x + ( SX - BX ) + local TY = SpawnVec2.y + ( SY - BY ) + UnitTemplate.x = TX + UnitTemplate.y = TY + -- TODO: Manage altitude based on landheight... + --SpawnTemplate.units[UnitID].alt = SpawnVec2: + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + end + SpawnTemplate.x = SpawnVec2.x + SpawnTemplate.y = SpawnVec2.y + SpawnTemplate.route.points[1].x = SpawnVec2.x + SpawnTemplate.route.points[1].y = SpawnVec2.y + end + + 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 method is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F2( { 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.SpawnTemplate.units <= self.SpawnMaxUnitsAlive ) or self.UnControlled == true 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 ... + +--- @param #SPAWN self +-- @param Core.Event#EVENTDATA Event +function SPAWN:_OnBirth( Event ) + + if timer.getTime0() < timer.getAbsTime() then + if Event.IniDCSUnit then + local EventPrefix = self:_GetPrefixFromDCSUnit( Event.IniDCSUnit ) + self:T( { "Birth Event:", EventPrefix, self.SpawnTemplatePrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... + +--- @param #SPAWN self +-- @param Core.Event#EVENTDATA Event +function SPAWN:_OnDeadOrCrash( Event ) + self:F( self.SpawnTemplatePrefix, Event ) + + if Event.IniDCSUnit then + local EventPrefix = self:_GetPrefixFromDCSUnit( Event.IniDCSUnit ) + self:T( { "Dead event: " .. EventPrefix, self.SpawnTemplatePrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end +end + +--- 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:F2( { "_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 + +--- Schedules the CleanUp of Groups +-- @param #SPAWN self +-- @return #boolean True = Continue Scheduler +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup() + self:T( { "CleanUp Scheduler:", SpawnGroup, SpawnCursor } ) + + while SpawnGroup do + + local SpawnUnits = SpawnGroup:GetUnits() + + for UnitID, UnitData in pairs( SpawnUnits ) do + + local SpawnUnit = UnitData -- Wrapper.Unit#UNIT + local SpawnUnitName = SpawnUnit:GetName() + + + self.SpawnCleanUpTimeStamps[SpawnUnitName] = self.SpawnCleanUpTimeStamps[SpawnUnitName] or {} + local Stamp = self.SpawnCleanUpTimeStamps[SpawnUnitName] + self:T( { SpawnUnitName, Stamp } ) + + if Stamp.Vec2 then + if SpawnUnit:InAir() == false and SpawnUnit:GetVelocityKMH() < 1 then + local NewVec2 = SpawnUnit:GetVec2() + if Stamp.Vec2.x == NewVec2.x and Stamp.Vec2.y == NewVec2.y then + -- If the plane is not moving, and is on the ground, assign it with a timestamp... + if Stamp.Time + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "ReSpawning:", SpawnGroup:GetName() } ) + self:ReSpawn( SpawnCursor ) + Stamp.Vec2 = nil + Stamp.Time = nil + end + else + Stamp.Time = timer.getTime() + Stamp.Vec2 = SpawnUnit:GetVec2() + end + else + Stamp.Vec2 = nil + Stamp.Time = nil + end + else + if SpawnUnit:InAir() == false then + Stamp.Vec2 = SpawnUnit:GetVec2() + if SpawnUnit:GetVelocityKMH() < 1 then + Stamp.Time = timer.getTime() + end + else + Stamp.Time = nil + Stamp.Vec2 = nil + end + end + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup, SpawnCursor } ) + + 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 + +--- the MOVEMENT class +-- @type MOVEMENT +-- @extends Core.Base#BASE +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() ) -- #MOVEMENT + 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. + + self:HandleEvent( EVENTS.Birth ) + +-- 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. +-- @param #MOVEMENT self +-- @param Core.Event#EVENTDATA self +function MOVEMENT:OnEventBirth( EventData ) + self:F( { EventData } ) + + 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 EventData.IniDCSUnit then + self:T( "Birth object : " .. EventData.IniDCSUnitName ) + if EventData.IniDCSGroup and EventData.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( EventData.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[EventData.IniDCSUnitName] = EventData.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + + EventData.IniUnit:HandleEvent( EVENTS.DEAD, self.OnDeadOrCrash ) + 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) + +--- The SEAD class +-- @type SEAD +-- @extends Core.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 + + self:HandleEvent( EVENTS.Shot ) + + 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 +-- @param #SEAD +-- @param Core.Event#EVENTDATA EventData +function SEAD:OnEventShot( EventData ) + self:F( { EventData } ) + + local SEADUnit = EventData.IniDCSUnit + local SEADUnitName = EventData.IniDCSUnitName + local SEADWeapon = EventData.Weapon -- Identify the weapon fired + local SEADWeaponName = EventData.WeaponName -- return weapon type + -- 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 = EventData.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 ) + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) + 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 (F10) 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. +-- +-- +-- @usage +-- -- Declare a new EscortPlanes object as follows: +-- +-- -- First find the GROUP object and the CLIENT object. +-- local EscortClient = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. +-- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- +-- -- Now use these 2 objects to construct the new EscortPlanes object. +-- EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) +-- +-- +-- +-- @module Escort +-- @author FlightControl + +--- ESCORT class +-- @type ESCORT +-- @extends Core.Base#BASE +-- @field Wrapper.Client#CLIENT EscortClient +-- @field Wrapper.Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field Core.Scheduler#SCHEDULER FollowScheduler The instance of the SCHEDULER class. +-- @field #number FollowDistance The current follow distance. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field Dcs.DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field Dcs.DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Core.Menu#MENU_CLIENT EscortMenuResumeMission +-- @field Functional.Detection#DETECTION_BASE Detection +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = 1, + 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, + SmokeDirectionVector = false, + 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 Wrapper.Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Wrapper.Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @param #string EscortBriefing A text showing the ESCORT briefing to the player. Note that if no EscortBriefing is provided, the default briefing will be shown. +-- @return #ESCORT self +-- @usage +-- -- Declare a new EscortPlanes object as follows: +-- +-- -- First find the GROUP object and the CLIENT object. +-- local EscortClient = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. +-- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- +-- -- Now use these 2 objects to construct the new EscortPlanes object. +-- EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + + local self = BASE:Inherit( self, BASE:New() ) -- #ESCORT + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Wrapper.Client#CLIENT + self.EscortGroup = EscortGroup -- Wrapper.Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self.EscortSetGroup = SET_GROUP:New() + self.EscortSetGroup:AddObject( self.EscortGroup ) + self.EscortSetGroup:Flush() + self.Detection = DETECTION_UNITS:New( self.EscortSetGroup, 15000 ) + + self.EscortGroup.Detection = self.Detection + + -- 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()].Detection = self.EscortGroup.Detection + end + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + if not EscortBriefing then + 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 + ) + else + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") " .. EscortBriefing, + 60, EscortClient + ) + end + + self.FollowDistance = 100 + self.CT1 = 0 + self.GT1 = 0 + + self.FollowScheduler, self.FollowSchedule = SCHEDULER:New( self, self._FollowScheduler, {}, 1, .5, .01 ) + self.FollowScheduler:Stop( self.FollowSchedule ) + + self.EscortMode = ESCORT.MODE.MISSION + + + return self +end + +--- Set a Detection method for the EscortClient to be reported upon. +-- Detection methods are based on the derived classes from DETECTION_BASE. +-- @param #ESCORT self +-- @param Function.Detection#DETECTION_BASE Detection +function ESCORT:SetDetection( Detection ) + + self.Detection = Detection + self.EscortGroup.Detection = self.Detection + self.EscortClient._EscortGroups[self.EscortGroup:GetName()].Detection = self.EscortGroup.Detection + + Detection:__Start( 1 ) + +end + +--- This function is for test, it will put on the frequency of the FollowScheduler a red smoke at the direction vector calculated for the escort to fly to. +-- This allows to visualize where the escort is flying to. +-- @param #ESCORT self +-- @param #boolean SmokeDirection If true, then the direction vector will be smoked. +function ESCORT:TestSmokeDirectionVector( SmokeDirection ) + self.SmokeDirectionVector = ( SmokeDirection == true ) and true or false +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 Dcs.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, self, 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 Dcs.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 Dcs.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, + self, + self.EscortGroup, + Height, + 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 Dcs.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 Dcs.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 Dcs.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 Dcs.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, + self, + 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, self ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Green, "Released a green flare!" ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Red, "Released a red flare!" ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.White, "Released a white flare!" ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, self, FLARECOLOR.Yellow, "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, self ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Green, "Releasing green smoke!" ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Red, "Releasing red smoke!" ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.White, "Releasing white smoke!" ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Orange, "Releasing orange smoke!" ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, self, SMOKECOLOR.Blue, "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 Dcs.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, self ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, self, true ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, self, false ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + 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, self, self.EscortGroup:OptionROEHoldFire(), "Holding weapons!" ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, self, self.EscortGroup:OptionROEReturnFire(), "Returning fire!" ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, self, self.EscortGroup:OptionROEOpenFire(), "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, self, self.EscortGroup:OptionROEWeaponFree(), "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, self, self.EscortGroup:OptionROTNoReaction(), "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, self, self.EscortGroup:OptionROTPassiveDefense(), "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, self, self.EscortGroup:OptionROTEvadeFire(), "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, self, self.EscortGroup:OptionROTVertical(), "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( OrbitGroup, OrbitHeight, OrbitSeconds ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitUnit = OrbitGroup:GetUnit(1) -- Wrapper.Unit#UNIT + + self.FollowScheduler:Stop( self.FollowSchedule ) + + local PointFrom = {} + local GroupVec3 = EscortGroup:GetUnit(1):GetVec3() + PointFrom = {} + PointFrom.x = GroupVec3.x + PointFrom.y = GroupVec3.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupVec3.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetVec2() + 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( Distance ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = Distance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Functional.Escort#ESCORT self +-- @param Wrapper.Group#GROUP EscortGroup +-- @param Wrapper.Client#CLIENT EscortClient +-- @param Dcs.DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + self.FollowScheduler:Stop( self.FollowSchedule ) + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + self.FollowScheduler:Start( self.FollowSchedule ) + + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_Flare( Color, Message ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_Smoke( Color, Message ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT:_ReportNearbyTargetsNow() + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT:_SwitchReportNearbyTargets( ReportTargets ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = ReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + self.ReportTargetsScheduler:Schedule( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ScanTargets( ScanDuration ) + + local EscortGroup = self.EscortGroup -- Wrapper.Group#GROUP + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroup:IsHelicopter() then + EscortGroup:PushTask( + EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ), 1 ) + elseif EscortGroup:IsAirPlane() then + 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:Start( self.FollowSchedule ) + end + +end + +--- @param Wrapper.Group#GROUP EscortGroup +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup:GetState( EscortGroup, "Escort" ) + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #ESCORT self +-- @param #number DetectedItemID +function ESCORT:_AttackTarget( DetectedItemID ) + + local EscortGroup = self.EscortGroup -- Wrapper.Group#GROUP + self:E( EscortGroup ) + + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup:SetState( EscortGroup, "Escort", self ) + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroup:TaskAttackUnit( DetectedUnit ) + end + end, Tasks + ) + + Tasks[#Tasks+1] = EscortGroup:TaskFunction( 1, 2, "_Resume", { "''" } ) + + EscortGroup:SetTask( + EscortGroup:TaskCombo( + Tasks + ), 1 + ) + + else + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroup:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) + end + end, Tasks + ) + + EscortGroup:SetTask( + EscortGroup:TaskCombo( + Tasks + ), 1 + ) + + end + + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + +end + +--- +-- @param #number DetectedItemID +function ESCORT:_AssistTarget( EscortGroupAttack, DetectedItemID ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() + + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroupAttack:TaskAttackUnit( DetectedUnit ) + end + end, Tasks + ) + + Tasks[#Tasks+1] = EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + + EscortGroupAttack:SetTask( + EscortGroupAttack:TaskCombo( + Tasks + ), 1 + ) + + else + local DetectedSet = self.Detection:GetDetectedSet( DetectedItemID ) + + local Tasks = {} + + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit, Tasks ) + if DetectedUnit:IsAlive() then + Tasks[#Tasks+1] = EscortGroupAttack:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) + end + end, Tasks + ) + + EscortGroupAttack:SetTask( + EscortGroupAttack:TaskCombo( + Tasks + ), 1 + ) + + end + + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ROE( EscortROEFunction, EscortROEMessage ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ROT( EscortROTFunction, EscortROTMessage ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT:_ResumeMission( WayPoint ) + + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.FollowScheduler:Stop( self.FollowSchedule ) + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + 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 -- Wrapper.Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Functional.Escort#ESCORT self +function ESCORT:_FollowScheduler() + self:F( { self.FollowDistance } ) + + self:T( {self.EscortClient.UnitName, self.EscortGroup.GroupName } ) + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + local FollowDistance = self.FollowDistance + + self:T( {ClientUnit.UnitName, GroupUnit.UnitName } ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetVec3() + self:T( { "self.CV1", self.CV1 } ) + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetVec3() + 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:GetVec3() + 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 } + + if self.SmokeDirectionVector == true then + trigger.action.smoke( GDV, trigger.smokeColor.Red ) + end + + 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, FollowDistance, Time:", CS, GS, Speed, FollowDistance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:RouteToVec3( 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 + + if true then + + local EscortGroupName = self.EscortGroup:GetName() + + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + local DetectedItems = self.Detection:GetDetectedItems() + self:E( DetectedItems ) + + local DetectedTargets = false + + local DetectedMsgs = {} + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + local ClientEscortTargets = EscortGroupData.Detection + + for DetectedItemID, DetectedItem in ipairs( DetectedItems ) do + self:E( { DetectedItemID, DetectedItem } ) + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + + local DetectedItemReportSummary = self.Detection:DetectedItemReportSummary( DetectedItemID ) + + if ClientEscortGroupName == EscortGroupName then + + DetectedMsgs[#DetectedMsgs+1] = DetectedItemReportSummary + + MENU_CLIENT_COMMAND:New( self.EscortClient, + DetectedItemReportSummary, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + self, + DetectedItemID + ) + else + if self.EscortMenuTargetAssistance then + + self:T( DetectedItemReportSummary ) + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + DetectedItemReportSummary, + MenuTargetAssistance, + ESCORT._AssistTarget, + self, + EscortGroupData.EscortGroup, + DetectedItemID + ) + end + end + + DetectedTargets = true + + end + end + self:E( DetectedMsgs ) + if DetectedTargets then + self.EscortGroup:MessageToClient( "Detected targets:\n" .. table.concat( DetectedMsgs, "\n" ), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected.", 10, self.EscortClient ) + end + + return true + else +-- 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 EscortTargetUnitVec3 = EscortTargetUnit:GetVec3() +-- local EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( EscortTargetUnitVec3.x - EscortVec3.x )^2 + +-- ( EscortTargetUnitVec3.y - EscortVec3.y )^2 + +-- ( EscortTargetUnitVec3.z - EscortVec3.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 EscortTargetUnitVec3 = ClientEscortTargetData.AttackUnit:GetVec3() +-- local EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( EscortTargetUnitVec3.x - EscortVec3.x )^2 + +-- ( EscortTargetUnitVec3.y - EscortVec3.y )^2 + +-- ( EscortTargetUnitVec3.z - EscortVec3.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, +-- self, +-- EscortGroupData.EscortGroup, +-- 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 EscortVec3 = self.EscortGroup:GetVec3() +-- local Distance = ( ( WayPoint.x - EscortVec3.x )^2 + +-- ( WayPoint.y - EscortVec3.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 + end + + return false +end +--- This module contains the MISSILETRAINER class. +-- +-- === +-- +-- 1) @{MissileTrainer#MISSILETRAINER} class, extends @{Base#BASE} +-- =============================================================== +-- 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. +-- +-- +-- 1.1) 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. +-- +-- 1.2) 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. +-- +-- === +-- +-- CREDITS +-- ======= +-- **Stuka (Danny)** Who you can search on the Eagle Dynamics Forums. +-- Working together with Danny has resulted in the MISSILETRAINER class. +-- Danny has shared his ideas and together we made a design. +-- Together with the **476 virtual team**, we tested the MISSILETRAINER class, and got much positive feedback! +-- +-- @module MissileTrainer +-- @author FlightControl + + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @field Core.Set#SET_CLIENT DBClients +-- @extends Core.Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", + TrackingMissiles = {}, +} + +function MISSILETRAINER._Alive( Client, self ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "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, "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 + +--- 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 + + self:HandleEvent( EVENTS.Shot ) + + self.DBClients = SET_CLIENT:New():FilterStart() + + +-- for ClientID, Client in pairs( self.DBClients.Database ) do +-- self:E( "ForEach:" .. Client.UnitName ) +-- Client:Alive( self._Alive, self ) +-- end +-- + self.DBClients:ForEachClient( + function( Client ) + self:E( "ForEach:" .. Client.UnitName ) + Client:Alive( self._Alive, self ) + end + ) + + + +-- self.DB:ForEachClient( +-- --- @param Wrapper.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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Messages OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):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.", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Range display OFF", 15, "Menu" ):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", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):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)", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):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", 15, "Menu" ):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 Core.Event#EVENTDATA EventData +function MISSILETRAINER:OnEventShot( EVentData ) + self:F( { EVentData } ) + + local TrainerSourceDCSUnit = EVentData.IniDCSUnit + local TrainerSourceDCSUnitName = EVentData.IniDCSUnitName + local TrainerWeapon = EVentData.Weapon -- Identify the weapon fired + local TrainerWeaponName = EVentData.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + if TrainerTargetDCSUnit then + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients:FindClient( 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 ), 5, "Launch Alert" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + 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 + else + -- TODO: some weapons don't know the target unit... Need to develop a workaround for this. + if ( TrainerWeapon:getTypeName() == "9M311" ) then + SCHEDULER:New( TrainerWeapon, TrainerWeapon.destroy, {}, 1 ) + else + end + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local TargetVec3 = Client:GetVec3() + + local Range = ( ( PositionMissile.x - TargetVec3.x )^2 + + ( PositionMissile.y - TargetVec3.y )^2 + + ( PositionMissile.z - TargetVec3.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 TargetVec3 = Client:GetVec3() + + self:T2( { TargetVec3, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - TargetVec3.x, y = PositionMissile.y - TargetVec3.y, z = PositionMissile.z - TargetVec3.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 TargetVec3 = Client:GetVec3() + + local Distance = ( ( PositionMissile.x - TargetVec3.x )^2 + + ( PositionMissile.y - TargetVec3.y )^2 + + ( PositionMissile.z - TargetVec3.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() + ), 15, "Hit Alert" ) + + 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() + ), 5, "Tracking" ) + + 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, 1, "Tracking" ):ToClient( Client ) + end + end + end + + return true +end +--- This module contains the AIRBASEPOLICE classes. +-- +-- === +-- +-- 1) @{AirbasePolice#AIRBASEPOLICE_BASE} class, extends @{Base#BASE} +-- ================================================================== +-- The @{AirbasePolice#AIRBASEPOLICE_BASE} class provides the main methods to monitor CLIENT behaviour at airbases. +-- CLIENTS should not be allowed to: +-- +-- * Don't taxi faster than 40 km/h. +-- * Don't take-off on taxiways. +-- * Avoid to hit other planes on the airbase. +-- * Obey ground control orders. +-- +-- 2) @{AirbasePolice#AIRBASEPOLICE_CAUCASUS} class, extends @{AirbasePolice#AIRBASEPOLICE_BASE} +-- ============================================================================================= +-- All the airbases on the caucasus map can be monitored using this class. +-- If you want to monitor specific airbases, you need to use the @{#AIRBASEPOLICE_BASE.Monitor}() method, which takes a table or airbase names. +-- The following names can be given: +-- * AnapaVityazevo +-- * Batumi +-- * Beslan +-- * Gelendzhik +-- * Gudauta +-- * Kobuleti +-- * KrasnodarCenter +-- * KrasnodarPashkovsky +-- * Krymsk +-- * Kutaisi +-- * MaykopKhanskaya +-- * MineralnyeVody +-- * Mozdok +-- * Nalchik +-- * Novorossiysk +-- * SenakiKolkhi +-- * SochiAdler +-- * Soganlug +-- * SukhumiBabushara +-- * TbilisiLochini +-- * Vaziani +-- +-- 3) @{AirbasePolice#AIRBASEPOLICE_NEVADA} class, extends @{AirbasePolice#AIRBASEPOLICE_BASE} +-- ============================================================================================= +-- All the airbases on the NEVADA map can be monitored using this class. +-- If you want to monitor specific airbases, you need to use the @{#AIRBASEPOLICE_BASE.Monitor}() method, which takes a table or airbase names. +-- The following names can be given: +-- * Nellis +-- * McCarran +-- * Creech +-- * Groom Lake +-- +-- ### Contributions: Dutch Baron - Concept & Testing +-- ### Author: FlightControl - Framework Design & Programming +-- +-- @module AirbasePolice + + + + + +--- @type AIRBASEPOLICE_BASE +-- @field Core.Set#SET_CLIENT SetClient +-- @extends Core.Base#BASE + +AIRBASEPOLICE_BASE = { + ClassName = "AIRBASEPOLICE_BASE", + SetClient = nil, + Airbases = nil, + AirbaseNames = nil, +} + + +--- Creates a new AIRBASEPOLICE_BASE object. +-- @param #AIRBASEPOLICE_BASE self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @param Airbases A table of Airbase Names. +-- @return #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:New( SetClient, Airbases ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + self:E( { self.ClassName, SetClient, Airbases } ) + + self.SetClient = SetClient + self.Airbases = Airbases + + for AirbaseID, Airbase in pairs( self.Airbases ) do + Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do + Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(SMOKECOLOR.Red):Flush() + end + end + +-- -- Template +-- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) +-- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) +-- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + + self.SetClient:ForEachClient( + --- @param Wrapper.Client#CLIENT Client + function( Client ) + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0) + Client:SetState( self, "Taxi", false ) + end + ) + + self.AirbaseMonitor = SCHEDULER:New( self, self._AirbaseMonitor, {}, 0, 2, 0.05 ) + + return self +end + +--- @type AIRBASEPOLICE_BASE.AirbaseNames +-- @list <#string> + +--- Monitor a table of airbase names. +-- @param #AIRBASEPOLICE_BASE self +-- @param #AIRBASEPOLICE_BASE.AirbaseNames AirbaseNames A list of AirbaseNames to monitor. If this parameters is nil, then all airbases will be monitored. +-- @return #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:Monitor( AirbaseNames ) + + if AirbaseNames then + if type( AirbaseNames ) == "table" then + self.AirbaseNames = AirbaseNames + else + self.AirbaseNames = { AirbaseNames } + end + end +end + +--- @param #AIRBASEPOLICE_BASE self +function AIRBASEPOLICE_BASE:_AirbaseMonitor() + + for AirbaseID, Airbase in pairs( self.Airbases ) do + + if not self.AirbaseNames or self.AirbaseNames[AirbaseID] then + + self:E( AirbaseID ) + + self.SetClient:ForEachClientInZone( Airbase.ZoneBoundary, + + --- @param Wrapper.Client#CLIENT Client + function( Client ) + + self:E( Client.UnitName ) + if Client:IsAlive() then + local NotInRunwayZone = true + for ZoneRunwayID, ZoneRunway in pairs( Airbase.ZoneRunways ) do + NotInRunwayZone = ( Client:IsNotInZone( ZoneRunway ) == true ) and NotInRunwayZone or false + end + + if NotInRunwayZone then + local Taxi = self:GetState( self, "Taxi" ) + self:E( Taxi ) + if Taxi == false then + Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. Airbase.MaximumSpeed " km/h.", 20, "ATC" ) + self:SetState( self, "Taxi", true ) + end + + -- TODO: GetVelocityKMH function usage + local VelocityVec3 = Client:GetVelocity() + local Velocity = ( VelocityVec3.x ^ 2 + VelocityVec3.y ^ 2 + VelocityVec3.z ^ 2 ) ^ 0.5 -- in meters / sec + local Velocity = Velocity * 3.6 -- now it is in km/h. + -- MESSAGE:New( "Velocity = " .. Velocity, 1 ):ToAll() + local IsAboveRunway = Client:IsAboveRunway() + local IsOnGround = Client:InAir() == false + self:T( IsAboveRunway, IsOnGround ) + + if IsAboveRunway and IsOnGround then + + if Velocity > Airbase.MaximumSpeed then + local IsSpeeding = Client:GetState( self, "Speeding" ) + + if IsSpeeding == true then + local SpeedingWarnings = Client:GetState( self, "Warnings" ) + self:T( SpeedingWarnings ) + + if SpeedingWarnings <= 3 then + Client:Message( "You are speeding on the taxiway! Slow down or you will be removed from this airbase! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Warning " .. SpeedingWarnings .. " / 3" ) + Client:SetState( self, "Warnings", SpeedingWarnings + 1 ) + else + MESSAGE:New( "Player " .. Client:GetPlayerName() .. " has been removed from the airbase, due to a speeding violation ...", 10, "Airbase Police" ):ToAll() + Client:Destroy() + trigger.action.setUserFlag( "AIRCRAFT_"..Client:GetID(), 100) + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + end + + else + Client:Message( "You are speeding on the taxiway, slow down now! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Attention! " ) + Client:SetState( self, "Speeding", true ) + Client:SetState( self, "Warnings", 1 ) + end + + else + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + end + end + + else + Client:SetState( self, "Speeding", false ) + Client:SetState( self, "Warnings", 0 ) + local Taxi = self:GetState( self, "Taxi" ) + if Taxi == true then + Client:Message( "You have progressed to the runway ... Await take-off clearance ...", 20, "ATC" ) + self:SetState( self, "Taxi", false ) + end + end + end + end + ) + end + end + + return true +end + + +--- @type AIRBASEPOLICE_CAUCASUS +-- @field Core.Set#SET_CLIENT SetClient +-- @extends #AIRBASEPOLICE_BASE + +AIRBASEPOLICE_CAUCASUS = { + ClassName = "AIRBASEPOLICE_CAUCASUS", + Airbases = { + AnapaVityazevo = { + PointsBoundary = { + [1]={["y"]=242234.85714287,["x"]=-6616.5714285726,}, + [2]={["y"]=241060.57142858,["x"]=-5585.142857144,}, + [3]={["y"]=243806.2857143,["x"]=-3962.2857142868,}, + [4]={["y"]=245240.57142858,["x"]=-4816.5714285726,}, + [5]={["y"]=244783.42857144,["x"]=-5630.8571428583,}, + [6]={["y"]=243800.57142858,["x"]=-5065.142857144,}, + [7]={["y"]=242232.00000001,["x"]=-6622.2857142868,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=242140.57142858,["x"]=-6478.8571428583,}, + [2]={["y"]=242188.57142858,["x"]=-6522.0000000011,}, + [3]={["y"]=244124.2857143,["x"]=-4344.0000000011,}, + [4]={["y"]=244068.2857143,["x"]=-4296.5714285726,}, + [5]={["y"]=242140.57142858,["x"]=-6480.0000000011,} + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Batumi = { + PointsBoundary = { + [1]={["y"]=617567.14285714,["x"]=-355313.14285715,}, + [2]={["y"]=616181.42857142,["x"]=-354800.28571429,}, + [3]={["y"]=616007.14285714,["x"]=-355128.85714286,}, + [4]={["y"]=618230,["x"]=-356914.57142858,}, + [5]={["y"]=618727.14285714,["x"]=-356166,}, + [6]={["y"]=617572.85714285,["x"]=-355308.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=616442.28571429,["x"]=-355090.28571429,}, + [2]={["y"]=618450.57142857,["x"]=-356522,}, + [3]={["y"]=618407.71428571,["x"]=-356584.85714286,}, + [4]={["y"]=618361.99999999,["x"]=-356554.85714286,}, + [5]={["y"]=618324.85714285,["x"]=-356599.14285715,}, + [6]={["y"]=618250.57142856,["x"]=-356543.42857143,}, + [7]={["y"]=618257.7142857,["x"]=-356496.28571429,}, + [8]={["y"]=618237.7142857,["x"]=-356459.14285715,}, + [9]={["y"]=616555.71428571,["x"]=-355258.85714286,}, + [10]={["y"]=616486.28571428,["x"]=-355280.57142858,}, + [11]={["y"]=616410.57142856,["x"]=-355227.71428572,}, + [12]={["y"]=616441.99999999,["x"]=-355179.14285715,}, + [13]={["y"]=616401.99999999,["x"]=-355147.71428572,}, + [14]={["y"]=616441.42857142,["x"]=-355092.57142858,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Beslan = { + PointsBoundary = { + [1]={["y"]=842082.57142857,["x"]=-148445.14285715,}, + [2]={["y"]=845237.71428572,["x"]=-148639.71428572,}, + [3]={["y"]=845232,["x"]=-148765.42857143,}, + [4]={["y"]=844220.57142857,["x"]=-149168.28571429,}, + [5]={["y"]=843274.85714286,["x"]=-149125.42857143,}, + [6]={["y"]=842077.71428572,["x"]=-148554,}, + [7]={["y"]=842083.42857143,["x"]=-148445.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=842104.57142857,["x"]=-148460.57142857,}, + [2]={["y"]=845225.71428572,["x"]=-148656,}, + [3]={["y"]=845220.57142858,["x"]=-148750,}, + [4]={["y"]=842098.85714286,["x"]=-148556.28571429,}, + [5]={["y"]=842104,["x"]=-148460.28571429,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Gelendzhik = { + PointsBoundary = { + [1]={["y"]=297856.00000001,["x"]=-51151.428571429,}, + [2]={["y"]=299044.57142858,["x"]=-49720.000000001,}, + [3]={["y"]=298861.71428572,["x"]=-49580.000000001,}, + [4]={["y"]=298198.85714286,["x"]=-49842.857142858,}, + [5]={["y"]=297990.28571429,["x"]=-50151.428571429,}, + [6]={["y"]=297696.00000001,["x"]=-51054.285714286,}, + [7]={["y"]=297850.28571429,["x"]=-51160.000000001,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=297834.00000001,["x"]=-51107.428571429,}, + [2]={["y"]=297786.57142858,["x"]=-51068.857142858,}, + [3]={["y"]=298946.57142858,["x"]=-49686.000000001,}, + [4]={["y"]=298993.14285715,["x"]=-49725.714285715,}, + [5]={["y"]=297835.14285715,["x"]=-51107.714285715,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Gudauta = { + PointsBoundary = { + [1]={["y"]=517246.57142857,["x"]=-197850.28571429,}, + [2]={["y"]=516749.42857142,["x"]=-198070.28571429,}, + [3]={["y"]=515755.14285714,["x"]=-197598.85714286,}, + [4]={["y"]=515369.42857142,["x"]=-196538.85714286,}, + [5]={["y"]=515623.71428571,["x"]=-195618.85714286,}, + [6]={["y"]=515946.57142857,["x"]=-195510.28571429,}, + [7]={["y"]=517243.71428571,["x"]=-197858.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=517096.57142857,["x"]=-197804.57142857,}, + [2]={["y"]=515880.85714285,["x"]=-195590.28571429,}, + [3]={["y"]=515812.28571428,["x"]=-195628.85714286,}, + [4]={["y"]=517036.57142857,["x"]=-197834.57142857,}, + [5]={["y"]=517097.99999999,["x"]=-197807.42857143,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Kobuleti = { + PointsBoundary = { + [1]={["y"]=634427.71428571,["x"]=-318290.28571429,}, + [2]={["y"]=635033.42857143,["x"]=-317550.2857143,}, + [3]={["y"]=635864.85714286,["x"]=-317333.14285715,}, + [4]={["y"]=636967.71428571,["x"]=-317261.71428572,}, + [5]={["y"]=637144.85714286,["x"]=-317913.14285715,}, + [6]={["y"]=634630.57142857,["x"]=-318687.42857144,}, + [7]={["y"]=634424.85714286,["x"]=-318290.2857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=634509.71428571,["x"]=-318339.42857144,}, + [2]={["y"]=636767.42857143,["x"]=-317516.57142858,}, + [3]={["y"]=636790,["x"]=-317575.71428572,}, + [4]={["y"]=634531.42857143,["x"]=-318398.00000001,}, + [5]={["y"]=634510.28571429,["x"]=-318339.71428572,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + KrasnodarCenter = { + PointsBoundary = { + [1]={["y"]=366680.28571429,["x"]=11699.142857142,}, + [2]={["y"]=366654.28571429,["x"]=11225.142857142,}, + [3]={["y"]=367497.14285715,["x"]=11082.285714285,}, + [4]={["y"]=368025.71428572,["x"]=10396.57142857,}, + [5]={["y"]=369854.28571429,["x"]=11367.999999999,}, + [6]={["y"]=369840.00000001,["x"]=11910.857142856,}, + [7]={["y"]=366682.57142858,["x"]=11697.999999999,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=369205.42857144,["x"]=11789.142857142,}, + [2]={["y"]=369209.71428572,["x"]=11714.857142856,}, + [3]={["y"]=366699.71428572,["x"]=11581.714285713,}, + [4]={["y"]=366698.28571429,["x"]=11659.142857142,}, + [5]={["y"]=369208.85714286,["x"]=11788.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + KrasnodarPashkovsky = { + PointsBoundary = { + [1]={["y"]=386754,["x"]=6476.5714285703,}, + [2]={["y"]=389182.57142858,["x"]=8722.2857142846,}, + [3]={["y"]=388832.57142858,["x"]=9086.5714285703,}, + [4]={["y"]=386961.14285715,["x"]=7707.9999999989,}, + [5]={["y"]=385404,["x"]=9179.4285714274,}, + [6]={["y"]=383239.71428572,["x"]=7386.5714285703,}, + [7]={["y"]=383954,["x"]=6486.5714285703,}, + [8]={["y"]=385775.42857143,["x"]=8097.9999999989,}, + [9]={["y"]=386804,["x"]=7319.4285714274,}, + [10]={["y"]=386375.42857143,["x"]=6797.9999999989,}, + [11]={["y"]=386746.85714286,["x"]=6472.2857142846,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=385891.14285715,["x"]=8416.5714285703,}, + [2]={["y"]=385842.28571429,["x"]=8467.9999999989,}, + [3]={["y"]=384180.85714286,["x"]=6917.1428571417,}, + [4]={["y"]=384228.57142858,["x"]=6867.7142857132,}, + [5]={["y"]=385891.14285715,["x"]=8416.5714285703,}, + }, + [2] = { + [1]={["y"]=386714.85714286,["x"]=6674.857142856,}, + [2]={["y"]=386757.71428572,["x"]=6627.7142857132,}, + [3]={["y"]=389028.57142858,["x"]=8741.4285714275,}, + [4]={["y"]=388981.71428572,["x"]=8790.5714285703,}, + [5]={["y"]=386714.57142858,["x"]=6674.5714285703,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Krymsk = { + PointsBoundary = { + [1]={["y"]=293338.00000001,["x"]=-7575.4285714297,}, + [2]={["y"]=295199.42857144,["x"]=-5434.0000000011,}, + [3]={["y"]=295595.14285715,["x"]=-6239.7142857154,}, + [4]={["y"]=294152.2857143,["x"]=-8325.4285714297,}, + [5]={["y"]=293345.14285715,["x"]=-7596.8571428582,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=293522.00000001,["x"]=-7567.4285714297,}, + [2]={["y"]=293578.57142858,["x"]=-7616.0000000011,}, + [3]={["y"]=295246.00000001,["x"]=-5591.142857144,}, + [4]={["y"]=295187.71428573,["x"]=-5546.0000000011,}, + [5]={["y"]=293523.14285715,["x"]=-7568.2857142868,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Kutaisi = { + PointsBoundary = { + [1]={["y"]=682087.42857143,["x"]=-284512.85714286,}, + [2]={["y"]=685387.42857143,["x"]=-283662.85714286,}, + [3]={["y"]=685294.57142857,["x"]=-284977.14285715,}, + [4]={["y"]=682744.57142857,["x"]=-286505.71428572,}, + [5]={["y"]=682094.57142857,["x"]=-284527.14285715,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=682638,["x"]=-285202.28571429,}, + [2]={["y"]=685050.28571429,["x"]=-284507.42857144,}, + [3]={["y"]=685068.85714286,["x"]=-284578.85714286,}, + [4]={["y"]=682657.42857143,["x"]=-285264.28571429,}, + [5]={["y"]=682638.28571429,["x"]=-285202.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + MaykopKhanskaya = { + PointsBoundary = { + [1]={["y"]=456876.28571429,["x"]=-27665.42857143,}, + [2]={["y"]=457800,["x"]=-28392.857142858,}, + [3]={["y"]=459368.57142857,["x"]=-26378.571428573,}, + [4]={["y"]=459425.71428572,["x"]=-25242.857142858,}, + [5]={["y"]=458961.42857143,["x"]=-24964.285714287,}, + [6]={["y"]=456878.57142857,["x"]=-27667.714285715,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=457005.42857143,["x"]=-27668.000000001,}, + [2]={["y"]=459028.85714286,["x"]=-25168.857142858,}, + [3]={["y"]=459082.57142857,["x"]=-25216.857142858,}, + [4]={["y"]=457060,["x"]=-27714.285714287,}, + [5]={["y"]=457004.57142857,["x"]=-27669.714285715,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + MineralnyeVody = { + PointsBoundary = { + [1]={["y"]=703857.14285714,["x"]=-50226.000000002,}, + [2]={["y"]=707385.71428571,["x"]=-51911.714285716,}, + [3]={["y"]=707595.71428571,["x"]=-51434.857142859,}, + [4]={["y"]=707900,["x"]=-51568.857142859,}, + [5]={["y"]=707542.85714286,["x"]=-52326.000000002,}, + [6]={["y"]=706628.57142857,["x"]=-52568.857142859,}, + [7]={["y"]=705142.85714286,["x"]=-51790.285714288,}, + [8]={["y"]=703678.57142857,["x"]=-50611.714285716,}, + [9]={["y"]=703857.42857143,["x"]=-50226.857142859,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=703904,["x"]=-50352.571428573,}, + [2]={["y"]=707596.28571429,["x"]=-52094.571428573,}, + [3]={["y"]=707560.57142858,["x"]=-52161.714285716,}, + [4]={["y"]=703871.71428572,["x"]=-50420.571428573,}, + [5]={["y"]=703902,["x"]=-50352.000000002,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Mozdok = { + PointsBoundary = { + [1]={["y"]=832123.42857143,["x"]=-83608.571428573,}, + [2]={["y"]=835916.28571429,["x"]=-83144.285714288,}, + [3]={["y"]=835474.28571429,["x"]=-84170.571428573,}, + [4]={["y"]=832911.42857143,["x"]=-84470.571428573,}, + [5]={["y"]=832487.71428572,["x"]=-85565.714285716,}, + [6]={["y"]=831573.42857143,["x"]=-85351.42857143,}, + [7]={["y"]=832123.71428572,["x"]=-83610.285714288,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=832201.14285715,["x"]=-83699.428571431,}, + [2]={["y"]=832212.57142857,["x"]=-83780.571428574,}, + [3]={["y"]=835730.28571429,["x"]=-83335.714285717,}, + [4]={["y"]=835718.85714286,["x"]=-83246.571428574,}, + [5]={["y"]=832200.57142857,["x"]=-83700.000000002,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Nalchik = { + PointsBoundary = { + [1]={["y"]=759370,["x"]=-125502.85714286,}, + [2]={["y"]=761384.28571429,["x"]=-124177.14285714,}, + [3]={["y"]=761472.85714286,["x"]=-124325.71428572,}, + [4]={["y"]=761092.85714286,["x"]=-125048.57142857,}, + [5]={["y"]=760295.71428572,["x"]=-125685.71428572,}, + [6]={["y"]=759444.28571429,["x"]=-125734.28571429,}, + [7]={["y"]=759375.71428572,["x"]=-125511.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=759454.28571429,["x"]=-125551.42857143,}, + [2]={["y"]=759492.85714286,["x"]=-125610.85714286,}, + [3]={["y"]=761406.28571429,["x"]=-124304.28571429,}, + [4]={["y"]=761361.14285714,["x"]=-124239.71428572,}, + [5]={["y"]=759456,["x"]=-125552.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Novorossiysk = { + PointsBoundary = { + [1]={["y"]=278677.71428573,["x"]=-41656.571428572,}, + [2]={["y"]=278446.2857143,["x"]=-41453.714285715,}, + [3]={["y"]=278989.14285716,["x"]=-40188.000000001,}, + [4]={["y"]=279717.71428573,["x"]=-39968.000000001,}, + [5]={["y"]=280020.57142859,["x"]=-40208.000000001,}, + [6]={["y"]=278674.85714287,["x"]=-41660.857142858,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=278673.14285716,["x"]=-41615.142857144,}, + [2]={["y"]=278625.42857144,["x"]=-41570.571428572,}, + [3]={["y"]=279835.42857144,["x"]=-40226.000000001,}, + [4]={["y"]=279882.2857143,["x"]=-40270.000000001,}, + [5]={["y"]=278672.00000001,["x"]=-41614.857142858,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SenakiKolkhi = { + PointsBoundary = { + [1]={["y"]=646036.57142857,["x"]=-281778.85714286,}, + [2]={["y"]=646045.14285714,["x"]=-281191.71428571,}, + [3]={["y"]=647032.28571429,["x"]=-280598.85714285,}, + [4]={["y"]=647669.42857143,["x"]=-281273.14285714,}, + [5]={["y"]=648323.71428571,["x"]=-281370.28571428,}, + [6]={["y"]=648520.85714286,["x"]=-281978.85714285,}, + [7]={["y"]=646039.42857143,["x"]=-281783.14285714,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=646060.85714285,["x"]=-281736,}, + [2]={["y"]=646056.57142857,["x"]=-281631.71428571,}, + [3]={["y"]=648442.28571428,["x"]=-281840.28571428,}, + [4]={["y"]=648432.28571428,["x"]=-281918.85714286,}, + [5]={["y"]=646063.71428571,["x"]=-281738.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SochiAdler = { + PointsBoundary = { + [1]={["y"]=460642.28571428,["x"]=-164861.71428571,}, + [2]={["y"]=462820.85714285,["x"]=-163368.85714286,}, + [3]={["y"]=463649.42857142,["x"]=-163340.28571429,}, + [4]={["y"]=463835.14285714,["x"]=-164040.28571429,}, + [5]={["y"]=462535.14285714,["x"]=-165654.57142857,}, + [6]={["y"]=460678,["x"]=-165247.42857143,}, + [7]={["y"]=460635.14285714,["x"]=-164876,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=460831.42857143,["x"]=-165180,}, + [2]={["y"]=460878.57142857,["x"]=-165257.14285714,}, + [3]={["y"]=463663.71428571,["x"]=-163793.14285714,}, + [4]={["y"]=463612.28571428,["x"]=-163697.42857143,}, + [5]={["y"]=460831.42857143,["x"]=-165177.14285714,}, + }, + [2] = { + [1]={["y"]=460831.42857143,["x"]=-165180,}, + [2]={["y"]=460878.57142857,["x"]=-165257.14285714,}, + [3]={["y"]=463663.71428571,["x"]=-163793.14285714,}, + [4]={["y"]=463612.28571428,["x"]=-163697.42857143,}, + [5]={["y"]=460831.42857143,["x"]=-165177.14285714,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Soganlug = { + PointsBoundary = { + [1]={["y"]=894530.85714286,["x"]=-316928.28571428,}, + [2]={["y"]=896422.28571428,["x"]=-318622.57142857,}, + [3]={["y"]=896090.85714286,["x"]=-318934,}, + [4]={["y"]=894019.42857143,["x"]=-317119.71428571,}, + [5]={["y"]=894533.71428571,["x"]=-316925.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=894525.71428571,["x"]=-316964,}, + [2]={["y"]=896363.14285714,["x"]=-318634.28571428,}, + [3]={["y"]=896299.14285714,["x"]=-318702.85714286,}, + [4]={["y"]=894464,["x"]=-317031.71428571,}, + [5]={["y"]=894524.57142857,["x"]=-316963.71428571,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + SukhumiBabushara = { + PointsBoundary = { + [1]={["y"]=562541.14285714,["x"]=-219852.28571429,}, + [2]={["y"]=562691.14285714,["x"]=-219395.14285714,}, + [3]={["y"]=564326.85714286,["x"]=-219523.71428571,}, + [4]={["y"]=566262.57142857,["x"]=-221166.57142857,}, + [5]={["y"]=566069.71428571,["x"]=-221580.85714286,}, + [6]={["y"]=562534,["x"]=-219873.71428571,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=562684,["x"]=-219779.71428571,}, + [2]={["y"]=562717.71428571,["x"]=-219718,}, + [3]={["y"]=566046.85714286,["x"]=-221376.57142857,}, + [4]={["y"]=566012.28571428,["x"]=-221446.57142857,}, + [5]={["y"]=562684.57142857,["x"]=-219782.57142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + TbilisiLochini = { + PointsBoundary = { + [1]={["y"]=895172.85714286,["x"]=-314667.42857143,}, + [2]={["y"]=895337.42857143,["x"]=-314143.14285714,}, + [3]={["y"]=895990.28571429,["x"]=-314036,}, + [4]={["y"]=897730.28571429,["x"]=-315284.57142857,}, + [5]={["y"]=897901.71428571,["x"]=-316284.57142857,}, + [6]={["y"]=897684.57142857,["x"]=-316618.85714286,}, + [7]={["y"]=895173.14285714,["x"]=-314667.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=895261.14285715,["x"]=-314652.28571428,}, + [2]={["y"]=897654.57142857,["x"]=-316523.14285714,}, + [3]={["y"]=897711.71428571,["x"]=-316450.28571429,}, + [4]={["y"]=895327.42857143,["x"]=-314568.85714286,}, + [5]={["y"]=895261.71428572,["x"]=-314656,}, + }, + [2] = { + [1]={["y"]=895605.71428572,["x"]=-314724.57142857,}, + [2]={["y"]=897639.71428572,["x"]=-316148,}, + [3]={["y"]=897683.42857143,["x"]=-316087.14285714,}, + [4]={["y"]=895650,["x"]=-314660,}, + [5]={["y"]=895606,["x"]=-314724.85714286,} + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Vaziani = { + PointsBoundary = { + [1]={["y"]=902122,["x"]=-318163.71428572,}, + [2]={["y"]=902678.57142857,["x"]=-317594,}, + [3]={["y"]=903275.71428571,["x"]=-317405.42857143,}, + [4]={["y"]=903418.57142857,["x"]=-317891.14285714,}, + [5]={["y"]=904292.85714286,["x"]=-318748.28571429,}, + [6]={["y"]=904542,["x"]=-319740.85714286,}, + [7]={["y"]=904042,["x"]=-320166.57142857,}, + [8]={["y"]=902121.42857143,["x"]=-318164.85714286,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=902239.14285714,["x"]=-318190.85714286,}, + [2]={["y"]=904014.28571428,["x"]=-319994.57142857,}, + [3]={["y"]=904064.85714285,["x"]=-319945.14285715,}, + [4]={["y"]=902294.57142857,["x"]=-318146,}, + [5]={["y"]=902247.71428571,["x"]=-318190.85714286,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + }, +} + +--- Creates a new AIRBASEPOLICE_CAUCASUS object. +-- @param #AIRBASEPOLICE_CAUCASUS self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @return #AIRBASEPOLICE_CAUCASUS self +function AIRBASEPOLICE_CAUCASUS:New( SetClient ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + + -- -- AnapaVityazevo + -- local AnapaVityazevoBoundary = GROUP:FindByName( "AnapaVityazevo Boundary" ) + -- self.Airbases.AnapaVityazevo.ZoneBoundary = ZONE_POLYGON:New( "AnapaVityazevo Boundary", AnapaVityazevoBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local AnapaVityazevoRunway1 = GROUP:FindByName( "AnapaVityazevo Runway 1" ) + -- self.Airbases.AnapaVityazevo.ZoneRunways[1] = ZONE_POLYGON:New( "AnapaVityazevo Runway 1", AnapaVityazevoRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Batumi + -- local BatumiBoundary = GROUP:FindByName( "Batumi Boundary" ) + -- self.Airbases.Batumi.ZoneBoundary = ZONE_POLYGON:New( "Batumi Boundary", BatumiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local BatumiRunway1 = GROUP:FindByName( "Batumi Runway 1" ) + -- self.Airbases.Batumi.ZoneRunways[1] = ZONE_POLYGON:New( "Batumi Runway 1", BatumiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Beslan + -- local BeslanBoundary = GROUP:FindByName( "Beslan Boundary" ) + -- self.Airbases.Beslan.ZoneBoundary = ZONE_POLYGON:New( "Beslan Boundary", BeslanBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local BeslanRunway1 = GROUP:FindByName( "Beslan Runway 1" ) + -- self.Airbases.Beslan.ZoneRunways[1] = ZONE_POLYGON:New( "Beslan Runway 1", BeslanRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Gelendzhik + -- local GelendzhikBoundary = GROUP:FindByName( "Gelendzhik Boundary" ) + -- self.Airbases.Gelendzhik.ZoneBoundary = ZONE_POLYGON:New( "Gelendzhik Boundary", GelendzhikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local GelendzhikRunway1 = GROUP:FindByName( "Gelendzhik Runway 1" ) + -- self.Airbases.Gelendzhik.ZoneRunways[1] = ZONE_POLYGON:New( "Gelendzhik Runway 1", GelendzhikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Gudauta + -- local GudautaBoundary = GROUP:FindByName( "Gudauta Boundary" ) + -- self.Airbases.Gudauta.ZoneBoundary = ZONE_POLYGON:New( "Gudauta Boundary", GudautaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local GudautaRunway1 = GROUP:FindByName( "Gudauta Runway 1" ) + -- self.Airbases.Gudauta.ZoneRunways[1] = ZONE_POLYGON:New( "Gudauta Runway 1", GudautaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Kobuleti + -- local KobuletiBoundary = GROUP:FindByName( "Kobuleti Boundary" ) + -- self.Airbases.Kobuleti.ZoneBoundary = ZONE_POLYGON:New( "Kobuleti Boundary", KobuletiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KobuletiRunway1 = GROUP:FindByName( "Kobuleti Runway 1" ) + -- self.Airbases.Kobuleti.ZoneRunways[1] = ZONE_POLYGON:New( "Kobuleti Runway 1", KobuletiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- KrasnodarCenter + -- local KrasnodarCenterBoundary = GROUP:FindByName( "KrasnodarCenter Boundary" ) + -- self.Airbases.KrasnodarCenter.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarCenter Boundary", KrasnodarCenterBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrasnodarCenterRunway1 = GROUP:FindByName( "KrasnodarCenter Runway 1" ) + -- self.Airbases.KrasnodarCenter.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarCenter Runway 1", KrasnodarCenterRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- KrasnodarPashkovsky + -- local KrasnodarPashkovskyBoundary = GROUP:FindByName( "KrasnodarPashkovsky Boundary" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarPashkovsky Boundary", KrasnodarPashkovskyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrasnodarPashkovskyRunway1 = GROUP:FindByName( "KrasnodarPashkovsky Runway 1" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 1", KrasnodarPashkovskyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- local KrasnodarPashkovskyRunway2 = GROUP:FindByName( "KrasnodarPashkovsky Runway 2" ) + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[2] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 2", KrasnodarPashkovskyRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Krymsk + -- local KrymskBoundary = GROUP:FindByName( "Krymsk Boundary" ) + -- self.Airbases.Krymsk.ZoneBoundary = ZONE_POLYGON:New( "Krymsk Boundary", KrymskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KrymskRunway1 = GROUP:FindByName( "Krymsk Runway 1" ) + -- self.Airbases.Krymsk.ZoneRunways[1] = ZONE_POLYGON:New( "Krymsk Runway 1", KrymskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Kutaisi + -- local KutaisiBoundary = GROUP:FindByName( "Kutaisi Boundary" ) + -- self.Airbases.Kutaisi.ZoneBoundary = ZONE_POLYGON:New( "Kutaisi Boundary", KutaisiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local KutaisiRunway1 = GROUP:FindByName( "Kutaisi Runway 1" ) + -- self.Airbases.Kutaisi.ZoneRunways[1] = ZONE_POLYGON:New( "Kutaisi Runway 1", KutaisiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- MaykopKhanskaya + -- local MaykopKhanskayaBoundary = GROUP:FindByName( "MaykopKhanskaya Boundary" ) + -- self.Airbases.MaykopKhanskaya.ZoneBoundary = ZONE_POLYGON:New( "MaykopKhanskaya Boundary", MaykopKhanskayaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MaykopKhanskayaRunway1 = GROUP:FindByName( "MaykopKhanskaya Runway 1" ) + -- self.Airbases.MaykopKhanskaya.ZoneRunways[1] = ZONE_POLYGON:New( "MaykopKhanskaya Runway 1", MaykopKhanskayaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- MineralnyeVody + -- local MineralnyeVodyBoundary = GROUP:FindByName( "MineralnyeVody Boundary" ) + -- self.Airbases.MineralnyeVody.ZoneBoundary = ZONE_POLYGON:New( "MineralnyeVody Boundary", MineralnyeVodyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MineralnyeVodyRunway1 = GROUP:FindByName( "MineralnyeVody Runway 1" ) + -- self.Airbases.MineralnyeVody.ZoneRunways[1] = ZONE_POLYGON:New( "MineralnyeVody Runway 1", MineralnyeVodyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Mozdok + -- local MozdokBoundary = GROUP:FindByName( "Mozdok Boundary" ) + -- self.Airbases.Mozdok.ZoneBoundary = ZONE_POLYGON:New( "Mozdok Boundary", MozdokBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local MozdokRunway1 = GROUP:FindByName( "Mozdok Runway 1" ) + -- self.Airbases.Mozdok.ZoneRunways[1] = ZONE_POLYGON:New( "Mozdok Runway 1", MozdokRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Nalchik + -- local NalchikBoundary = GROUP:FindByName( "Nalchik Boundary" ) + -- self.Airbases.Nalchik.ZoneBoundary = ZONE_POLYGON:New( "Nalchik Boundary", NalchikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local NalchikRunway1 = GROUP:FindByName( "Nalchik Runway 1" ) + -- self.Airbases.Nalchik.ZoneRunways[1] = ZONE_POLYGON:New( "Nalchik Runway 1", NalchikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Novorossiysk + -- local NovorossiyskBoundary = GROUP:FindByName( "Novorossiysk Boundary" ) + -- self.Airbases.Novorossiysk.ZoneBoundary = ZONE_POLYGON:New( "Novorossiysk Boundary", NovorossiyskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local NovorossiyskRunway1 = GROUP:FindByName( "Novorossiysk Runway 1" ) + -- self.Airbases.Novorossiysk.ZoneRunways[1] = ZONE_POLYGON:New( "Novorossiysk Runway 1", NovorossiyskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SenakiKolkhi + -- local SenakiKolkhiBoundary = GROUP:FindByName( "SenakiKolkhi Boundary" ) + -- self.Airbases.SenakiKolkhi.ZoneBoundary = ZONE_POLYGON:New( "SenakiKolkhi Boundary", SenakiKolkhiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SenakiKolkhiRunway1 = GROUP:FindByName( "SenakiKolkhi Runway 1" ) + -- self.Airbases.SenakiKolkhi.ZoneRunways[1] = ZONE_POLYGON:New( "SenakiKolkhi Runway 1", SenakiKolkhiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SochiAdler + -- local SochiAdlerBoundary = GROUP:FindByName( "SochiAdler Boundary" ) + -- self.Airbases.SochiAdler.ZoneBoundary = ZONE_POLYGON:New( "SochiAdler Boundary", SochiAdlerBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SochiAdlerRunway1 = GROUP:FindByName( "SochiAdler Runway 1" ) + -- self.Airbases.SochiAdler.ZoneRunways[1] = ZONE_POLYGON:New( "SochiAdler Runway 1", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- local SochiAdlerRunway2 = GROUP:FindByName( "SochiAdler Runway 2" ) + -- self.Airbases.SochiAdler.ZoneRunways[2] = ZONE_POLYGON:New( "SochiAdler Runway 2", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Soganlug + -- local SoganlugBoundary = GROUP:FindByName( "Soganlug Boundary" ) + -- self.Airbases.Soganlug.ZoneBoundary = ZONE_POLYGON:New( "Soganlug Boundary", SoganlugBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SoganlugRunway1 = GROUP:FindByName( "Soganlug Runway 1" ) + -- self.Airbases.Soganlug.ZoneRunways[1] = ZONE_POLYGON:New( "Soganlug Runway 1", SoganlugRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- SukhumiBabushara + -- local SukhumiBabusharaBoundary = GROUP:FindByName( "SukhumiBabushara Boundary" ) + -- self.Airbases.SukhumiBabushara.ZoneBoundary = ZONE_POLYGON:New( "SukhumiBabushara Boundary", SukhumiBabusharaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local SukhumiBabusharaRunway1 = GROUP:FindByName( "SukhumiBabushara Runway 1" ) + -- self.Airbases.SukhumiBabushara.ZoneRunways[1] = ZONE_POLYGON:New( "SukhumiBabushara Runway 1", SukhumiBabusharaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- TbilisiLochini + -- local TbilisiLochiniBoundary = GROUP:FindByName( "TbilisiLochini Boundary" ) + -- self.Airbases.TbilisiLochini.ZoneBoundary = ZONE_POLYGON:New( "TbilisiLochini Boundary", TbilisiLochiniBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local TbilisiLochiniRunway1 = GROUP:FindByName( "TbilisiLochini Runway 1" ) + -- self.Airbases.TbilisiLochini.ZoneRunways[1] = ZONE_POLYGON:New( "TbilisiLochini Runway 1", TbilisiLochiniRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- local TbilisiLochiniRunway2 = GROUP:FindByName( "TbilisiLochini Runway 2" ) + -- self.Airbases.TbilisiLochini.ZoneRunways[2] = ZONE_POLYGON:New( "TbilisiLochini Runway 2", TbilisiLochiniRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + -- -- Vaziani + -- local VazianiBoundary = GROUP:FindByName( "Vaziani Boundary" ) + -- self.Airbases.Vaziani.ZoneBoundary = ZONE_POLYGON:New( "Vaziani Boundary", VazianiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local VazianiRunway1 = GROUP:FindByName( "Vaziani Runway 1" ) + -- self.Airbases.Vaziani.ZoneRunways[1] = ZONE_POLYGON:New( "Vaziani Runway 1", VazianiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + -- + -- + -- + + + -- Template + -- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) + -- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + -- + -- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) + -- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + + return self + +end + + + + +--- @type AIRBASEPOLICE_NEVADA +-- @extends Functional.AirbasePolice#AIRBASEPOLICE_BASE +AIRBASEPOLICE_NEVADA = { + ClassName = "AIRBASEPOLICE_NEVADA", + Airbases = { + Nellis = { + PointsBoundary = { + [1]={["y"]=-17814.714285714,["x"]=-399823.14285714,}, + [2]={["y"]=-16875.857142857,["x"]=-398763.14285714,}, + [3]={["y"]=-16251.571428571,["x"]=-398988.85714286,}, + [4]={["y"]=-16163,["x"]=-398693.14285714,}, + [5]={["y"]=-16328.714285714,["x"]=-398034.57142857,}, + [6]={["y"]=-15943,["x"]=-397571.71428571,}, + [7]={["y"]=-15711.571428571,["x"]=-397551.71428571,}, + [8]={["y"]=-15748.714285714,["x"]=-396806,}, + [9]={["y"]=-16288.714285714,["x"]=-396517.42857143,}, + [10]={["y"]=-16751.571428571,["x"]=-396308.85714286,}, + [11]={["y"]=-17263,["x"]=-396234.57142857,}, + [12]={["y"]=-17577.285714286,["x"]=-396640.28571429,}, + [13]={["y"]=-17614.428571429,["x"]=-397400.28571429,}, + [14]={["y"]=-19405.857142857,["x"]=-399428.85714286,}, + [15]={["y"]=-19234.428571429,["x"]=-399683.14285714,}, + [16]={["y"]=-18708.714285714,["x"]=-399408.85714286,}, + [17]={["y"]=-18397.285714286,["x"]=-399657.42857143,}, + [18]={["y"]=-17814.428571429,["x"]=-399823.42857143,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-18687,["x"]=-399380.28571429,}, + [2]={["y"]=-18620.714285714,["x"]=-399436.85714286,}, + [3]={["y"]=-16217.857142857,["x"]=-396596.85714286,}, + [4]={["y"]=-16300.142857143,["x"]=-396530,}, + [5]={["y"]=-18687,["x"]=-399380.85714286,}, + }, + [2] = { + [1]={["y"]=-18451.571428572,["x"]=-399580.57142857,}, + [2]={["y"]=-18392.142857143,["x"]=-399628.57142857,}, + [3]={["y"]=-16011,["x"]=-396806.85714286,}, + [4]={["y"]=-16074.714285714,["x"]=-396751.71428572,}, + [5]={["y"]=-18451.571428572,["x"]=-399580.85714285,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + McCarran = { + PointsBoundary = { + [1]={["y"]=-29455.285714286,["x"]=-416277.42857142,}, + [2]={["y"]=-28860.142857143,["x"]=-416492,}, + [3]={["y"]=-25044.428571429,["x"]=-416344.85714285,}, + [4]={["y"]=-24580.142857143,["x"]=-415959.14285714,}, + [5]={["y"]=-25073,["x"]=-415630.57142857,}, + [6]={["y"]=-25087.285714286,["x"]=-415130.57142857,}, + [7]={["y"]=-25830.142857143,["x"]=-414866.28571428,}, + [8]={["y"]=-26658.714285715,["x"]=-414880.57142857,}, + [9]={["y"]=-26973,["x"]=-415273.42857142,}, + [10]={["y"]=-27380.142857143,["x"]=-415187.71428571,}, + [11]={["y"]=-27715.857142857,["x"]=-414144.85714285,}, + [12]={["y"]=-27551.571428572,["x"]=-413473.42857142,}, + [13]={["y"]=-28630.142857143,["x"]=-413201.99999999,}, + [14]={["y"]=-29494.428571429,["x"]=-415437.71428571,}, + [15]={["y"]=-29455.571428572,["x"]=-416277.71428571,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-29408.428571429,["x"]=-416016.28571428,}, + [2]={["y"]=-29408.142857144,["x"]=-416105.42857142,}, + [3]={["y"]=-24680.714285715,["x"]=-416003.14285713,}, + [4]={["y"]=-24681.857142858,["x"]=-415926.57142856,}, + [5]={["y"]=-29408.42857143,["x"]=-416016.57142856,}, + }, + [2] = { + [1]={["y"]=-28575.571428572,["x"]=-416303.14285713,}, + [2]={["y"]=-28575.571428572,["x"]=-416382.57142856,}, + [3]={["y"]=-25111.000000001,["x"]=-416309.7142857,}, + [4]={["y"]=-25111.000000001,["x"]=-416249.14285713,}, + [5]={["y"]=-28575.571428572,["x"]=-416303.7142857,}, + }, + [3] = { + [1]={["y"]=-29331.000000001,["x"]=-416275.42857141,}, + [2]={["y"]=-29259.000000001,["x"]=-416306.85714284,}, + [3]={["y"]=-28005.571428572,["x"]=-413449.7142857,}, + [4]={["y"]=-28068.714285715,["x"]=-413422.85714284,}, + [5]={["y"]=-29331.000000001,["x"]=-416275.7142857,}, + }, + [4] = { + [1]={["y"]=-29073.285714286,["x"]=-416386.57142856,}, + [2]={["y"]=-28997.285714286,["x"]=-416417.42857141,}, + [3]={["y"]=-27697.571428572,["x"]=-413464.57142856,}, + [4]={["y"]=-27767.857142858,["x"]=-413434.28571427,}, + [5]={["y"]=-29073.000000001,["x"]=-416386.85714284,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + Creech = { + PointsBoundary = { + [1]={["y"]=-74522.714285715,["x"]=-360887.99999998,}, + [2]={["y"]=-74197,["x"]=-360556.57142855,}, + [3]={["y"]=-74402.714285715,["x"]=-359639.42857141,}, + [4]={["y"]=-74637,["x"]=-359279.42857141,}, + [5]={["y"]=-75759.857142857,["x"]=-359005.14285712,}, + [6]={["y"]=-75834.142857143,["x"]=-359045.14285712,}, + [7]={["y"]=-75902.714285714,["x"]=-359782.28571427,}, + [8]={["y"]=-76099.857142857,["x"]=-360399.42857141,}, + [9]={["y"]=-77314.142857143,["x"]=-360219.42857141,}, + [10]={["y"]=-77728.428571429,["x"]=-360445.14285713,}, + [11]={["y"]=-77585.571428571,["x"]=-360585.14285713,}, + [12]={["y"]=-76471.285714286,["x"]=-360819.42857141,}, + [13]={["y"]=-76325.571428571,["x"]=-360942.28571427,}, + [14]={["y"]=-74671.857142857,["x"]=-360927.7142857,}, + [15]={["y"]=-74522.714285714,["x"]=-360888.85714284,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-74237.571428571,["x"]=-360591.7142857,}, + [2]={["y"]=-74234.428571429,["x"]=-360493.71428571,}, + [3]={["y"]=-77605.285714286,["x"]=-360399.14285713,}, + [4]={["y"]=-77608.714285715,["x"]=-360498.85714285,}, + [5]={["y"]=-74237.857142857,["x"]=-360591.7142857,}, + }, + [2] = { + [1]={["y"]=-75807.571428572,["x"]=-359073.42857142,}, + [2]={["y"]=-74770.142857144,["x"]=-360581.71428571,}, + [3]={["y"]=-74641.285714287,["x"]=-360585.42857142,}, + [4]={["y"]=-75734.142857144,["x"]=-359023.14285714,}, + [5]={["y"]=-75807.285714287,["x"]=-359073.42857142,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + GroomLake = { + PointsBoundary = { + [1]={["y"]=-88916.714285714,["x"]=-289102.28571425,}, + [2]={["y"]=-87023.571428572,["x"]=-290388.57142857,}, + [3]={["y"]=-85916.428571429,["x"]=-290674.28571428,}, + [4]={["y"]=-87645.000000001,["x"]=-286567.14285714,}, + [5]={["y"]=-88380.714285715,["x"]=-286388.57142857,}, + [6]={["y"]=-89670.714285715,["x"]=-283524.28571428,}, + [7]={["y"]=-89797.857142858,["x"]=-283567.14285714,}, + [8]={["y"]=-88635.000000001,["x"]=-286749.99999999,}, + [9]={["y"]=-89177.857142858,["x"]=-287207.14285714,}, + [10]={["y"]=-89092.142857144,["x"]=-288892.85714285,}, + [11]={["y"]=-88917.000000001,["x"]=-289102.85714285,}, + }, + PointsRunways = { + [1] = { + [1]={["y"]=-86039.000000001,["x"]=-290606.28571428,}, + [2]={["y"]=-85965.285714287,["x"]=-290573.99999999,}, + [3]={["y"]=-87692.714285715,["x"]=-286634.85714285,}, + [4]={["y"]=-87756.714285715,["x"]=-286663.99999999,}, + [5]={["y"]=-86038.714285715,["x"]=-290606.85714285,}, + }, + [2] = { + [1]={["y"]=-86808.428571429,["x"]=-290375.7142857,}, + [2]={["y"]=-86732.714285715,["x"]=-290344.28571427,}, + [3]={["y"]=-89672.714285714,["x"]=-283546.57142855,}, + [4]={["y"]=-89772.142857143,["x"]=-283587.71428569,}, + [5]={["y"]=-86808.142857143,["x"]=-290375.7142857,}, + }, + }, + ZoneBoundary = {}, + ZoneRunways = {}, + MaximumSpeed = 50, + }, + }, +} + +--- Creates a new AIRBASEPOLICE_NEVADA object. +-- @param #AIRBASEPOLICE_NEVADA self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase. +-- @return #AIRBASEPOLICE_NEVADA self +function AIRBASEPOLICE_NEVADA:New( SetClient ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + +-- -- Nellis +-- local NellisBoundary = GROUP:FindByName( "Nellis Boundary" ) +-- self.Airbases.Nellis.ZoneBoundary = ZONE_POLYGON:New( "Nellis Boundary", NellisBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local NellisRunway1 = GROUP:FindByName( "Nellis Runway 1" ) +-- self.Airbases.Nellis.ZoneRunways[1] = ZONE_POLYGON:New( "Nellis Runway 1", NellisRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local NellisRunway2 = GROUP:FindByName( "Nellis Runway 2" ) +-- self.Airbases.Nellis.ZoneRunways[2] = ZONE_POLYGON:New( "Nellis Runway 2", NellisRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- McCarran +-- local McCarranBoundary = GROUP:FindByName( "McCarran Boundary" ) +-- self.Airbases.McCarran.ZoneBoundary = ZONE_POLYGON:New( "McCarran Boundary", McCarranBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local McCarranRunway1 = GROUP:FindByName( "McCarran Runway 1" ) +-- self.Airbases.McCarran.ZoneRunways[1] = ZONE_POLYGON:New( "McCarran Runway 1", McCarranRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway2 = GROUP:FindByName( "McCarran Runway 2" ) +-- self.Airbases.McCarran.ZoneRunways[2] = ZONE_POLYGON:New( "McCarran Runway 2", McCarranRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway3 = GROUP:FindByName( "McCarran Runway 3" ) +-- self.Airbases.McCarran.ZoneRunways[3] = ZONE_POLYGON:New( "McCarran Runway 3", McCarranRunway3 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local McCarranRunway4 = GROUP:FindByName( "McCarran Runway 4" ) +-- self.Airbases.McCarran.ZoneRunways[4] = ZONE_POLYGON:New( "McCarran Runway 4", McCarranRunway4 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- Creech +-- local CreechBoundary = GROUP:FindByName( "Creech Boundary" ) +-- self.Airbases.Creech.ZoneBoundary = ZONE_POLYGON:New( "Creech Boundary", CreechBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local CreechRunway1 = GROUP:FindByName( "Creech Runway 1" ) +-- self.Airbases.Creech.ZoneRunways[1] = ZONE_POLYGON:New( "Creech Runway 1", CreechRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local CreechRunway2 = GROUP:FindByName( "Creech Runway 2" ) +-- self.Airbases.Creech.ZoneRunways[2] = ZONE_POLYGON:New( "Creech Runway 2", CreechRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- -- Groom Lake +-- local GroomLakeBoundary = GROUP:FindByName( "GroomLake Boundary" ) +-- self.Airbases.GroomLake.ZoneBoundary = ZONE_POLYGON:New( "GroomLake Boundary", GroomLakeBoundary ):SmokeZone(SMOKECOLOR.White):Flush() +-- +-- local GroomLakeRunway1 = GROUP:FindByName( "GroomLake Runway 1" ) +-- self.Airbases.GroomLake.ZoneRunways[1] = ZONE_POLYGON:New( "GroomLake Runway 1", GroomLakeRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() +-- +-- local GroomLakeRunway2 = GROUP:FindByName( "GroomLake Runway 2" ) +-- self.Airbases.GroomLake.ZoneRunways[2] = ZONE_POLYGON:New( "GroomLake Runway 2", GroomLakeRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + +end + + + + + + --- **Functional** - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods. +-- +-- ![Banner Image](..\Presentations\DETECTION\Dia1.JPG) +-- +-- === +-- +-- DETECTION classes facilitate the detection of enemy units within the battle zone executed by FACs (Forward Air Controllers) or RECCEs (Reconnassance Units). +-- DETECTION uses the in-built detection capabilities of DCS World, but adds new functionalities. +-- +-- Please watch this [youtube video](https://youtu.be/C7p81dUwP-E) that explains the detection concepts. +-- +-- +-- ### Contributions: +-- +-- * Mechanist : Early concept of DETECTION_AREAS. +-- +-- ### Authors: +-- +-- * FlightControl : Analysis, Design, Programming, Testing +-- +-- @module Detection + + +do -- DETECTION_BASE + + --- # 1) DETECTION_BASE class, extends @{Fsm#FSM} + -- + -- The DETECTION_BASE class defines the core functions to administer detected objects. + -- The DETECTION_BASE class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). + -- + -- ## 1.1) DETECTION_BASE constructor + -- + -- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. + -- + -- ## 1.2) DETECTION_BASE initialization + -- + -- By default, detection will return detected objects with all the detection sensors available. + -- However, you can ask how the objects were found with specific detection methods. + -- If you use one of the below methods, the detection will work with the detection method specified. + -- You can specify to apply multiple detection methods. + -- + -- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: + -- + -- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. + -- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. + -- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. + -- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. + -- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. + -- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. + -- + -- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list + -- + -- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later + -- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains + -- a SET_UNIT object that contains the detected units that belong to that group. + -- + -- Derived classes will apply different methods to group the detected units. + -- Examples are per area, per quadrant, per distance, per type. + -- See further the derived DETECTION classes on which grouping methods are currently supported. + -- + -- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: + -- + -- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. + -- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). + -- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + -- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. + -- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). + -- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). + -- + -- ## 1.4) Apply additional Filters to fine-tune the detected objects + -- + -- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. + -- That being said, the DCS World detection algorithm can sometimes be unrealistic. + -- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. + -- Additionally, trees and other obstacles are not accounted during the DCS World detection. + -- + -- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. + -- For electronic detection, this filtering is not applied, only for visually detected targets. + -- + -- The following additional filtering can be applied for visual filtering: + -- + -- * A probability factor per kilometer distance. + -- * A probability factor based on the alpha angle between the detected object and the unit detecting. + -- A detection from a higher altitude allows for better detection than when on the ground. + -- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + -- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. + -- + -- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. + -- Only when you experience unrealistic behaviour in your missions, these filters could be applied. + -- + -- ### 1.4.1 ) Distance visual detection probability + -- + -- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- + -- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! + -- + -- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. + -- + -- ### 1.4.2 ) Alpha Angle visual detection probability + -- + -- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- + -- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. + -- + -- ### 1.4.3 ) Cloudy Zones detection probability + -- + -- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- + -- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. + -- + -- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take + -- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. + -- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! + -- + -- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for + -- AI not to detect so easily targets within a forrest or village rich area. + -- + -- ## 1.5 ) Accept / Reject detected units + -- + -- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, + -- if it is located in range or located inside or outside of specific zones. + -- + -- ### 1.5.1 ) Detection acceptance of within range limit + -- + -- A range can be set that will limit a successful detection for a unit. + -- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units if the range is below 5000 meters. + -- Detection:SetAcceptRange( 5000 ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- + -- ### 1.5.2 ) Detection acceptance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be accepted. + -- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) + -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. + -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ### 1.5.3 ) Detection rejectance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. + -- An example of how to use the method is shown below. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be rejected. + -- local ZoneReject1 = ZONE:New( "RejectZone1" ) + -- local ZoneReject2 = ZONE:New( "RejectZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. + -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ## 1.6) DETECTION_BASE is a Finite State Machine + -- + -- Various Events and State Transitions can be tailored using DETECTION_BASE. + -- + -- ### 1.6.1) DETECTION_BASE States + -- + -- * **Detecting**: The detection is running. + -- * **Stopped**: The detection is stopped. + -- + -- ### 1.6.2) DETECTION_BASE Events + -- + -- * **Start**: Start the detection process. + -- * **Detect**: Detect new units. + -- * **Detected**: New units have been detected. + -- * **Stop**: Stop the detection process. + -- + -- @type DETECTION_BASE + -- @field Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are accepted to be detected. + -- @field #DETECTION_BASE.DetectedObjects DetectedObjects The list of detected objects. + -- @field #table DetectedObjectsIdentified Map of the DetectedObjects identified. + -- @field #number DetectionRun + -- @extends Core.Fsm#FSM + DETECTION_BASE = { + ClassName = "DETECTION_BASE", + DetectionSetGroup = nil, + DetectionRange = nil, + DetectedObjects = {}, + DetectionRun = 0, + DetectedObjectsIdentified = {}, + DetectedItems = {}, + } + + --- @type DETECTION_BASE.DetectedObjects + -- @list <#DETECTION_BASE.DetectedObject> + + --- @type DETECTION_BASE.DetectedObject + -- @field #string Name + -- @field #boolean Visible + -- @field #string Type + -- @field #number Distance + -- @field #boolean Identified + + --- @type DETECTION_BASE.DetectedItems + -- @list <#DETECTION_BASE.DetectedItem> + + --- @type DETECTION_BASE.DetectedItem + -- @field Core.Set#SET_UNIT Set + -- @field Core.Set#SET_UNIT Set -- The Set of Units in the detected area. + -- @field Core.Zone#ZONE_UNIT Zone -- The Zone of the detected area. + -- @field #boolean Changed Documents if the detected area has changes. + -- @field #table Changes A list of the changes reported on the detected area. (It is up to the user of the detected area to consume those changes). + -- @field #number ItemID -- The identifier of the detected area. + -- @field #boolean FriendliesNearBy Indicates if there are friendlies within the detected area. + -- @field Wrapper.Unit#UNIT NearestFAC The nearest FAC near the Area. + + + --- DETECTION constructor. + -- @param #DETECTION_BASE self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @return #DETECTION_BASE self + function DETECTION_BASE:New( DetectionSetGroup ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_BASE + + self.DetectedItemCount = 0 + self.DetectedItemMax = 0 + self.DetectedItems = {} + + self.DetectionSetGroup = DetectionSetGroup + + self.DetectionInterval = 30 + + self:InitDetectVisual( true ) + self:InitDetectOptical( false ) + self:InitDetectRadar( false ) + self:InitDetectRWR( false ) + self:InitDetectIRST( false ) + self:InitDetectDLINK( false ) + + -- Create FSM transitions. + + self:SetStartState( "Stopped" ) + self.CountryID = DetectionSetGroup:GetFirst():GetCountry() + + self:AddTransition( "Stopped", "Start", "Detecting") + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnLeaveStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnEnterStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Start. + -- @function [parent=#DETECTION_BASE] OnBeforeStart + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Start. + -- @function [parent=#DETECTION_BASE] OnAfterStart + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Start. + -- @function [parent=#DETECTION_BASE] Start + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Start. + -- @function [parent=#DETECTION_BASE] __Start + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Detecting. + -- @function [parent=#DETECTION_BASE] OnLeaveDetecting + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Detecting. + -- @function [parent=#DETECTION_BASE] OnEnterDetecting + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + self:AddTransition( "Detecting", "Detect", "Detecting" ) + self:AddTransition( "Detecting", "DetectionGroup", "Detecting" ) + + --- OnBefore Transition Handler for Event Detect. + -- @function [parent=#DETECTION_BASE] OnBeforeDetect + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Detect. + -- @function [parent=#DETECTION_BASE] OnAfterDetect + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Detect. + -- @function [parent=#DETECTION_BASE] Detect + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Detect. + -- @function [parent=#DETECTION_BASE] __Detect + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Detecting", "Detected", "Detecting" ) + + --- OnBefore Transition Handler for Event Detected. + -- @function [parent=#DETECTION_BASE] OnBeforeDetected + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Detected. + -- @function [parent=#DETECTION_BASE] OnAfterDetected + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Detected. + -- @function [parent=#DETECTION_BASE] Detected + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Detected. + -- @function [parent=#DETECTION_BASE] __Detected + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "*", "Stop", "Stopped" ) + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#DETECTION_BASE] OnBeforeStop + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#DETECTION_BASE] OnAfterStop + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#DETECTION_BASE] Stop + -- @param #DETECTION_BASE self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#DETECTION_BASE] __Stop + -- @param #DETECTION_BASE self + -- @param #number Delay The delay in seconds. + + --- OnLeave Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnLeaveStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Stopped. + -- @function [parent=#DETECTION_BASE] OnEnterStopped + -- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + return self + end + + do -- State Transition Handling + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function DETECTION_BASE:onafterStart(From,Event,To) + self:__Detect(0.1) + end + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + function DETECTION_BASE:onafterDetect(From,Event,To) + self:E( {From,Event,To}) + + local DetectDelay = 0.1 + self.DetectionCount = 0 + self.DetectionRun = 0 + self:UnIdentifyAllDetectedObjects() -- Resets the DetectedObjectsIdentified table + + self.DetectionSetGroup:Flush() + + for DetectionGroupID, DetectionGroupData in pairs( self.DetectionSetGroup:GetSet() ) do + self:E( {DetectionGroupData}) + self:__DetectionGroup( DetectDelay, DetectionGroupData ) -- Process each detection asynchronously. + self.DetectionCount = self.DetectionCount + 1 + DetectDelay = DetectDelay + 0.1 + end + end + + --- @param #DETECTION_BASE self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @param Wrapper.Group#GROUP DetectionGroup The Group detecting. + function DETECTION_BASE:onafterDetectionGroup( From, Event, To, DetectionGroup ) + self:E( {From,Event,To}) + + self.DetectionRun = self.DetectionRun + 1 + + local HasDetectedObjects = false + + if DetectionGroup:IsAlive() then + + self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } ) + + local DetectionGroupName = DetectionGroup:GetName() + + local DetectedUnits = {} + + local DetectedTargets = DetectionGroup:GetDetectedTargets( + self.DetectVisual, + self.DetectOptical, + self.DetectRadar, + self.DetectIRST, + self.DetectRWR, + self.DetectDLINK + ) + + self:T( DetectedTargets ) + + for DetectionObjectID, Detection in pairs( DetectedTargets ) do + local DetectedObject = Detection.object -- Dcs.DCSWrapper.Object#Object + self:T2( DetectedObject ) + + if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then + + local DetectionAccepted = true + + local DetectedObjectName = DetectedObject:getName() + + local DetectedObjectVec3 = DetectedObject:getPoint() + local DetectedObjectVec2 = { x = DetectedObjectVec3.x, y = DetectedObjectVec3.z } + local DetectionGroupVec3 = DetectionGroup:GetVec3() + local DetectionGroupVec2 = { x = DetectionGroupVec3.x, y = DetectionGroupVec3.z } + + local Distance = ( ( DetectedObjectVec3.x - DetectionGroupVec3.x )^2 + + ( DetectedObjectVec3.y - DetectionGroupVec3.y )^2 + + ( DetectedObjectVec3.z - DetectionGroupVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { "Detected Target", DetectionGroupName, DetectedObjectName, Distance } ) + + -- Calculate Acceptance + + if self.AcceptRange and Distance > self.AcceptRange then + DetectionAccepted = false + end + + if self.AcceptZones then + for AcceptZoneID, AcceptZone in pairs( self.AcceptZones ) do + local AcceptZone = AcceptZone -- Core.Zone#ZONE_BASE + if AcceptZone:IsPointVec2InZone( DetectedObjectVec2 ) == false then + DetectionAccepted = false + end + end + end + + if self.RejectZones then + for RejectZoneID, RejectZone in pairs( self.RejectZones ) do + local RejectZone = RejectZone -- Core.Zone#ZONE_BASE + if RejectZone:IsPointVec2InZone( DetectedObjectVec2 ) == true then + DetectionAccepted = false + end + end + end + + -- Calculate additional probabilities + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.DistanceProbability then + local DistanceFactor = Distance / 4 + local DistanceProbabilityReversed = ( 1 - self.DistanceProbability ) * DistanceFactor + local DistanceProbability = 1 - DistanceProbabilityReversed + DistanceProbability = DistanceProbability * 30 / 300 + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, DistanceProbability } ) + if Probability > DistanceProbability then + DetectionAccepted = false + end + end + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.AlphaAngleProbability then + local NormalVec2 = { x = DetectedObjectVec2.x - DetectionGroupVec2.x, y = DetectedObjectVec2.y - DetectionGroupVec2.y } + local AlphaAngle = math.atan2( NormalVec2.y, NormalVec2.x ) + local Sinus = math.sin( AlphaAngle ) + local AlphaAngleProbabilityReversed = ( 1 - self.AlphaAngleProbability ) * ( 1 - Sinus ) + local AlphaAngleProbability = 1 - AlphaAngleProbabilityReversed + + AlphaAngleProbability = AlphaAngleProbability * 30 / 300 + + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, AlphaAngleProbability } ) + if Probability > AlphaAngleProbability then + DetectionAccepted = false + end + + end + + if not self.DetectedObjects[DetectedObjectName] and Detection.visible and self.ZoneProbability then + + for ZoneDataID, ZoneData in pairs( self.ZoneProbability ) do + self:E({ZoneData}) + local ZoneObject = ZoneData[1] -- Core.Zone#ZONE_BASE + local ZoneProbability = ZoneData[2] -- #number + ZoneProbability = ZoneProbability * 30 / 300 + + if ZoneObject:IsPointVec2InZone( DetectedObjectVec2 ) == true then + local Probability = math.random() -- Selects a number between 0 and 1 + self:T( { Probability, ZoneProbability } ) + if Probability > ZoneProbability then + DetectionAccepted = false + break + end + end + end + end + + if DetectionAccepted then + + HasDetectedObjects = true + + if not self.DetectedObjects[DetectedObjectName] then + self.DetectedObjects[DetectedObjectName] = {} + end + self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName + self.DetectedObjects[DetectedObjectName].Visible = Detection.visible + self.DetectedObjects[DetectedObjectName].Type = Detection.type + self.DetectedObjects[DetectedObjectName].Distance = Distance + + local DetectedUnit = UNIT:FindByName( DetectedObjectName ) + + DetectedUnits[DetectedObjectName] = DetectedUnit + else + -- if beyond the DetectionRange then nullify... + if self.DetectedObjects[DetectedObjectName] then + self.DetectedObjects[DetectedObjectName] = nil + end + end + end + + self:T2( self.DetectedObjects ) + end + + if HasDetectedObjects then + self:__Detected( 0.1, DetectedUnits ) + end + + end + + if self.DetectionCount > 0 and self.DetectionRun == self.DetectionCount then + self:__Detect( self.DetectionInterval ) + + self:T( "--> Create Detection Sets" ) + self:CreateDetectionSets() + end + + end + + + end + + do -- Initialization methods + + --- Detect Visual. + -- @param #DETECTION_BASE self + -- @param #boolean DetectVisual + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectVisual( DetectVisual ) + + self.DetectVisual = DetectVisual + end + + --- Detect Optical. + -- @param #DETECTION_BASE self + -- @param #boolean DetectOptical + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectOptical( DetectOptical ) + self:F2() + + self.DetectOptical = DetectOptical + end + + --- Detect Radar. + -- @param #DETECTION_BASE self + -- @param #boolean DetectRadar + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectRadar( DetectRadar ) + self:F2() + + self.DetectRadar = DetectRadar + end + + --- Detect IRST. + -- @param #DETECTION_BASE self + -- @param #boolean DetectIRST + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectIRST( DetectIRST ) + self:F2() + + self.DetectIRST = DetectIRST + end + + --- Detect RWR. + -- @param #DETECTION_BASE self + -- @param #boolean DetectRWR + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectRWR( DetectRWR ) + self:F2() + + self.DetectRWR = DetectRWR + end + + --- Detect DLINK. + -- @param #DETECTION_BASE self + -- @param #boolean DetectDLINK + -- @return #DETECTION_BASE self + function DETECTION_BASE:InitDetectDLINK( DetectDLINK ) + self:F2() + + self.DetectDLINK = DetectDLINK + end + + end + + do + + --- Set the detection interval time in seconds. + -- @param #DETECTION_BASE self + -- @param #number DetectionInterval Interval in seconds. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetDetectionInterval( DetectionInterval ) + self:F2() + + self.DetectionInterval = DetectionInterval + + return self + end + + end + + do -- Accept / Reject detected units + + --- Accept detections if within a range in meters. + -- @param #DETECTION_BASE self + -- @param #number AcceptRange Accept a detection if the unit is within the AcceptRange in meters. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAcceptRange( AcceptRange ) + self:F2() + + self.AcceptRange = AcceptRange + + return self + end + + --- Accept detections if within the specified zone(s). + -- @param #DETECTION_BASE self + -- @param AcceptZones Can be a list or ZONE_BASE objects, or a single ZONE_BASE object. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAcceptZones( AcceptZones ) + self:F2() + + if type( AcceptZones ) == "table" then + self.AcceptZones = AcceptZones + else + self.AcceptZones = { AcceptZones } + end + + return self + end + + --- Reject detections if within the specified zone(s). + -- @param #DETECTION_BASE self + -- @param RejectZones Can be a list or ZONE_BASE objects, or a single ZONE_BASE object. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetRejectZones( RejectZones ) + self:F2() + + if type( RejectZones ) == "table" then + self.RejectZones = RejectZones + else + self.RejectZones = { RejectZones } + end + + return self + end + + end + + do -- Probability methods + + --- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- @param #DETECTION_BASE self + -- @param DistanceProbability The probability factor. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetDistanceProbability( DistanceProbability ) + self:F2() + + self.DistanceProbability = DistanceProbability + + return self + end + + + --- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- @param #DETECTION_BASE self + -- @param AlphaAngleProbability The probability factor. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetAlphaAngleProbability( AlphaAngleProbability ) + self:F2() + + self.AlphaAngleProbability = AlphaAngleProbability + + return self + end + + --- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- @param #DETECTION_BASE self + -- @param ZoneArray Aray of a The ZONE_BASE object and a ZoneProbability pair.. + -- @return #DETECTION_BASE self + function DETECTION_BASE:SetZoneProbability( ZoneArray ) + self:F2() + + self.ZoneProbability = ZoneArray + + return self + end + + + end + + do -- Change processing + + --- Accepts changes from the detected item. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #DETECTION_BASE self + function DETECTION_BASE:AcceptChanges( DetectedItem ) + + DetectedItem.Changed = false + DetectedItem.Changes = {} + + return self + end + + --- Add a change to the detected zone. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @param #string ChangeCode + -- @return #DETECTION_BASE self + function DETECTION_BASE:AddChangeItem( DetectedItem, ChangeCode, ItemUnitType ) + + DetectedItem.Changed = true + local ItemID = DetectedItem.ItemID + + DetectedItem.Changes = DetectedItem.Changes or {} + DetectedItem.Changes[ChangeCode] = DetectedItem.Changes[ChangeCode] or {} + DetectedItem.Changes[ChangeCode].ItemID = ItemID + DetectedItem.Changes[ChangeCode].ItemUnitType = ItemUnitType + + self:T( { "Change on Detection Item:", DetectedItem.ItemID, ChangeCode, ItemUnitType } ) + + return self + end + + + --- Add a change to the detected zone. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @param #string ChangeCode + -- @param #string ChangeUnitType + -- @return #DETECTION_BASE self + function DETECTION_BASE:AddChangeUnit( DetectedItem, ChangeCode, ChangeUnitType ) + + DetectedItem.Changed = true + local ItemID = DetectedItem.ItemID + + DetectedItem.Changes = DetectedItem.Changes or {} + DetectedItem.Changes[ChangeCode] = DetectedItem.Changes[ChangeCode] or {} + DetectedItem.Changes[ChangeCode][ChangeUnitType] = DetectedItem.Changes[ChangeCode][ChangeUnitType] or 0 + DetectedItem.Changes[ChangeCode][ChangeUnitType] = DetectedItem.Changes[ChangeCode][ChangeUnitType] + 1 + DetectedItem.Changes[ChangeCode].ItemID = ItemID + + self:T( { "Change on Detection Item:", DetectedItem.ItemID, ChangeCode, ChangeUnitType } ) + + return self + end + + + end + + do -- Threat + + --- Returns if there are friendlies nearby the FAC units ... + -- @param #DETECTION_BASE self + -- @return #boolean trhe if there are friendlies nearby + function DETECTION_BASE:IsFriendliesNearBy( DetectedItem ) + + self:T3( DetectedItem.FriendliesNearBy ) + return DetectedItem.FriendliesNearBy or false + end + + --- Background worker function to determine if there are friendlies nearby ... + -- @param #DETECTION_BASE self + function DETECTION_BASE:ReportFriendliesNearBy( ReportGroupData ) + self:F2() + + local DetectedItem = ReportGroupData.DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = ReportGroupData.DetectedItem.Set + local DetectedUnit = DetectedSet:GetFirst() + + DetectedItem.FriendliesNearBy = false + + if DetectedUnit then + + + local SphereSearch = { + id = world.VolumeType.SPHERE, + params = { + point = DetectedUnit:GetVec3(), + radius = 6000, + } + + } + + --- @param Dcs.DCSWrapper.Unit#Unit FoundDCSUnit + -- @param Wrapper.Group#GROUP ReportGroup + -- @param Set#SET_GROUP ReportSetGroup + local FindNearByFriendlies = function( FoundDCSUnit, ReportGroupData ) + + local DetectedItem = ReportGroupData.DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = ReportGroupData.DetectedItem.Set + local DetectedUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT + local ReportSetGroup = ReportGroupData.ReportSetGroup + + local EnemyCoalition = DetectedUnit:GetCoalition() + + local FoundUnitCoalition = FoundDCSUnit:getCoalition() + local FoundUnitName = FoundDCSUnit:getName() + local FoundUnitGroupName = FoundDCSUnit:getGroup():getName() + local EnemyUnitName = DetectedUnit:GetName() + local FoundUnitInReportSetGroup = ReportSetGroup:FindGroup( FoundUnitGroupName ) ~= nil + + self:T3( { "Friendlies search:", FoundUnitName, FoundUnitCoalition, EnemyUnitName, EnemyCoalition, FoundUnitInReportSetGroup } ) + + if FoundUnitCoalition ~= EnemyCoalition and FoundUnitInReportSetGroup == false then + DetectedItem.FriendliesNearBy = true + return false + end + + return true + end + + world.searchObjects( Object.Category.UNIT, SphereSearch, FindNearByFriendlies, ReportGroupData ) + end + end + + end + + --- Determines if a detected object has already been identified during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + -- @return #boolean true if already identified. + function DETECTION_BASE:IsDetectedObjectIdentified( DetectedObject ) + self:F3( DetectedObject.Name ) + + local DetectedObjectName = DetectedObject.Name + local DetectedObjectIdentified = self.DetectedObjectsIdentified[DetectedObjectName] == true + self:T3( DetectedObjectIdentified ) + return DetectedObjectIdentified + end + + --- Identifies a detected object during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + function DETECTION_BASE:IdentifyDetectedObject( DetectedObject ) + self:F( { "Identified:", DetectedObject.Name } ) + + local DetectedObjectName = DetectedObject.Name + self.DetectedObjectsIdentified[DetectedObjectName] = true + end + + --- UnIdentify a detected object during detection processing. + -- @param #DETECTION_BASE self + -- @param #DETECTION_BASE.DetectedObject DetectedObject + function DETECTION_BASE:UnIdentifyDetectedObject( DetectedObject ) + + local DetectedObjectName = DetectedObject.Name + self.DetectedObjectsIdentified[DetectedObjectName] = false + end + + --- UnIdentify all detected objects during detection processing. + -- @param #DETECTION_BASE self + function DETECTION_BASE:UnIdentifyAllDetectedObjects() + + self.DetectedObjectsIdentified = {} -- Table will be garbage collected. + end + + --- Gets a detected object with a given name. + -- @param #DETECTION_BASE self + -- @param #string ObjectName + -- @return #DETECTION_BASE.DetectedObject + function DETECTION_BASE:GetDetectedObject( ObjectName ) + self:F( ObjectName ) + + if ObjectName then + local DetectedObject = self.DetectedObjects[ObjectName] + + -- Only return detected objects that are alive! + local DetectedUnit = UNIT:FindByName( ObjectName ) + if DetectedUnit and DetectedUnit:IsAlive() then + if self:IsDetectedObjectIdentified( DetectedObject ) == false then + return DetectedObject + end + end + end + + return nil + end + + + --- Adds a new DetectedItem to the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #string DetectedItemIndex The index of the DetectedItem. + -- @param Core.Set#SET_UNIT Set (optional) The Set of Units to be added. + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:AddDetectedItem( DetectedItemIndex, Set ) + + local DetectedItem = {} + self.DetectedItemCount = self.DetectedItemCount + 1 + self.DetectedItemMax = self.DetectedItemMax + 1 + + if DetectedItemIndex then + self.DetectedItems[DetectedItemIndex] = DetectedItem + else + self.DetectedItems[self.DetectedItemCount] = DetectedItem + end + + DetectedItem.Set = Set or SET_UNIT:New() + DetectedItem.ItemID = self.DetectedItemMax + DetectedItem.Removed = false + + return DetectedItem + end + + --- Adds a new DetectedItem to the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #string DetectedItemIndex The index of the DetectedItem. + -- @param Core.Set#SET_UNIT Set (optional) The Set of Units to be added. + -- @param Core.Zone#ZONE_UNIT Zone (optional) The Zone to be added where the Units are located. + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:AddDetectedItemZone( DetectedItemIndex, Set, Zone ) + + local DetectedItem = self:AddDetectedItem( DetectedItemIndex, Set ) + + DetectedItem.Zone = Zone + + return DetectedItem + end + + --- Removes an existing DetectedItem from the DetectedItems list. + -- The DetectedItem is a table and contains a SET_UNIT in the field Set. + -- @param #DETECTION_BASE self + -- @param #number DetectedItemIndex The index or position in the DetectedItems list where the item needs to be removed. + function DETECTION_BASE:RemoveDetectedItem( DetectedItemIndex ) + + self.DetectedItemCount = self.DetectedItemCount - 1 + self.DetectedItems[DetectedItemIndex] = nil + end + + + --- Get the detected @{Set#SET_BASE}s. + -- @param #DETECTION_BASE self + -- @return #DETECTION_BASE.DetectedItems + function DETECTION_BASE:GetDetectedItems() + + return self.DetectedItems + end + + --- Get the amount of SETs with detected objects. + -- @param #DETECTION_BASE self + -- @return #number Count + function DETECTION_BASE:GetDetectedItemsCount() + + local DetectedCount = self.DetectedItemCount + return DetectedCount + end + + --- Get a detected item using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return #DETECTION_BASE.DetectedItem + function DETECTION_BASE:GetDetectedItem( Index ) + + local DetectedItem = self.DetectedItems[Index] + if DetectedItem then + return DetectedItem + end + + return nil + end + + --- Get the @{Set#SET_UNIT} of a detecttion area using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return Core.Set#SET_UNIT DetectedSet + function DETECTION_BASE:GetDetectedSet( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + local DetectedSetUnit = DetectedItem.Set + if DetectedSetUnit then + return DetectedSetUnit + end + + return nil + end + + do -- Zones + + --- Get the @{Zone#ZONE_UNIT} of a detection area using a given numeric index. + -- @param #DETECTION_BASE self + -- @param #number Index + -- @return Core.Zone#ZONE_UNIT DetectedZone + function DETECTION_BASE:GetDetectedZone( Index ) + + local DetectedZone = self.DetectedItems[Index].Zone + if DetectedZone then + return DetectedZone + end + + return nil + end + + end + + + --- Report summary of a detected item using a given numeric index. + -- @param #DETECTION_BASE self + -- @param Index + -- @return #string + function DETECTION_BASE:DetectedItemReportSummary( Index ) + self:F( Index ) + return nil + end + + --- Report detailed of a detectedion result. + -- @param #DETECTION_BASE self + -- @return #string + function DETECTION_BASE:DetectedReportDetailed() + self:F() + return nil + end + + --- Get the detection Groups. + -- @param #DETECTION_BASE self + -- @return Wrapper.Group#GROUP + function DETECTION_BASE:GetDetectionSetGroup() + + local DetectionSetGroup = self.DetectionSetGroup + return DetectionSetGroup + end + + --- Make a DetectionSet table. This function will be overridden in the derived clsses. + -- @param #DETECTION_BASE self + -- @return #DETECTION_BASE self + function DETECTION_BASE:CreateDetectionSets() + self:F2() + + self:E( "Error, in DETECTION_BASE class..." ) + + end + + + --- Schedule the DETECTION construction. + -- @param #DETECTION_BASE self + -- @param #number DelayTime The delay in seconds to wait the reporting. + -- @param #number RepeatInterval The repeat interval in seconds for the reporting to happen repeatedly. + -- @return #DETECTION_BASE self + function DETECTION_BASE:Schedule( DelayTime, RepeatInterval ) + self:F2() + + self.ScheduleDelayTime = DelayTime + self.ScheduleRepeatInterval = RepeatInterval + + self.DetectionScheduler = SCHEDULER:New( self, self._DetectionScheduler, { self, "Detection" }, DelayTime, RepeatInterval ) + return self + end + +end + +do -- DETECTION_UNITS + + --- # 2) DETECTION_UNITS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_UNITS class will detect units within the battle zone. + -- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of units detected is large, the DetectedItems list will be large also. + -- + -- @type DETECTION_UNITS + -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are detected. + -- @extends #DETECTION_BASE + DETECTION_UNITS = { + ClassName = "DETECTION_UNITS", + DetectionRange = nil, + } + + --- DETECTION_UNITS constructor. + -- @param Functional.Detection#DETECTION_UNITS self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @return Functional.Detection#DETECTION_UNITS self + function DETECTION_UNITS:New( DetectionSetGroup ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) -- #DETECTION_UNITS + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_UNITS self + -- @param #DETECTION_UNITS.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_UNITS:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " New target(s) detected: " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " Invisible or destroyed target(s): " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Create the DetectedItems list from the DetectedObjects table. + -- For each DetectedItem, a one field array is created containing the Unit detected. + -- @param #DETECTION_UNITS self + -- @return #DETECTION_UNITS self + function DETECTION_UNITS:CreateDetectionSets() + self:F2( #self.DetectedObjects ) + + -- Loop the current detected items, and check if each object still exists and is detected. + + for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do + + local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT + local DetectedTypeName = DetectedItem.Type + + for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + + local DetectedObject = nil + self:E( DetectedUnit ) + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Yes, the DetectedUnit is still detected or exists. Flag as identified. + self:IdentifyDetectedObject( DetectedObject ) + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) + DetectedItemSet:Remove( DetectedUnitName ) + end + end + end + + + -- Now we need to loop through the unidentified detected units and add these... These are all new items. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + if DetectedObject then + self:T( { "Detected Unit #", DetectedUnitName } ) + + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + if DetectedUnit then + local DetectedTypeName = DetectedUnit:GetTypeName() + local DetectedItem = self:GetDetectedItem( DetectedUnitName ) + if not DetectedItem then + self:T( "Added new DetectedItem" ) + DetectedItem = self:AddDetectedItem( DetectedUnitName ) + DetectedItem.Type = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObjectData.Name + DetectedItem.Visible = DetectedObjectData.Visible + DetectedItem.Distance = DetectedObjectData.Distance + end + + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeUnit( DetectedItem, "AU", DetectedTypeName ) + end + end + end + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + --self:NearestFAC( DetectedItem ) + end + + end + + --- Report summary of a DetectedItem using a given numeric index. + -- @param #DETECTION_UNITS self + -- @param Index + -- @return #string + function DETECTION_UNITS:DetectedItemReportSummary( Index ) + self:F( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + local DetectedSet = self:GetDetectedSet( Index ) + + self:T( DetectedSet ) + if DetectedSet then + local ReportSummary = "" + local UnitDistanceText = "" + local UnitCategoryText = "" + + local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT + + if DetectedItemUnit and DetectedItemUnit:IsAlive() then + self:T(DetectedItemUnit) + + local UnitCategoryName = DetectedItemUnit:GetCategoryName() or "" + local UnitCategoryType = DetectedItemUnit:GetTypeName() or "" + + if DetectedItem.Type and UnitCategoryName and UnitCategoryType then + UnitCategoryText = UnitCategoryName .. " (" .. UnitCategoryType .. ") at " + else + UnitCategoryText = "Unknown target at " + end + + if DetectedItem.Visible == false then + UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " estimated km" + else + UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, visual contact" + end + + local DetectedItemPointVec3 = DetectedItemUnit:GetPointVec3() + local DetectedItemPointLL = DetectedItemPointVec3:ToStringLL( 3, true ) + + local ThreatLevelA2G = DetectedItemUnit:GetThreatLevel( DetectedItem ) + + ReportSummary = string.format( + "%s - Threat [%s] (%2d) - %s%s", + DetectedItemPointLL, + string.rep( "■", ThreatLevelA2G ), + ThreatLevelA2G, + UnitCategoryText, + UnitDistanceText + ) + end + + self:T( ReportSummary ) + + return ReportSummary + end + end + + --- Report detailed of a detection result. + -- @param #DETECTION_UNITS self + -- @return #string + function DETECTION_UNITS:DetectedReportDetailed() + self:F() + + local Report = REPORT:New( "Detected units:" ) + for DetectedItemID, DetectedItem in ipairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemID ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + +end + +do -- DETECTION_TYPES + + --- # 3) DETECTION_TYPES class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_TYPES class will detect units within the battle zone. + -- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. + -- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. + -- + -- @type DETECTION_TYPES + -- @extends #DETECTION_BASE + DETECTION_TYPES = { + ClassName = "DETECTION_TYPES", + DetectionRange = nil, + } + + --- DETECTION_TYPES constructor. + -- @param Functional.Detection#DETECTION_TYPES self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Recce role. + -- @return Functional.Detection#DETECTION_TYPES self + function DETECTION_TYPES:New( DetectionSetGroup ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) -- #DETECTION_TYPES + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_TYPES self + -- @param #DETECTION_TYPES.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_TYPES:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " New target(s) detected: " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = " Invisible or destroyed target(s): " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Create the DetectedItems list from the DetectedObjects table. + -- For each DetectedItem, a one field array is created containing the Unit detected. + -- @param #DETECTION_TYPES self + -- @return #DETECTION_TYPES self + function DETECTION_TYPES:CreateDetectionSets() + self:F2( #self.DetectedObjects ) + + -- Loop the current detected items, and check if each object still exists and is detected. + + for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do + + local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT + local DetectedTypeName = DetectedItem.Type + + for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + + local DetectedObject = nil + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Yes, the DetectedUnit is still detected or exists. Flag as identified. + self:IdentifyDetectedObject( DetectedObject ) + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) + DetectedItemSet:Remove( DetectedUnitName ) + end + end + end + + + -- Now we need to loop through the unidentified detected units and add these... These are all new items. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + if DetectedObject then + self:T( { "Detected Unit #", DetectedUnitName } ) + + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + if DetectedUnit then + local DetectedTypeName = DetectedUnit:GetTypeName() + local DetectedItem = self:GetDetectedItem( DetectedTypeName ) + if not DetectedItem then + DetectedItem = self:AddDetectedItem( DetectedTypeName ) + DetectedItem.Type = DetectedUnit:GetTypeName() + end + + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeUnit( DetectedItem, "AU", DetectedTypeName ) + end + end + end + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + --self:NearestFAC( DetectedItem ) + end + + end + + --- Report summary of a DetectedItem using a given numeric index. + -- @param #DETECTION_TYPES self + -- @param Index + -- @return #string + function DETECTION_TYPES:DetectedItemReportSummary( DetectedTypeName ) + self:F( DetectedTypeName ) + + local DetectedItem = self:GetDetectedItem( DetectedTypeName ) + local DetectedSet = self:GetDetectedSet( DetectedTypeName ) + + self:T( DetectedItem ) + if DetectedItem then + + local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G() + local DetectedItemsCount = DetectedSet:Count() + local DetectedItemType = DetectedItem.Type + + local ReportSummary = string.format( + "Threat [%s] (%2d) - %2d of %s", + string.rep( "■", ThreatLevelA2G ), + ThreatLevelA2G, + DetectedItemsCount, + DetectedItemType + ) + self:T( ReportSummary ) + + return ReportSummary + end + end + + --- Report detailed of a detection result. + -- @param #DETECTION_TYPES self + -- @return #string + function DETECTION_TYPES:DetectedReportDetailed() + self:F() + + local Report = REPORT:New( "Detected types:" ) + for DetectedItemTypeName, DetectedItem in pairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemTypeName ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + +end + + +do -- DETECTION_AREAS + + --- # 4) DETECTION_AREAS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_AREAS class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), + -- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. + -- The class is group the detected units within zones given a DetectedZoneRange parameter. + -- A set with multiple detected zones will be created as there are groups of units detected. + -- + -- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones + -- + -- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and + -- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. + -- + -- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. + -- + -- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). + -- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). + -- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. + -- + -- ## 4.4) Flare or Smoke detected units + -- + -- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. + -- + -- ## 4.5) Flare or Smoke or Bound detected zones + -- + -- Use the methods: + -- + -- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag + -- + -- the detected zones when a new detection has taken place. + -- + -- @type DETECTION_AREAS + -- @field Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. + -- @field #DETECTION_BASE.DetectedItems DetectedItems A list of areas containing the set of @{Unit}s, @{Zone}s, the center @{Unit} within the zone, and ID of each area that was detected within a DetectionZoneRange. + -- @extends #DETECTION_BASE + DETECTION_AREAS = { + ClassName = "DETECTION_AREAS", + DetectionZoneRange = nil, + } + + + --- DETECTION_AREAS constructor. + -- @param #DETECTION_AREAS self + -- @param Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. + -- @param Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. + -- @return #DETECTION_AREAS + function DETECTION_AREAS:New( DetectionSetGroup, DetectionZoneRange ) + + -- Inherits from DETECTION_BASE + local self = BASE:Inherit( self, DETECTION_BASE:New( DetectionSetGroup ) ) + + self.DetectionZoneRange = DetectionZoneRange + + self._SmokeDetectedUnits = false + self._FlareDetectedUnits = false + self._SmokeDetectedZones = false + self._FlareDetectedZones = false + self._BoundDetectedZones = false + + return self + end + + --- Report summary of a detected item using a given numeric index. + -- @param #DETECTION_AREAS self + -- @param Index + -- @return #string + function DETECTION_AREAS:DetectedItemReportSummary( Index ) + self:F( Index ) + + local DetectedItem = self:GetDetectedItem( Index ) + if DetectedItem then + local DetectedSet = self:GetDetectedSet( Index ) + local ReportSummaryItem + + local DetectedZone = self:GetDetectedZone( Index ) + local DetectedItemPointVec3 = DetectedZone:GetPointVec3() + local DetectedItemPointLL = DetectedItemPointVec3:ToStringLL( 3, true ) + + local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem ) + local DetectedItemsCount = DetectedSet:Count() + local DetectedItemsTypes = DetectedSet:GetTypeNames() + + local ReportSummary = string.format( + "%s - Threat [%s] (%2d) - %2d of %s", + DetectedItemPointLL, + string.rep( "■", ThreatLevelA2G ), + ThreatLevelA2G, + DetectedItemsCount, + DetectedItemsTypes + ) + + return ReportSummary + end + + return nil + end + + + --- Returns if there are friendlies nearby the FAC units ... + -- @param #DETECTION_AREAS self + -- @return #boolean trhe if there are friendlies nearby + function DETECTION_AREAS:IsFriendliesNearBy( DetectedItem ) + + self:T3( DetectedItem.FriendliesNearBy ) + return DetectedItem.FriendliesNearBy or false + end + + --- Calculate the maxium A2G threat level of the DetectedItem. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + function DETECTION_AREAS:CalculateThreatLevelA2G( DetectedItem ) + + local MaxThreatLevelA2G = 0 + for UnitName, UnitData in pairs( DetectedItem.Set:GetSet() ) do + local ThreatUnit = UnitData -- Wrapper.Unit#UNIT + local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + if ThreatLevelA2G > MaxThreatLevelA2G then + MaxThreatLevelA2G = ThreatLevelA2G + end + end + + self:T3( MaxThreatLevelA2G ) + DetectedItem.MaxThreatLevelA2G = MaxThreatLevelA2G + + end + + --- Find the nearest FAC of the DetectedItem. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return Wrapper.Unit#UNIT The nearest FAC unit + function DETECTION_AREAS:NearestFAC( DetectedItem ) + + local NearestFAC = nil + local MinDistance = 1000000000 -- Units are not further than 1000000 km away from an area :-) + + for FACGroupName, FACGroupData in pairs( self.DetectionSetGroup:GetSet() ) do + for FACUnit, FACUnitData in pairs( FACGroupData:GetUnits() ) do + local FACUnit = FACUnitData -- Wrapper.Unit#UNIT + if FACUnit:IsActive() then + local Vec3 = FACUnit:GetVec3() + local PointVec3 = POINT_VEC3:NewFromVec3( Vec3 ) + local Distance = PointVec3:Get2DDistance(POINT_VEC3:NewFromVec3( FACUnit:GetVec3() ) ) + if Distance < MinDistance then + MinDistance = Distance + NearestFAC = FACUnit + end + end + end + end + + DetectedItem.NearestFAC = NearestFAC + + end + + --- Returns the A2G threat level of the units in the DetectedItem + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #number a scale from 0 to 10. + function DETECTION_AREAS:GetTreatLevelA2G( DetectedItem ) + + self:T3( DetectedItem.MaxThreatLevelA2G ) + return DetectedItem.MaxThreatLevelA2G + end + + + + --- Smoke the detected units + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:SmokeDetectedUnits() + self:F2() + + self._SmokeDetectedUnits = true + return self + end + + --- Flare the detected units + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:FlareDetectedUnits() + self:F2() + + self._FlareDetectedUnits = true + return self + end + + --- Smoke the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:SmokeDetectedZones() + self:F2() + + self._SmokeDetectedZones = true + return self + end + + --- Flare the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:FlareDetectedZones() + self:F2() + + self._FlareDetectedZones = true + return self + end + + --- Bound the detected zones + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:BoundDetectedZones() + self:F2() + + self._BoundDetectedZones = true + return self + end + + --- Make text documenting the changes of the detected zone. + -- @param #DETECTION_AREAS self + -- @param #DETECTION_BASE.DetectedItem DetectedItem + -- @return #string The Changes text + function DETECTION_AREAS:GetChangeText( DetectedItem ) + self:F( DetectedItem ) + + local MT = {} + + for ChangeCode, ChangeData in pairs( DetectedItem.Changes ) do + + if ChangeCode == "AA" then + MT[#MT+1] = "Detected new area " .. ChangeData.ItemID .. ". The center target is a " .. ChangeData.ItemUnitType .. "." + end + + if ChangeCode == "RAU" then + MT[#MT+1] = "Changed area " .. ChangeData.ItemID .. ". Removed the center target." + end + + if ChangeCode == "AAU" then + MT[#MT+1] = "Changed area " .. ChangeData.ItemID .. ". The new center target is a " .. ChangeData.ItemUnitType "." + end + + if ChangeCode == "RA" then + MT[#MT+1] = "Removed old area " .. ChangeData.ItemID .. ". No more targets in this area." + end + + if ChangeCode == "AU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = "Detected for area " .. ChangeData.ItemID .. " new target(s) " .. table.concat( MTUT, ", " ) .. "." + end + + if ChangeCode == "RU" then + local MTUT = {} + for ChangeUnitType, ChangeUnitCount in pairs( ChangeData ) do + if ChangeUnitType ~= "ItemID" then + MTUT[#MTUT+1] = ChangeUnitCount .. " of " .. ChangeUnitType + end + end + MT[#MT+1] = "Removed for area " .. ChangeData.ItemID .. " invisible or destroyed target(s) " .. table.concat( MTUT, ", " ) .. "." + end + + end + + return table.concat( MT, "\n" ) + + end + + + --- Make a DetectionSet table. This function will be overridden in the derived clsses. + -- @param #DETECTION_AREAS self + -- @return #DETECTION_AREAS self + function DETECTION_AREAS:CreateDetectionSets() + self:F2() + + + self:T( "Checking Detected Items for new Detected Units ..." ) + -- First go through all detected sets, and check if there are new detected units, match all existing detected units and identify undetected units. + -- Regroup when needed, split groups when needed. + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + if DetectedItem then + + self:T( { "Detected Item ID:", DetectedItemID } ) + + + local DetectedSet = DetectedItem.Set + + local AreaExists = false -- This flag will determine of the detected area is still existing. + + -- First test if the center unit is detected in the detection area. + self:T3( { "Zone Center Unit:", DetectedItem.Zone.ZoneUNIT.UnitName } ) + local DetectedZoneObject = self:GetDetectedObject( DetectedItem.Zone.ZoneUNIT.UnitName ) + self:T3( { "Detected Zone Object:", DetectedItem.Zone:GetName(), DetectedZoneObject } ) + + if DetectedZoneObject then + + --self:IdentifyDetectedObject( DetectedZoneObject ) + AreaExists = true + + + + else + -- The center object of the detected area has not been detected. Find an other unit of the set to become the center of the area. + -- First remove the center unit from the set. + DetectedSet:RemoveUnitsByName( DetectedItem.Zone.ZoneUNIT.UnitName ) + + self:AddChangeItem( DetectedItem, 'RAU', "Dummy" ) + + -- Then search for a new center area unit within the set. Note that the new area unit candidate must be within the area range. + for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + local DetectedObject = self:GetDetectedObject( DetectedUnit.UnitName ) + + -- The DetectedObject can be nil when the DetectedUnit is not alive anymore or it is not in the DetectedObjects map. + -- If the DetectedUnit was already identified, DetectedObject will be nil. + if DetectedObject then + self:IdentifyDetectedObject( DetectedObject ) + AreaExists = true + + DetectedItem.Zone:BoundZone( 12, self.CountryID, true) + + -- Assign the Unit as the new center unit of the detected area. + DetectedItem.Zone = ZONE_UNIT:New( DetectedUnit:GetName(), DetectedUnit, self.DetectionZoneRange ) + + self:AddChangeItem( DetectedItem, "AAU", DetectedItem.Zone.ZoneUNIT:GetTypeName() ) + + -- We don't need to add the DetectedObject to the area set, because it is already there ... + break + end + end + end + + -- Now we've determined the center unit of the area, now we can iterate the units in the detected area. + -- Note that the position of the area may have moved due to the center unit repositioning. + -- If no center unit was identified, then the detected area does not exist anymore and should be deleted, as there are no valid units that can be the center unit. + if AreaExists then + + -- ok, we found the center unit of the area, now iterate through the detected area set and see which units are still within the center unit zone ... + -- Those units within the zone are flagged as Identified. + -- If a unit was not found in the set, remove it from the set. This may be added later to other existing or new sets. + for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + local DetectedObject = nil + if DetectedUnit:IsAlive() then + --self:E(DetectedUnit:GetName()) + DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() ) + end + if DetectedObject then + + -- Check if the DetectedUnit is within the DetectedItem.Zone + if DetectedUnit:IsInZone( DetectedItem.Zone ) then + + -- Yes, the DetectedUnit is within the DetectedItem.Zone, no changes, DetectedUnit can be kept within the Set. + self:IdentifyDetectedObject( DetectedObject ) + + else + -- No, the DetectedUnit is not within the DetectedItem.Zone, remove DetectedUnit from the Set. + DetectedSet:Remove( DetectedUnitName ) + self:AddChangeUnit( DetectedItem, "RU", DetectedUnit:GetTypeName() ) + end + + else + -- There was no DetectedObject, remove DetectedUnit from the Set. + self:AddChangeUnit( DetectedItem, "RU", "destroyed target" ) + DetectedSet:Remove( DetectedUnitName ) + + -- The DetectedObject has been identified, because it does not exist ... + -- self:IdentifyDetectedObject( DetectedObject ) + end + end + else + DetectedItem.Zone:BoundZone( 12, self.CountryID, true) + self:RemoveDetectedItem( DetectedItemID ) + self:AddChangeItem( DetectedItem, "RA" ) + end + end + end + + -- We iterated through the existing detection areas and: + -- - We checked which units are still detected in each detection area. Those units were flagged as Identified. + -- - We recentered the detection area to new center units where it was needed. + -- + -- Now we need to loop through the unidentified detected units and see where they belong: + -- - They can be added to a new detection area and become the new center unit. + -- - They can be added to a new detection area. + for DetectedUnitName, DetectedObjectData in pairs( self.DetectedObjects ) do + + local DetectedObject = self:GetDetectedObject( DetectedUnitName ) + + if DetectedObject then + + -- We found an unidentified unit outside of any existing detection area. + local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT + + local AddedToDetectionArea = false + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + if DetectedItem then + self:T( "Detection Area #" .. DetectedItem.ItemID ) + local DetectedSet = DetectedItem.Set + if not self:IsDetectedObjectIdentified( DetectedObject ) and DetectedUnit:IsInZone( DetectedItem.Zone ) then + self:IdentifyDetectedObject( DetectedObject ) + DetectedSet:AddUnit( DetectedUnit ) + AddedToDetectionArea = true + self:AddChangeUnit( DetectedItem, "AU", DetectedUnit:GetTypeName() ) + end + end + end + + if AddedToDetectionArea == false then + + -- New detection area + local DetectedItem = self:AddDetectedItemZone( nil, + SET_UNIT:New(), + ZONE_UNIT:New( DetectedUnitName, DetectedUnit, self.DetectionZoneRange ) + ) + --self:E( DetectedItem.Zone.ZoneUNIT.UnitName ) + DetectedItem.Set:AddUnit( DetectedUnit ) + self:AddChangeItem( DetectedItem, "AA", DetectedUnit:GetTypeName() ) + end + end + end + + -- Now all the tests should have been build, now make some smoke and flares... + -- We also report here the friendlies within the detected areas. + + for DetectedItemID, DetectedItemData in pairs( self.DetectedItems ) do + + local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table + self:CalculateThreatLevelA2G( DetectedItem ) -- Calculate A2G threat level + self:NearestFAC( DetectedItem ) + + if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then + DetectedZone.ZoneUNIT:SmokeRed() + end + DetectedSet:ForEachUnit( + --- @param Wrapper.Unit#UNIT DetectedUnit + function( DetectedUnit ) + if DetectedUnit:IsAlive() then + self:T( "Detected Set #" .. DetectedItem.ItemID .. ":" .. DetectedUnit:GetName() ) + if DETECTION_AREAS._FlareDetectedUnits or self._FlareDetectedUnits then + DetectedUnit:FlareGreen() + end + if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then + DetectedUnit:SmokeGreen() + end + end + end + ) + if DETECTION_AREAS._FlareDetectedZones or self._FlareDetectedZones then + DetectedZone:FlareZone( SMOKECOLOR.White, 30, math.random( 0,90 ) ) + end + if DETECTION_AREAS._SmokeDetectedZones or self._SmokeDetectedZones then + DetectedZone:SmokeZone( SMOKECOLOR.White, 30 ) + end + + if DETECTION_AREAS._BoundDetectedZones or self._BoundDetectedZones then + DetectedZone:BoundZone( 12, self.CountryID ) + end + end + + end + +end +--- Single-Player:**No** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**All** -- **AI Balancing will replace in multi player missions +-- non-occupied human slots with AI groups, in order to provide an engaging simulation environment, +-- even when there are hardly any players in the mission.** +-- +-- ![Banner Image](..\Presentations\AI_Balancer\Dia1.JPG) +-- +-- === +-- +-- # 1) @{AI_Balancer#AI_BALANCER} class, extends @{Fsm#FSM_SET} +-- +-- The @{AI_Balancer#AI_BALANCER} class monitors and manages as many replacement AI groups as there are +-- CLIENTS in a SET_CLIENT collection, which are not occupied by human players. +-- In other words, use AI_BALANCER to simulate human behaviour by spawning in replacement AI in multi player missions. +-- +-- The parent class @{Fsm#FSM_SET} manages the functionality to control the Finite State Machine (FSM). +-- The mission designer can tailor the behaviour of the AI_BALANCER, by defining event and state transition methods. +-- An explanation about state and event transition methods can be found in the @{FSM} module documentation. +-- +-- The mission designer can tailor the AI_BALANCER behaviour, by implementing a state or event handling method for the following: +-- +-- * **@{#AI_BALANCER.OnAfterSpawned}**( AISet, From, Event, To, AIGroup ): Define to add extra logic when an AI is spawned. +-- +-- ## 1.1) AI_BALANCER construction +-- +-- Create a new AI_BALANCER object with the @{#AI_BALANCER.New}() method: +-- +-- ## 1.2) AI_BALANCER is a FSM +-- +-- ![Process](..\Presentations\AI_Balancer\Dia13.JPG) +-- +-- ### 1.2.1) AI_BALANCER States +-- +-- * **Monitoring** ( Set ): Monitoring the Set if all AI is spawned for the Clients. +-- * **Spawning** ( Set, ClientName ): There is a new AI group spawned with ClientName as the name of reference. +-- * **Spawned** ( Set, AIGroup ): A new AI has been spawned. You can handle this event to customize the AI behaviour with other AI FSMs or own processes. +-- * **Destroying** ( Set, AIGroup ): The AI is being destroyed. +-- * **Returning** ( Set, AIGroup ): The AI is returning to the airbase specified by the ReturnToAirbase methods. Handle this state to customize the return behaviour of the AI, if any. +-- +-- ### 1.2.2) AI_BALANCER Events +-- +-- * **Monitor** ( Set ): Every 10 seconds, the Monitor event is triggered to monitor the Set. +-- * **Spawn** ( Set, ClientName ): Triggers when there is a new AI group to be spawned with ClientName as the name of reference. +-- * **Spawned** ( Set, AIGroup ): Triggers when a new AI has been spawned. You can handle this event to customize the AI behaviour with other AI FSMs or own processes. +-- * **Destroy** ( Set, AIGroup ): The AI is being destroyed. +-- * **Return** ( Set, AIGroup ): The AI is returning to the airbase specified by the ReturnToAirbase methods. +-- +-- ## 1.3) AI_BALANCER spawn interval for replacement AI +-- +-- Use the method @{#AI_BALANCER.InitSpawnInterval}() to set the earliest and latest interval in seconds that is waited until a new replacement AI is spawned. +-- +-- ## 1.4) AI_BALANCER returns AI to Airbases +-- +-- By default, When a human player joins a slot that is AI_BALANCED, the AI group will be destroyed by default. +-- However, there are 2 additional options that you can use to customize the destroy behaviour. +-- When a human player joins a slot, you can configure to let the AI return to: +-- +-- * @{#AI_BALANCER.ReturnToHomeAirbase}: Returns the AI to the **home** @{Airbase#AIRBASE}. +-- * @{#AI_BALANCER.ReturnToNearestAirbases}: Returns the AI to the **nearest friendly** @{Airbase#AIRBASE}. +-- +-- Note that when AI returns to an airbase, the AI_BALANCER will trigger the **Return** event and the AI will return, +-- otherwise the AI_BALANCER will trigger a **Destroy** event, and the AI will be destroyed. +-- +-- === +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-17: There is still a problem with AI being destroyed, but not respawned. Need to check further upon that. +-- +-- 2017-01-08: AI_BALANCER:**InitSpawnInterval( Earliest, Latest )** added. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Dutch_Baron](https://forums.eagle.ru/member.php?u=112075)**: Working together with James has resulted in the creation of the AI_BALANCER class. James has shared his ideas on balancing AI with air units, and together we made a first design which you can use now :-) +-- * **SNAFU**: Had a couple of mails with the guys to validate, if the same concept in the GCI/CAP script could be reworked within MOOSE. None of the script code has been used however within the new AI_BALANCER moose class. +-- +-- ### Authors: +-- +-- * FlightControl: Framework Design & Programming and Documentation. +-- +-- @module AI_Balancer + +--- AI_BALANCER class +-- @type AI_BALANCER +-- @field Core.Set#SET_CLIENT SetClient +-- @field Functional.Spawn#SPAWN SpawnAI +-- @field Wrapper.Group#GROUP Test +-- @extends Core.Fsm#FSM_SET +AI_BALANCER = { + ClassName = "AI_BALANCER", + PatrolZones = {}, + AIGroups = {}, + Earliest = 5, -- Earliest a new AI can be spawned is in 5 seconds. + Latest = 60, -- Latest a new AI can be spawned is in 60 seconds. +} + + + +--- Creates a new AI_BALANCER object +-- @param #AI_BALANCER self +-- @param Core.Set#SET_CLIENT SetClient A SET\_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). +-- @param Functional.Spawn#SPAWN SpawnAI The default Spawn object to spawn new AI Groups when needed. +-- @return #AI_BALANCER +function AI_BALANCER:New( SetClient, SpawnAI ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_SET:New( SET_GROUP:New() ) ) -- AI.AI_Balancer#AI_BALANCER + + -- TODO: Define the OnAfterSpawned event + self:SetStartState( "None" ) + self:AddTransition( "*", "Monitor", "Monitoring" ) + self:AddTransition( "*", "Spawn", "Spawning" ) + self:AddTransition( "Spawning", "Spawned", "Spawned" ) + self:AddTransition( "*", "Destroy", "Destroying" ) + self:AddTransition( "*", "Return", "Returning" ) + + self.SetClient = SetClient + self.SetClient:FilterOnce() + self.SpawnAI = SpawnAI + + self.SpawnQueue = {} + + self.ToNearestAirbase = false + self.ToHomeAirbase = false + + self:__Monitor( 1 ) + + return self +end + +--- Sets the earliest to the latest interval in seconds how long AI_BALANCER will wait to spawn a new AI. +-- Provide 2 identical seconds if the interval should be a fixed amount of seconds. +-- @param #AI_BALANCER self +-- @param #number Earliest The earliest a new AI can be spawned in seconds. +-- @param #number Latest The latest a new AI can be spawned in seconds. +-- @return self +function AI_BALANCER:InitSpawnInterval( Earliest, Latest ) + + self.Earliest = Earliest + self.Latest = Latest + + return self +end + +--- Returns the AI to the nearest friendly @{Airbase#AIRBASE}. +-- @param #AI_BALANCER self +-- @param Dcs.DCSTypes#Distance ReturnTresholdRange If there is an enemy @{Client#CLIENT} within the ReturnTresholdRange given in meters, the AI will not return to the nearest @{Airbase#AIRBASE}. +-- @param Core.Set#SET_AIRBASE ReturnAirbaseSet The SET of @{Set#SET_AIRBASE}s to evaluate where to return to. +function AI_BALANCER:ReturnToNearestAirbases( ReturnTresholdRange, ReturnAirbaseSet ) + + self.ToNearestAirbase = true + self.ReturnTresholdRange = ReturnTresholdRange + self.ReturnAirbaseSet = ReturnAirbaseSet +end + +--- Returns the AI to the home @{Airbase#AIRBASE}. +-- @param #AI_BALANCER self +-- @param Dcs.DCSTypes#Distance ReturnTresholdRange If there is an enemy @{Client#CLIENT} within the ReturnTresholdRange given in meters, the AI will not return to the nearest @{Airbase#AIRBASE}. +function AI_BALANCER:ReturnToHomeAirbase( ReturnTresholdRange ) + + self.ToHomeAirbase = true + self.ReturnTresholdRange = ReturnTresholdRange +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param #string ClientName +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterSpawning( SetGroup, From, Event, To, ClientName ) + + -- OK, Spawn a new group from the default SpawnAI object provided. + local AIGroup = self.SpawnAI:Spawn() -- Wrapper.Group#GROUP + if AIGroup then + AIGroup:E( "Spawning new AIGroup" ) + --TODO: need to rework UnitName thing ... + + SetGroup:Add( ClientName, AIGroup ) + self.SpawnQueue[ClientName] = nil + + -- Fire the Spawned event. The first parameter is the AIGroup just Spawned. + -- Mission designers can catch this event to bind further actions to the AIGroup. + self:Spawned( AIGroup ) + end +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterDestroying( SetGroup, From, Event, To, ClientName, AIGroup ) + + AIGroup:Destroy() + SetGroup:Flush() + SetGroup:Remove( ClientName ) + SetGroup:Flush() +end + +--- @param #AI_BALANCER self +-- @param Core.Set#SET_GROUP SetGroup +-- @param Wrapper.Group#GROUP AIGroup +function AI_BALANCER:onenterReturning( SetGroup, From, Event, To, AIGroup ) + + local AIGroupTemplate = AIGroup:GetTemplate() + if self.ToHomeAirbase == true then + local WayPointCount = #AIGroupTemplate.route.points + local SwitchWayPointCommand = AIGroup:CommandSwitchWayPoint( 1, WayPointCount, 1 ) + AIGroup:SetCommand( SwitchWayPointCommand ) + AIGroup:MessageToRed( "Returning to home base ...", 30 ) + else + -- Okay, we need to send this Group back to the nearest base of the Coalition of the AI. + --TODO: i need to rework the POINT_VEC2 thing. + local PointVec2 = POINT_VEC2:New( AIGroup:GetVec2().x, AIGroup:GetVec2().y ) + local ClosestAirbase = self.ReturnAirbaseSet:FindNearestAirbaseFromPointVec2( PointVec2 ) + self:T( ClosestAirbase.AirbaseName ) + AIGroup:MessageToRed( "Returning to " .. ClosestAirbase:GetName().. " ...", 30 ) + local RTBRoute = AIGroup:RouteReturnToAirbase( ClosestAirbase ) + AIGroupTemplate.route = RTBRoute + AIGroup:Respawn( AIGroupTemplate ) + end + +end + + +--- @param #AI_BALANCER self +function AI_BALANCER:onenterMonitoring( SetGroup ) + + self:T2( { self.SetClient:Count() } ) + --self.SetClient:Flush() + + self.SetClient:ForEachClient( + --- @param Wrapper.Client#CLIENT Client + function( Client ) + self:T3(Client.ClientName) + + local AIGroup = self.Set:Get( Client.UnitName ) -- Wrapper.Group#GROUP + if Client:IsAlive() then + + if AIGroup and AIGroup:IsAlive() == true then + + if self.ToNearestAirbase == false and self.ToHomeAirbase == false then + self:Destroy( Client.UnitName, AIGroup ) + else + -- We test if there is no other CLIENT within the self.ReturnTresholdRange of the first unit of the AI group. + -- If there is a CLIENT, the AI stays engaged and will not return. + -- If there is no CLIENT within the self.ReturnTresholdRange, then the unit will return to the Airbase return method selected. + + local PlayerInRange = { Value = false } + local RangeZone = ZONE_RADIUS:New( 'RangeZone', AIGroup:GetVec2(), self.ReturnTresholdRange ) + + self:T2( RangeZone ) + + _DATABASE:ForEachPlayer( + --- @param Wrapper.Unit#UNIT RangeTestUnit + function( RangeTestUnit, RangeZone, AIGroup, PlayerInRange ) + self:T2( { PlayerInRange, RangeTestUnit.UnitName, RangeZone.ZoneName } ) + if RangeTestUnit:IsInZone( RangeZone ) == true then + self:T2( "in zone" ) + if RangeTestUnit:GetCoalition() ~= AIGroup:GetCoalition() then + self:T2( "in range" ) + PlayerInRange.Value = true + end + end + end, + + --- @param Core.Zone#ZONE_RADIUS RangeZone + -- @param Wrapper.Group#GROUP AIGroup + function( RangeZone, AIGroup, PlayerInRange ) + if PlayerInRange.Value == false then + self:Return( AIGroup ) + end + end + , RangeZone, AIGroup, PlayerInRange + ) + + end + self.Set:Remove( Client.UnitName ) + end + else + if not AIGroup or not AIGroup:IsAlive() == true then + self:T( "Client " .. Client.UnitName .. " not alive." ) + if not self.SpawnQueue[Client.UnitName] then + -- Spawn a new AI taking into account the spawn interval Earliest, Latest + self:__Spawn( math.random( self.Earliest, self.Latest ), Client.UnitName ) + self.SpawnQueue[Client.UnitName] = true + self:E( "New AI Spawned for Client " .. Client.UnitName ) + end + end + end + return true + end + ) + + self:__Monitor( 10 ) +end + + + +--- **AI** -- **Air Patrolling or Staging.** +-- +-- ![Banner Image](..\Presentations\AI_PATROL\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_PATROL_ZONE} class, extends @{Fsm#FSM_CONTROLLABLE} +-- +-- The @{#AI_PATROL_ZONE} class implements the core functions to patrol a @{Zone} by an AI @{Controllable} or @{Group}. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia3.JPG) +-- +-- The AI_PATROL_ZONE is assigned a @{Group} and this must be done before the AI_PATROL_ZONE process can be started using the **Start** event. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia4.JPG) +-- +-- The AI will fly towards the random 3D point within the patrol zone, using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia5.JPG) +-- +-- This cycle will continue. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia6.JPG) +-- +-- During the patrol, the AI will detect enemy targets, which are reported through the **Detected** event. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia9.JPG) +-- +---- Note that the enemy is not engaged! To model enemy engagement, either tailor the **Detected** event, or +-- use derived AI_ classes to model AI offensive or defensive behaviour. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia10.JPG) +-- +-- Until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Process](..\Presentations\AI_PATROL\Dia11.JPG) +-- +-- ## 1.1) AI_PATROL_ZONE constructor +-- +-- * @{#AI_PATROL_ZONE.New}(): Creates a new AI_PATROL_ZONE object. +-- +-- ## 1.2) AI_PATROL_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_PATROL\Dia2.JPG) +-- +-- ### 1.2.1) AI_PATROL_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Returning** ( Group ): The AI is returning to Base. +-- * **Stopped** ( Group ): The process is stopped. +-- * **Crashed** ( Group ): The AI has crashed or is dead. +-- +-- ### 1.2.2) AI_PATROL_ZONE Events +-- +-- * **Start** ( Group ): Start the process. +-- * **Stop** ( Group ): Stop the process. +-- * **Route** ( Group ): Route the AI to a new random 3D point within the Patrol Zone. +-- * **RTB** ( Group ): Route the AI to the home base. +-- * **Detect** ( Group ): The AI is detecting targets. +-- * **Detected** ( Group ): The AI has detected new targets. +-- * **Status** ( Group ): The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ## 1.3) Set or Get the AI controllable +-- +-- * @{#AI_PATROL_ZONE.SetControllable}(): Set the AIControllable. +-- * @{#AI_PATROL_ZONE.GetControllable}(): Get the AIControllable. +-- +-- ## 1.4) Set the Speed and Altitude boundaries of the AI controllable +-- +-- * @{#AI_PATROL_ZONE.SetSpeed}(): Set the patrol speed boundaries of the AI, for the next patrol. +-- * @{#AI_PATROL_ZONE.SetAltitude}(): Set altitude boundaries of the AI, for the next patrol. +-- +-- ## 1.5) Manage the detection process of the AI controllable +-- +-- The detection process of the AI controllable can be manipulated. +-- Detection requires an amount of CPU power, which has an impact on your mission performance. +-- Only put detection on when absolutely necessary, and the frequency of the detection can also be set. +-- +-- * @{#AI_PATROL_ZONE.SetDetectionOn}(): Set the detection on. The AI will detect for targets. +-- * @{#AI_PATROL_ZONE.SetDetectionOff}(): Set the detection off, the AI will not detect for targets. The existing target list will NOT be erased. +-- +-- The detection frequency can be set with @{#AI_PATROL_ZONE.SetDetectionInterval}( seconds ), where the amount of seconds specify how much seconds will be waited before the next detection. +-- Use the method @{#AI_PATROL_ZONE.GetDetectedUnits}() to obtain a list of the @{Unit}s detected by the AI. +-- +-- The detection can be filtered to potential targets in a specific zone. +-- Use the method @{#AI_PATROL_ZONE.SetDetectionZone}() to set the zone where targets need to be detected. +-- Note that when the zone is too far away, or the AI is not heading towards the zone, or the AI is too high, no targets may be detected +-- according the weather conditions. +-- +-- ## 1.6) Manage the "out of fuel" in the AI_PATROL_ZONE +-- +-- When the AI is out of fuel, it is required that a new AI is started, before the old AI can return to the home base. +-- Therefore, with a parameter and a calculation of the distance to the home base, the fuel treshold is calculated. +-- When the fuel treshold is reached, the AI will continue for a given time its patrol task in orbit, +-- while a new AI is targetted to the AI_PATROL_ZONE. +-- Once the time is finished, the old AI will return to the base. +-- Use the method @{#AI_PATROL_ZONE.ManageFuel}() to have this proces in place. +-- +-- ## 1.7) Manage "damage" behaviour of the AI in the AI_PATROL_ZONE +-- +-- When the AI is damaged, it is required that a new AIControllable is started. However, damage cannon be foreseen early on. +-- Therefore, when the damage treshold is reached, the AI will return immediately to the home base (RTB). +-- Use the method @{#AI_PATROL_ZONE.ManageDamage}() to have this proces in place. +-- +-- ==== +-- +-- # **OPEN ISSUES** +-- +-- 2017-01-17: When Spawned AI is located at an airbase, it will be routed first back to the airbase after take-off. +-- +-- 2016-01-17: +-- -- Fixed problem with AI returning to base too early and unexpected. +-- -- ReSpawning of AI will reset the AI_PATROL and derived classes. +-- -- Checked the correct workings of SCHEDULER, and it DOES work correctly. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-17: Rename of class: **AI\_PATROL\_ZONE** is the new name for the old _AI\_PATROLZONE_. +-- +-- 2017-01-15: Complete revision. AI_PATROL_ZONE is the base class for other AI_PATROL like classes. +-- +-- 2016-09-01: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Dutch_Baron](https://forums.eagle.ru/member.php?u=112075)**: Working together with James has resulted in the creation of the AI_BALANCER class. James has shared his ideas on balancing AI with air units, and together we made a first design which you can use now :-) +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Testing and API concept review. +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming. +-- +-- @module AI_Patrol + +--- AI_PATROL_ZONE class +-- @type AI_PATROL_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @field Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @field Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @field Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @field Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @field Functional.Spawn#SPAWN CoordTest +-- @extends Core.Fsm#FSM_CONTROLLABLE +AI_PATROL_ZONE = { + ClassName = "AI_PATROL_ZONE", +} + +--- Creates a new AI_PATROL_ZONE object +-- @param #AI_PATROL_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_PATROL_ZONE self +-- @usage +-- -- Define a new AI_PATROL_ZONE Object. This PatrolArea will patrol an AIControllable within PatrolZone between 3000 and 6000 meters, with a variying speed between 600 and 900 km/h. +-- PatrolZone = ZONE:New( 'PatrolZone' ) +-- PatrolSpawn = SPAWN:New( 'Patrol Group' ) +-- PatrolArea = AI_PATROL_ZONE:New( PatrolZone, 3000, 6000, 600, 900 ) +function AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- #AI_PATROL_ZONE + + + self.PatrolZone = PatrolZone + self.PatrolFloorAltitude = PatrolFloorAltitude + self.PatrolCeilingAltitude = PatrolCeilingAltitude + self.PatrolMinSpeed = PatrolMinSpeed + self.PatrolMaxSpeed = PatrolMaxSpeed + + -- defafult PatrolAltType to "RADIO" if not specified + self.PatrolAltType = PatrolAltType or "RADIO" + + self:SetDetectionInterval( 30 ) + + self.CheckStatus = true + + self:ManageFuel( .2, 60 ) + self:ManageDamage( 1 ) + + + self.DetectedUnits = {} -- This table contains the targets detected during patrol. + + self:SetStartState( "None" ) + + self:AddTransition( "*", "Stop", "Stopped" ) + +--- OnLeave Transition Handler for State Stopped. +-- @function [parent=#AI_PATROL_ZONE] OnLeaveStopped +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Stopped. +-- @function [parent=#AI_PATROL_ZONE] OnEnterStopped +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- OnBefore Transition Handler for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStop +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStop +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] Stop +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Stop. +-- @function [parent=#AI_PATROL_ZONE] __Stop +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "None", "Start", "Patrolling" ) + +--- OnBefore Transition Handler for Event Start. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStart +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Start. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStart +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Start. +-- @function [parent=#AI_PATROL_ZONE] Start +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Start. +-- @function [parent=#AI_PATROL_ZONE] __Start +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Patrolling. +-- @function [parent=#AI_PATROL_ZONE] OnLeavePatrolling +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Patrolling. +-- @function [parent=#AI_PATROL_ZONE] OnEnterPatrolling +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Patrolling", "Route", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Route. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeRoute +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Route. +-- @function [parent=#AI_PATROL_ZONE] OnAfterRoute +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Route. +-- @function [parent=#AI_PATROL_ZONE] Route +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Route. +-- @function [parent=#AI_PATROL_ZONE] __Route +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Status", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Status. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeStatus +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Status. +-- @function [parent=#AI_PATROL_ZONE] OnAfterStatus +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Status. +-- @function [parent=#AI_PATROL_ZONE] Status +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Status. +-- @function [parent=#AI_PATROL_ZONE] __Status +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Detect", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeDetect +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] OnAfterDetect +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] Detect +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Detect. +-- @function [parent=#AI_PATROL_ZONE] __Detect +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Detected", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeDetected +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] OnAfterDetected +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] Detected +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event Detected. +-- @function [parent=#AI_PATROL_ZONE] __Detected +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "RTB", "Returning" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + +--- OnBefore Transition Handler for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] OnBeforeRTB +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnAfter Transition Handler for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] OnAfterRTB +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + +--- Synchronous Event Trigger for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] RTB +-- @param #AI_PATROL_ZONE self + +--- Asynchronous Event Trigger for Event RTB. +-- @function [parent=#AI_PATROL_ZONE] __RTB +-- @param #AI_PATROL_ZONE self +-- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Returning. +-- @function [parent=#AI_PATROL_ZONE] OnLeaveReturning +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Returning. +-- @function [parent=#AI_PATROL_ZONE] OnEnterReturning +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "*", "Reset", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_PATROL_ZONE. + + self:AddTransition( "*", "Eject", "*" ) + self:AddTransition( "*", "Crash", "Crashed" ) + self:AddTransition( "*", "PilotDead", "*" ) + + return self +end + + + + +--- Sets (modifies) the minimum and maximum speed of the patrol. +-- @param #AI_PATROL_ZONE self +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetSpeed( PatrolMinSpeed, PatrolMaxSpeed ) + self:F2( { PatrolMinSpeed, PatrolMaxSpeed } ) + + self.PatrolMinSpeed = PatrolMinSpeed + self.PatrolMaxSpeed = PatrolMaxSpeed +end + + + +--- Sets the floor and ceiling altitude of the patrol. +-- @param #AI_PATROL_ZONE self +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetAltitude( PatrolFloorAltitude, PatrolCeilingAltitude ) + self:F2( { PatrolFloorAltitude, PatrolCeilingAltitude } ) + + self.PatrolFloorAltitude = PatrolFloorAltitude + self.PatrolCeilingAltitude = PatrolCeilingAltitude +end + +-- * @{#AI_PATROL_ZONE.SetDetectionOn}(): Set the detection on. The AI will detect for targets. +-- * @{#AI_PATROL_ZONE.SetDetectionOff}(): Set the detection off, the AI will not detect for targets. The existing target list will NOT be erased. + +--- Set the detection on. The AI will detect for targets. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionOn() + self:F2() + + self.DetectOn = true +end + +--- Set the detection off. The AI will NOT detect for targets. +-- However, the list of already detected targets will be kept and can be enquired! +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionOff() + self:F2() + + self.DetectOn = false +end + +--- Set the status checking off. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetStatusOff() + self:F2() + + self.CheckStatus = false +end + +--- Activate the detection. The AI will detect for targets if the Detection is switched On. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionActivated() + self:F2() + + self:ClearDetectedUnits() + self.DetectActivated = true + self:__Detect( -self.DetectInterval ) +end + +--- Deactivate the detection. The AI will NOT detect for targets. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionDeactivated() + self:F2() + + self:ClearDetectedUnits() + self.DetectActivated = false +end + +--- Set the interval in seconds between each detection executed by the AI. +-- The list of already detected targets will be kept and updated. +-- Newly detected targets will be added, but already detected targets that were +-- not detected in this cycle, will NOT be removed! +-- The default interval is 30 seconds. +-- @param #AI_PATROL_ZONE self +-- @param #number Seconds The interval in seconds. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionInterval( Seconds ) + self:F2() + + if Seconds then + self.DetectInterval = Seconds + else + self.DetectInterval = 30 + end +end + +--- Set the detection zone where the AI is detecting targets. +-- @param #AI_PATROL_ZONE self +-- @param Core.Zone#ZONE DetectionZone The zone where to detect targets. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:SetDetectionZone( DetectionZone ) + self:F2() + + if DetectionZone then + self.DetectZone = DetectionZone + else + self.DetectZone = nil + end +end + +--- Gets a list of @{Unit#UNIT}s that were detected by the AI. +-- No filtering is applied, so, ANY detected UNIT can be in this list. +-- It is up to the mission designer to use the @{Unit} class and methods to filter the targets. +-- @param #AI_PATROL_ZONE self +-- @return #table The list of @{Unit#UNIT}s +function AI_PATROL_ZONE:GetDetectedUnits() + self:F2() + + return self.DetectedUnits +end + +--- Clears the list of @{Unit#UNIT}s that were detected by the AI. +-- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ClearDetectedUnits() + self:F2() + self.DetectedUnits = {} +end + +--- When the AI is out of fuel, it is required that a new AI is started, before the old AI can return to the home base. +-- Therefore, with a parameter and a calculation of the distance to the home base, the fuel treshold is calculated. +-- When the fuel treshold is reached, the AI will continue for a given time its patrol task in orbit, while a new AIControllable is targetted to the AI_PATROL_ZONE. +-- Once the time is finished, the old AI will return to the base. +-- @param #AI_PATROL_ZONE self +-- @param #number PatrolFuelTresholdPercentage The treshold in percentage (between 0 and 1) when the AIControllable is considered to get out of fuel. +-- @param #number PatrolOutOfFuelOrbitTime The amount of seconds the out of fuel AIControllable will orbit before returning to the base. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ManageFuel( PatrolFuelTresholdPercentage, PatrolOutOfFuelOrbitTime ) + + self.PatrolManageFuel = true + self.PatrolFuelTresholdPercentage = PatrolFuelTresholdPercentage + self.PatrolOutOfFuelOrbitTime = PatrolOutOfFuelOrbitTime + + return self +end + +--- When the AI is damaged beyond a certain treshold, it is required that the AI returns to the home base. +-- However, damage cannot be foreseen early on. +-- Therefore, when the damage treshold is reached, +-- the AI will return immediately to the home base (RTB). +-- Note that for groups, the average damage of the complete group will be calculated. +-- So, in a group of 4 airplanes, 2 lost and 2 with damage 0.2, the damage treshold will be 0.25. +-- @param #AI_PATROL_ZONE self +-- @param #number PatrolDamageTreshold The treshold in percentage (between 0 and 1) when the AI is considered to be damaged. +-- @return #AI_PATROL_ZONE self +function AI_PATROL_ZONE:ManageDamage( PatrolDamageTreshold ) + + self.PatrolManageDamage = true + self.PatrolDamageTreshold = PatrolDamageTreshold + + return self +end + +--- Defines a new patrol route using the @{Process_PatrolZone} parameters and settings. +-- @param #AI_PATROL_ZONE self +-- @return #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_PATROL_ZONE:onafterStart( Controllable, From, Event, To ) + self:F2() + + self:__Route( 1 ) -- Route to the patrol point. The asynchronous trigger is important, because a spawned group and units takes at least one second to come live. + self:__Status( 60 ) -- Check status status every 30 seconds. + self:SetDetectionActivated() + + self:HandleEvent( EVENTS.PilotDead, self.OnPilotDead ) + self:HandleEvent( EVENTS.Crash, self.OnCrash ) + self:HandleEvent( EVENTS.Ejection, self.OnEjection ) + + Controllable:OptionROEHoldFire() + Controllable:OptionROTVertical() + + self.Controllable:OnReSpawn( + function( PatrolGroup ) + self:E( "ReSpawn" ) + self:__Reset( 1 ) + self:__Route( 5 ) + end + ) + + self:SetDetectionOn() + +end + + +--- @param #AI_PATROL_ZONE self +--- @param Wrapper.Controllable#CONTROLLABLE Controllable +function AI_PATROL_ZONE:onbeforeDetect( Controllable, From, Event, To ) + + return self.DetectOn and self.DetectActivated +end + +--- @param #AI_PATROL_ZONE self +--- @param Wrapper.Controllable#CONTROLLABLE Controllable +function AI_PATROL_ZONE:onafterDetect( Controllable, From, Event, To ) + + local Detected = false + + local DetectedTargets = Controllable:GetDetectedTargets() + for TargetID, Target in pairs( DetectedTargets or {} ) do + local TargetObject = Target.object + + if TargetObject and TargetObject:isExist() and TargetObject.id_ < 50000000 then + + local TargetUnit = UNIT:Find( TargetObject ) + local TargetUnitName = TargetUnit:GetName() + + if self.DetectionZone then + if TargetUnit:IsInZone( self.DetectionZone ) then + self:T( {"Detected ", TargetUnit } ) + if self.DetectedUnits[TargetUnit] == nil then + self.DetectedUnits[TargetUnit] = true + end + Detected = true + end + else + if self.DetectedUnits[TargetUnit] == nil then + self.DetectedUnits[TargetUnit] = true + end + Detected = true + end + end + end + + self:__Detect( -self.DetectInterval ) + + if Detected == true then + self:__Detected( 1.5 ) + end + +end + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +-- This statis method is called from the route path within the last task at the last waaypoint of the Controllable. +-- Note that this method is required, as triggers the next route when patrolling for the Controllable. +function AI_PATROL_ZONE:_NewPatrolRoute( AIControllable ) + + local PatrolZone = AIControllable:GetState( AIControllable, "PatrolZone" ) -- PatrolCore.Zone#AI_PATROL_ZONE + PatrolZone:__Route( 1 ) +end + + +--- Defines a new patrol route using the @{Process_PatrolZone} parameters and settings. +-- @param #AI_PATROL_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_PATROL_ZONE:onafterRoute( Controllable, From, Event, To ) + + self:F2() + + -- When RTB, don't allow anymore the routing. + if From == "RTB" then + return + end + + + if self.Controllable:IsAlive() then + -- Determine if the AIControllable is within the PatrolZone. + -- If not, make a waypoint within the to that the AIControllable will fly at maximum speed to that point. + + local PatrolRoute = {} + + -- Calculate the current route point of the controllable as the start point of the route. + -- However, when the controllable is not in the air, + -- the controllable current waypoint is probably the airbase... + -- Thus, if we would take the current waypoint as the startpoint, upon take-off, the controllable flies + -- immediately back to the airbase, and this is not correct. + -- Therefore, when on a runway, get as the current route point a random point within the PatrolZone. + -- This will make the plane fly immediately to the patrol zone. + + if self.Controllable:InAir() == false then + self:E( "Not in the air, finding route path within PatrolZone" ) + local CurrentVec2 = self.Controllable:GetVec2() + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TakeOffParking, + POINT_VEC3.RoutePointAction.FromParkingArea, + ToPatrolZoneSpeed, + true + ) + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + else + self:E( "In the air, finding route path within PatrolZone" ) + local CurrentVec2 = self.Controllable:GetVec2() + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToPatrolZoneSpeed, + true + ) + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + end + + + --- Define a random point in the @{Zone}. The AI will fly to that point within the zone. + + --- Find a random 2D point in PatrolZone. + local ToTargetVec2 = self.PatrolZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Define Speed and Altitude. + local ToTargetAltitude = math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ) + local ToTargetSpeed = math.random( self.PatrolMinSpeed, self.PatrolMaxSpeed ) + self:T2( { self.PatrolMinSpeed, self.PatrolMaxSpeed, ToTargetSpeed } ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, ToTargetAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToTargetRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToTargetSpeed, + true + ) + + --self.CoordTest:SpawnFromVec3( ToTargetPointVec3:GetVec3() ) + + --ToTargetPointVec3:SmokeRed() + + PatrolRoute[#PatrolRoute+1] = ToTargetRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( PatrolRoute ) + + --- Do a trick, link the NewPatrolRoute function of the PATROLGROUP object to the AIControllable in a temporary variable ... + self.Controllable:SetState( self.Controllable, "PatrolZone", self ) + self.Controllable:WayPointFunction( #PatrolRoute, 1, "AI_PATROL_ZONE:_NewPatrolRoute" ) + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 2 ) + end + +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onbeforeStatus() + + return self.CheckStatus +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterStatus() + self:F2() + + if self.Controllable and self.Controllable:IsAlive() then + + local RTB = false + + local Fuel = self.Controllable:GetUnit(1):GetFuel() + if Fuel < self.PatrolFuelTresholdPercentage then + self:E( self.Controllable:GetName() .. " is out of fuel:" .. Fuel .. ", RTB!" ) + local OldAIControllable = self.Controllable + local AIControllableTemplate = self.Controllable:GetTemplate() + + local OrbitTask = OldAIControllable:TaskOrbitCircle( math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ), self.PatrolMinSpeed ) + local TimedOrbitTask = OldAIControllable:TaskControlled( OrbitTask, OldAIControllable:TaskCondition(nil,nil,nil,nil,self.PatrolOutOfFuelOrbitTime,nil ) ) + OldAIControllable:SetTask( TimedOrbitTask, 10 ) + + RTB = true + else + end + + -- TODO: Check GROUP damage function. + local Damage = self.Controllable:GetLife() + if Damage <= self.PatrolDamageTreshold then + self:E( self.Controllable:GetName() .. " is damaged:" .. Damage .. ", RTB!" ) + RTB = true + end + + if RTB == true then + self:RTB() + else + self:__Status( 60 ) -- Execute the Patrol event after 30 seconds. + end + end +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterRTB() + self:F2() + + if self.Controllable and self.Controllable:IsAlive() then + + self:SetDetectionOff() + self.CheckStatus = false + + local PatrolRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToPatrolZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToPatrolZoneSpeed, + true + ) + + PatrolRoute[#PatrolRoute+1] = CurrentRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( PatrolRoute ) + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 1 ) + + end + +end + +--- @param #AI_PATROL_ZONE self +function AI_PATROL_ZONE:onafterDead() + self:SetDetectionOff() + self:SetStatusOff() +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnCrash( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:E( self.Controllable:GetUnits() ) + if #self.Controllable:GetUnits() == 1 then + self:__Crash( 1, EventData ) + end + end +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnEjection( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:__Eject( 1, EventData ) + end +end + +--- @param #AI_PATROL_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_PATROL_ZONE:OnPilotDead( EventData ) + + if self.Controllable:IsAlive() and EventData.IniDCSGroupName == self.Controllable:GetName() then + self:__PilotDead( 1, EventData ) + end +end +--- **AI** -- **Provide Close Air Support to friendly ground troops.** +-- +-- ![Banner Image](..\Presentations\AI_CAS\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_CAS_ZONE} class, extends @{AI_Patrol#AI_PATROL_ZONE} +-- +-- @{#AI_CAS_ZONE} derives from the @{AI_Patrol#AI_PATROL_ZONE}, inheriting its methods and behaviour. +-- +-- The @{#AI_CAS_ZONE} class implements the core functions to provide Close Air Support in an Engage @{Zone} by an AIR @{Controllable} or @{Group}. +-- The AI_CAS_ZONE runs a process. It holds an AI in a Patrol Zone and when the AI is commanded to engage, it will fly to an Engage Zone. +-- +-- ![HoldAndEngage](..\Presentations\AI_CAS\Dia3.JPG) +-- +-- The AI_CAS_ZONE is assigned a @{Group} and this must be done before the AI_CAS_ZONE process can be started through the **Start** event. +-- +-- ![Start Event](..\Presentations\AI_CAS\Dia4.JPG) +-- +-- Upon started, The AI will **Route** itself towards the random 3D point within a patrol zone, +-- using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- This cycle will continue until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- +-- ![Route Event](..\Presentations\AI_CAS\Dia5.JPG) +-- +-- When the AI is commanded to provide Close Air Support (through the event **Engage**), the AI will fly towards the Engage Zone. +-- Any target that is detected in the Engage Zone will be reported and will be destroyed by the AI. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia6.JPG) +-- +-- The AI will detect the targets and will only destroy the targets within the Engage Zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia7.JPG) +-- +-- Every target that is destroyed, is reported< by the AI. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia8.JPG) +-- +-- Note that the AI does not know when the Engage Zone is cleared, and therefore will keep circling in the zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia9.JPG) +-- +-- Until it is notified through the event **Accomplish**, which is to be triggered by an observing party: +-- +-- * a FAC +-- * a timed event +-- * a menu option selected by a human +-- * a condition +-- * others ... +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia10.JPG) +-- +-- When the AI has accomplished the CAS, it will fly back to the Patrol Zone. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia11.JPG) +-- +-- It will keep patrolling there, until it is notified to RTB or move to another CAS Zone. +-- It can be notified to go RTB through the **RTB** event. +-- +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Engage Event](..\Presentations\AI_CAS\Dia12.JPG) +-- +-- # 1.1) AI_CAS_ZONE constructor +-- +-- * @{#AI_CAS_ZONE.New}(): Creates a new AI_CAS_ZONE object. +-- +-- ## 1.2) AI_CAS_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_CAS\Dia2.JPG) +-- +-- ### 1.2.1) AI_CAS_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Engaging** ( Group ): The AI is engaging the targets in the Engage Zone, executing CAS. +-- * **Returning** ( Group ): The AI is returning to Base.. +-- +-- ### 1.2.2) AI_CAS_ZONE Events +-- +-- * **@{AI_Patrol#AI_PATROL_ZONE.Start}**: Start the process. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Route}**: Route the AI to a new random 3D point within the Patrol Zone. +-- * **@{#AI_CAS_ZONE.Engage}**: Engage the AI to provide CAS in the Engage Zone, destroying any target it finds. +-- * **@{#AI_CAS_ZONE.Abort}**: Aborts the engagement and return patrolling in the patrol zone. +-- * **@{AI_Patrol#AI_PATROL_ZONE.RTB}**: Route the AI to the home base. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detect}**: The AI is detecting targets. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detected}**: The AI has detected new targets. +-- * **@{#AI_CAS_ZONE.Destroy}**: The AI has destroyed a target @{Unit}. +-- * **@{#AI_CAS_ZONE.Destroyed}**: The AI has destroyed all target @{Unit}s assigned in the CAS task. +-- * **Status**: The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-15: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Quax](https://forums.eagle.ru/member.php?u=90530)**: Concept, Advice & Testing. +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Concept, Advice & Testing. +-- * **[Gunterlund](http://forums.eagle.ru:8080/member.php?u=75036)**: Test case revision. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module AI_Cas + + +--- AI_CAS_ZONE class +-- @type AI_CAS_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE TargetZone The @{Zone} where the patrol needs to be executed. +-- @extends AI.AI_Patrol#AI_PATROL_ZONE +AI_CAS_ZONE = { + ClassName = "AI_CAS_ZONE", +} + + + +--- Creates a new AI_CAS_ZONE object +-- @param #AI_CAS_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Core.Zone#ZONE_BASE EngageZone The zone where the engage will happen. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_CAS_ZONE self +function AI_CAS_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageZone, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) ) -- #AI_CAS_ZONE + + self.EngageZone = EngageZone + self.Accomplished = false + + self:SetDetectionZone( self.EngageZone ) + + self:AddTransition( { "Patrolling", "Engaging" }, "Engage", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Engage. + -- @function [parent=#AI_CAS_ZONE] OnBeforeEngage + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Engage. + -- @function [parent=#AI_CAS_ZONE] OnAfterEngage + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAS_ZONE] Engage + -- @param #AI_CAS_ZONE self + -- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. + -- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. + -- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. + -- If parameter is not defined the unit / controllable will choose expend on its own discretion. + -- Use the structure @{DCSTypes#AI.Task.WeaponExpend} to define the amount of weapons to be release at each attack. + -- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. + -- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. + + --- Asynchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAS_ZONE] __Engage + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + -- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. + -- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. + -- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. + -- If parameter is not defined the unit / controllable will choose expend on its own discretion. + -- Use the structure @{DCSTypes#AI.Task.WeaponExpend} to define the amount of weapons to be release at each attack. + -- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. + -- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. + +--- OnLeave Transition Handler for State Engaging. +-- @function [parent=#AI_CAS_ZONE] OnLeaveEngaging +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Engaging. +-- @function [parent=#AI_CAS_ZONE] OnEnterEngaging +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Engaging", "Target", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + self:AddTransition( "Engaging", "Fired", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Fired. + -- @function [parent=#AI_CAS_ZONE] OnBeforeFired + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fired. + -- @function [parent=#AI_CAS_ZONE] OnAfterFired + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAS_ZONE] Fired + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAS_ZONE] __Fired + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Destroy", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] OnBeforeDestroy + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] OnAfterDestroy + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] Destroy + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAS_ZONE] __Destroy + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Engaging", "Abort", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Abort. + -- @function [parent=#AI_CAS_ZONE] OnBeforeAbort + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Abort. + -- @function [parent=#AI_CAS_ZONE] OnAfterAbort + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAS_ZONE] Abort + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAS_ZONE] __Abort + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Engaging", "Accomplish", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAS_ZONE. + + --- OnBefore Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] OnBeforeAccomplish + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] OnAfterAccomplish + -- @param #AI_CAS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] Accomplish + -- @param #AI_CAS_ZONE self + + --- Asynchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAS_ZONE] __Accomplish + -- @param #AI_CAS_ZONE self + -- @param #number Delay The delay in seconds. + + return self +end + + +--- Set the Engage Zone where the AI is performing CAS. Note that if the EngageZone is changed, the AI needs to re-detect targets. +-- @param #AI_CAS_ZONE self +-- @param Core.Zone#ZONE EngageZone The zone where the AI is performing CAS. +-- @return #AI_CAS_ZONE self +function AI_CAS_ZONE:SetEngageZone( EngageZone ) + self:F2() + + if EngageZone then + self.EngageZone = EngageZone + else + self.EngageZone = nil + end +end + + + +--- onafter State Transition for Event Start. +-- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterStart( Controllable, From, Event, To ) + + -- Call the parent Start event handler + self:GetParent(self).onafterStart( self, Controllable, From, Event, To ) + self:HandleEvent( EVENTS.Dead ) + + self:SetDetectionDeactivated() -- When not engaging, set the detection off. +end + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +function _NewEngageRoute( AIControllable ) + + AIControllable:T( "NewEngageRoute" ) + local EngageZone = AIControllable:GetState( AIControllable, "EngageZone" ) -- AI.AI_Cas#AI_CAS_ZONE + EngageZone:__Engage( 1, EngageZone.EngageSpeed, EngageZone.EngageAltitude, EngageZone.EngageWeaponExpend, EngageZone.EngageAttackQty, EngageZone.EngageDirection ) +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onbeforeEngage( Controllable, From, Event, To ) + + if self.Accomplished == true then + return false + end +end + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterTarget( Controllable, From, Event, To ) + self:E("onafterTarget") + + if Controllable:IsAlive() then + + local AttackTasks = {} + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + if DetectedUnit:IsAlive() then + if DetectedUnit:IsInZone( self.EngageZone ) then + if Detected == true then + self:E( {"Target: ", DetectedUnit } ) + self.DetectedUnits[DetectedUnit] = false + local AttackTask = Controllable:TaskAttackUnit( DetectedUnit, false, self.EngageWeaponExpend, self.EngageAttackQty, self.EngageDirection, self.EngageAltitude, nil ) + self.Controllable:PushTask( AttackTask, 1 ) + end + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + self:__Target( -10 ) + + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterAbort( Controllable, From, Event, To ) + Controllable:ClearTasks() + self:__Route( 1 ) +end + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param #number EngageSpeed (optional) The speed the Group will hold when engaging to the target zone. +-- @param Dcs.DCSTypes#Distance EngageAltitude (optional) Desired altitude to perform the unit engagement. +-- @param Dcs.DCSTypes#AI.Task.WeaponExpend EngageWeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / controllable will choose expend on its own discretion. +-- @param #number EngageAttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/controllable will not make more attack than allowed even if the target controllable not destroyed and the aicraft/controllable still have ammo. If not defined the aircraft/controllable will attack target until it will be destroyed or until the aircraft/controllable will run out of ammo. +-- @param Dcs.DCSTypes#Azimuth EngageDirection (optional) Desired ingress direction from the target to the attacking aircraft. Controllable/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain controllable/aircraft will choose another direction. +function AI_CAS_ZONE:onafterEngage( Controllable, From, Event, To, + EngageSpeed, + EngageAltitude, + EngageWeaponExpend, + EngageAttackQty, + EngageDirection ) + self:F("onafterEngage") + + self.EngageSpeed = EngageSpeed or 400 + self.EngageAltitude = EngageAltitude or 2000 + self.EngageWeaponExpend = EngageWeaponExpend + self.EngageAttackQty = EngageAttackQty + self.EngageDirection = EngageDirection + + if Controllable:IsAlive() then + + local EngageRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToEngageZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + self.EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = CurrentRoutePoint + + local AttackTasks = {} + + for DetectedUnitID, DetectedUnit in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( DetectedUnit ) + if DetectedUnit:IsAlive() then + if DetectedUnit:IsInZone( self.EngageZone ) then + self:E( {"Engaging ", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit, + true, + EngageWeaponExpend, + EngageAttackQty, + EngageDirection + ) + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + EngageRoute[1].task = Controllable:TaskCombo( AttackTasks ) + + --- Define a random point in the @{Zone}. The AI will fly to that point within the zone. + + --- Find a random 2D point in EngageZone. + local ToTargetVec2 = self.EngageZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, self.EngageAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToTargetRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + self.EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = ToTargetRoutePoint + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + Controllable:WayPointInitialize( EngageRoute ) + + --- Do a trick, link the NewEngageRoute function of the object to the AIControllable in a temporary variable ... + Controllable:SetState( Controllable, "EngageZone", self ) + + Controllable:WayPointFunction( #EngageRoute, 1, "_NewEngageRoute" ) + + --- NOW ROUTE THE GROUP! + Controllable:WayPointExecute( 1 ) + + Controllable:OptionROEOpenFire() + Controllable:OptionROTVertical() + + self:SetDetectionInterval( 2 ) + self:SetDetectionActivated() + self:__Target( -2 ) -- Start Targetting + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAS_ZONE:onafterAccomplish( Controllable, From, Event, To ) + self.Accomplished = true + self:SetDetectionDeactivated() +end + + +--- @param #AI_CAS_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param Core.Event#EVENTDATA EventData +function AI_CAS_ZONE:onafterDestroy( Controllable, From, Event, To, EventData ) + + if EventData.IniUnit then + self.DetectedUnits[EventData.IniUnit] = nil + end +end + + +--- @param #AI_CAS_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_CAS_ZONE:OnEventDead( EventData ) + self:F( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit] then + self:__Destroy( 1, EventData ) + end + end +end + + +--- **AI** - **Execute Combat Air Patrol (CAP).** +-- +-- ![Banner Image](..\Presentations\AI_CAP\Dia1.JPG) +-- +-- === +-- +-- # 1) @{#AI_CAP_ZONE} class, extends @{AI_CAP#AI_PATROL_ZONE} +-- +-- The @{#AI_CAP_ZONE} class implements the core functions to patrol a @{Zone} by an AI @{Controllable} or @{Group} +-- and automatically engage any airborne enemies that are within a certain range or within a certain zone. +-- +-- ![Process](..\Presentations\AI_CAP\Dia3.JPG) +-- +-- The AI_CAP_ZONE is assigned a @{Group} and this must be done before the AI_CAP_ZONE process can be started using the **Start** event. +-- +-- ![Process](..\Presentations\AI_CAP\Dia4.JPG) +-- +-- The AI will fly towards the random 3D point within the patrol zone, using a random speed within the given altitude and speed limits. +-- Upon arrival at the 3D point, a new random 3D point will be selected within the patrol zone using the given limits. +-- +-- ![Process](..\Presentations\AI_CAP\Dia5.JPG) +-- +-- This cycle will continue. +-- +-- ![Process](..\Presentations\AI_CAP\Dia6.JPG) +-- +-- During the patrol, the AI will detect enemy targets, which are reported through the **Detected** event. +-- +-- ![Process](..\Presentations\AI_CAP\Dia9.JPG) +-- +-- When enemies are detected, the AI will automatically engage the enemy. +-- +-- ![Process](..\Presentations\AI_CAP\Dia10.JPG) +-- +-- Until a fuel or damage treshold has been reached by the AI, or when the AI is commanded to RTB. +-- When the fuel treshold has been reached, the airplane will fly towards the nearest friendly airbase and will land. +-- +-- ![Process](..\Presentations\AI_CAP\Dia13.JPG) +-- +-- ## 1.1) AI_CAP_ZONE constructor +-- +-- * @{#AI_CAP_ZONE.New}(): Creates a new AI_CAP_ZONE object. +-- +-- ## 1.2) AI_CAP_ZONE is a FSM +-- +-- ![Process](..\Presentations\AI_CAP\Dia2.JPG) +-- +-- ### 1.2.1) AI_CAP_ZONE States +-- +-- * **None** ( Group ): The process is not started yet. +-- * **Patrolling** ( Group ): The AI is patrolling the Patrol Zone. +-- * **Engaging** ( Group ): The AI is engaging the bogeys. +-- * **Returning** ( Group ): The AI is returning to Base.. +-- +-- ### 1.2.2) AI_CAP_ZONE Events +-- +-- * **@{AI_Patrol#AI_PATROL_ZONE.Start}**: Start the process. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Route}**: Route the AI to a new random 3D point within the Patrol Zone. +-- * **@{#AI_CAP_ZONE.Engage}**: Let the AI engage the bogeys. +-- * **@{#AI_CAP_ZONE.Abort}**: Aborts the engagement and return patrolling in the patrol zone. +-- * **@{AI_Patrol#AI_PATROL_ZONE.RTB}**: Route the AI to the home base. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detect}**: The AI is detecting targets. +-- * **@{AI_Patrol#AI_PATROL_ZONE.Detected}**: The AI has detected new targets. +-- * **@{#AI_CAP_ZONE.Destroy}**: The AI has destroyed a bogey @{Unit}. +-- * **@{#AI_CAP_ZONE.Destroyed}**: The AI has destroyed all bogeys @{Unit}s assigned in the CAS task. +-- * **Status** ( Group ): The AI is checking status (fuel and damage). When the tresholds have been reached, the AI will RTB. +-- +-- ## 1.3) Set the Range of Engagement +-- +-- ![Range](..\Presentations\AI_CAP\Dia11.JPG) +-- +-- An optional range can be set in meters, +-- that will define when the AI will engage with the detected airborne enemy targets. +-- The range can be beyond or smaller than the range of the Patrol Zone. +-- The range is applied at the position of the AI. +-- Use the method @{AI_CAP#AI_CAP_ZONE.SetEngageRange}() to define that range. +-- +-- ## 1.4) Set the Zone of Engagement +-- +-- ![Zone](..\Presentations\AI_CAP\Dia12.JPG) +-- +-- An optional @{Zone} can be set, +-- that will define when the AI will engage with the detected airborne enemy targets. +-- Use the method @{AI_Cap#AI_CAP_ZONE.SetEngageZone}() to define that Zone. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-01-15: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[Quax](https://forums.eagle.ru/member.php?u=90530)**: Concept, Advice & Testing. +-- * **[Pikey](https://forums.eagle.ru/member.php?u=62835)**: Concept, Advice & Testing. +-- * **[Gunterlund](http://forums.eagle.ru:8080/member.php?u=75036)**: Test case revision. +-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing. +-- * **[Delta99](https://forums.eagle.ru/member.php?u=125166): Testing. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module AI_Cap + + +--- AI_CAP_ZONE class +-- @type AI_CAP_ZONE +-- @field Wrapper.Controllable#CONTROLLABLE AIControllable The @{Controllable} patrolling. +-- @field Core.Zone#ZONE_BASE TargetZone The @{Zone} where the patrol needs to be executed. +-- @extends AI.AI_Patrol#AI_PATROL_ZONE +AI_CAP_ZONE = { + ClassName = "AI_CAP_ZONE", +} + + + +--- Creates a new AI_CAP_ZONE object +-- @param #AI_CAP_ZONE self +-- @param Core.Zone#ZONE_BASE PatrolZone The @{Zone} where the patrol needs to be executed. +-- @param Dcs.DCSTypes#Altitude PatrolFloorAltitude The lowest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Altitude PatrolCeilingAltitude The highest altitude in meters where to execute the patrol. +-- @param Dcs.DCSTypes#Speed PatrolMinSpeed The minimum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#Speed PatrolMaxSpeed The maximum speed of the @{Controllable} in km/h. +-- @param Dcs.DCSTypes#AltitudeType PatrolAltType The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AI_PATROL_ZONE:New( PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType ) ) -- #AI_CAP_ZONE + + self.Accomplished = false + self.Engaging = false + + self:AddTransition( { "Patrolling", "Engaging" }, "Engage", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Engage. + -- @function [parent=#AI_CAP_ZONE] OnBeforeEngage + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Engage. + -- @function [parent=#AI_CAP_ZONE] OnAfterEngage + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAP_ZONE] Engage + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Engage. + -- @function [parent=#AI_CAP_ZONE] __Engage + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Engaging. +-- @function [parent=#AI_CAP_ZONE] OnLeaveEngaging +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Engaging. +-- @function [parent=#AI_CAP_ZONE] OnEnterEngaging +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + + self:AddTransition( "Engaging", "Fired", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Fired. + -- @function [parent=#AI_CAP_ZONE] OnBeforeFired + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fired. + -- @function [parent=#AI_CAP_ZONE] OnAfterFired + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAP_ZONE] Fired + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Fired. + -- @function [parent=#AI_CAP_ZONE] __Fired + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Destroy", "*" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] OnBeforeDestroy + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] OnAfterDestroy + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] Destroy + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Destroy. + -- @function [parent=#AI_CAP_ZONE] __Destroy + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + + self:AddTransition( "Engaging", "Abort", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Abort. + -- @function [parent=#AI_CAP_ZONE] OnBeforeAbort + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Abort. + -- @function [parent=#AI_CAP_ZONE] OnAfterAbort + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAP_ZONE] Abort + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Abort. + -- @function [parent=#AI_CAP_ZONE] __Abort + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Engaging", "Accomplish", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_CAP_ZONE. + + --- OnBefore Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] OnBeforeAccomplish + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] OnAfterAccomplish + -- @param #AI_CAP_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] Accomplish + -- @param #AI_CAP_ZONE self + + --- Asynchronous Event Trigger for Event Accomplish. + -- @function [parent=#AI_CAP_ZONE] __Accomplish + -- @param #AI_CAP_ZONE self + -- @param #number Delay The delay in seconds. + + return self +end + + +--- Set the Engage Zone which defines where the AI will engage bogies. +-- @param #AI_CAP_ZONE self +-- @param Core.Zone#ZONE EngageZone The zone where the AI is performing CAP. +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:SetEngageZone( EngageZone ) + self:F2() + + if EngageZone then + self.EngageZone = EngageZone + else + self.EngageZone = nil + end +end + +--- Set the Engage Range when the AI will engage with airborne enemies. +-- @param #AI_CAP_ZONE self +-- @param #number EngageRange The Engage Range. +-- @return #AI_CAP_ZONE self +function AI_CAP_ZONE:SetEngageRange( EngageRange ) + self:F2() + + if EngageRange then + self.EngageRange = EngageRange + else + self.EngageRange = nil + end +end + +--- onafter State Transition for Event Start. +-- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterStart( Controllable, From, Event, To ) + + -- Call the parent Start event handler + self:GetParent(self).onafterStart( self, Controllable, From, Event, To ) + self:HandleEvent( EVENTS.Dead ) + +end + +-- todo: need to fix this global function + +--- @param Wrapper.Controllable#CONTROLLABLE AIControllable +function _NewEngageCapRoute( AIControllable ) + + AIControllable:T( "NewEngageRoute" ) + local EngageZone = AIControllable:GetState( AIControllable, "EngageZone" ) -- AI.AI_Cap#AI_CAP_ZONE + EngageZone:__Engage( 1 ) +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onbeforeEngage( Controllable, From, Event, To ) + + if self.Accomplished == true then + return false + end +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterDetected( Controllable, From, Event, To ) + + if From ~= "Engaging" then + + local Engage = false + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( DetectedUnit ) + if DetectedUnit:IsAlive() and DetectedUnit:IsAir() then + Engage = true + break + end + end + + if Engage == true then + self:E( 'Detected -> Engaging' ) + self:__Engage( 1 ) + end + end +end + + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterAbort( Controllable, From, Event, To ) + Controllable:ClearTasks() + self:__Route( 1 ) +end + + + + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterEngage( Controllable, From, Event, To ) + + if Controllable:IsAlive() then + + local EngageRoute = {} + + --- Calculate the current route point. + local CurrentVec2 = self.Controllable:GetVec2() + + --TODO: Create GetAltitude function for GROUP, and delete GetUnit(1). + local CurrentAltitude = self.Controllable:GetUnit(1):GetAltitude() + local CurrentPointVec3 = POINT_VEC3:New( CurrentVec2.x, CurrentAltitude, CurrentVec2.y ) + local ToEngageZoneSpeed = self.PatrolMaxSpeed + local CurrentRoutePoint = CurrentPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToEngageZoneSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = CurrentRoutePoint + + + --- Find a random 2D point in PatrolZone. + local ToTargetVec2 = self.PatrolZone:GetRandomVec2() + self:T2( ToTargetVec2 ) + + --- Define Speed and Altitude. + local ToTargetAltitude = math.random( self.EngageFloorAltitude, self.EngageCeilingAltitude ) + local ToTargetSpeed = math.random( self.PatrolMinSpeed, self.PatrolMaxSpeed ) + self:T2( { self.PatrolMinSpeed, self.PatrolMaxSpeed, ToTargetSpeed } ) + + --- Obtain a 3D @{Point} from the 2D point + altitude. + local ToTargetPointVec3 = POINT_VEC3:New( ToTargetVec2.x, ToTargetAltitude, ToTargetVec2.y ) + + --- Create a route point of type air. + local ToPatrolRoutePoint = ToTargetPointVec3:RoutePointAir( + self.PatrolAltType, + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + ToTargetSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = ToPatrolRoutePoint + + Controllable:OptionROEOpenFire() + Controllable:OptionROTPassiveDefense() + + local AttackTasks = {} + + for DetectedUnit, Detected in pairs( self.DetectedUnits ) do + local DetectedUnit = DetectedUnit -- Wrapper.Unit#UNIT + self:T( { DetectedUnit, DetectedUnit:IsAlive(), DetectedUnit:IsAir() } ) + if DetectedUnit:IsAlive() and DetectedUnit:IsAir() then + if self.EngageZone then + if DetectedUnit:IsInZone( self.EngageZone ) then + self:E( {"Within Zone and Engaging ", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + else + if self.EngageRange then + if DetectedUnit:GetPointVec3():Get2DDistance(Controllable:GetPointVec3() ) <= self.EngageRange then + self:E( {"Within Range and Engaging", DetectedUnit } ) + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + else + AttackTasks[#AttackTasks+1] = Controllable:TaskAttackUnit( DetectedUnit ) + end + end + else + self.DetectedUnits[DetectedUnit] = nil + end + end + + --- Now we're going to do something special, we're going to call a function from a waypoint action at the AIControllable... + self.Controllable:WayPointInitialize( EngageRoute ) + + + if #AttackTasks == 0 then + self:E("No targets found -> Going back to Patrolling") + self:__Abort( 1 ) + self:__Route( 1 ) + self:SetDetectionActivated() + else + EngageRoute[1].task = Controllable:TaskCombo( AttackTasks ) + + --- Do a trick, link the NewEngageRoute function of the object to the AIControllable in a temporary variable ... + self.Controllable:SetState( self.Controllable, "EngageZone", self ) + + self.Controllable:WayPointFunction( #EngageRoute, 1, "_NewEngageCapRoute" ) + + self:SetDetectionDeactivated() + end + + --- NOW ROUTE THE GROUP! + self.Controllable:WayPointExecute( 1, 2 ) + + end +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_CAP_ZONE:onafterAccomplish( Controllable, From, Event, To ) + self.Accomplished = true + self:SetDetectionOff() +end + +--- @param #AI_CAP_ZONE self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable The Controllable Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @param Core.Event#EVENTDATA EventData +function AI_CAP_ZONE:onafterDestroy( Controllable, From, Event, To, EventData ) + + if EventData.IniUnit then + self.DetectedUnits[EventData.IniUnit] = nil + end +end + +--- @param #AI_CAP_ZONE self +-- @param Core.Event#EVENTDATA EventData +function AI_CAP_ZONE:OnEventDead( EventData ) + self:F( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit] then + self:__Destroy( 1, EventData ) + end + end +end +---Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Ground** -- +-- **Management of logical cargo objects, that can be transported from and to transportation carriers.** +-- +-- ![Banner Image](..\Presentations\AI_CARGO\CARGO.JPG) +-- +-- === +-- +-- Cargo can be of various forms, always are composed out of ONE object ( one unit or one static or one slingload crate ): +-- +-- * AI_CARGO_UNIT, represented by a @{Unit} in a @{Group}: Cargo can be represented by a Unit in a Group. Destruction of the Unit will mean that the cargo is lost. +-- * CARGO_STATIC, represented by a @{Static}: Cargo can be represented by a Static. Destruction of the Static will mean that the cargo is lost. +-- * AI_CARGO_PACKAGE, contained in a @{Unit} of a @{Group}: Cargo can be contained within a Unit of a Group. The cargo can be **delivered** by the @{Unit}. If the Unit is destroyed, the cargo will be destroyed also. +-- * AI_CARGO_PACKAGE, Contained in a @{Static}: Cargo can be contained within a Static. The cargo can be **collected** from the @Static. If the @{Static} is destroyed, the cargo will be destroyed. +-- * CARGO_SLINGLOAD, represented by a @{Cargo} that is transportable: Cargo can be represented by a Cargo object that is transportable. Destruction of the Cargo will mean that the cargo is lost. +-- +-- * AI_CARGO_GROUPED, represented by a Group of CARGO_UNITs. +-- +-- # 1) @{#AI_CARGO} class, extends @{Fsm#FSM_PROCESS} +-- +-- The @{#AI_CARGO} class defines the core functions that defines a cargo object within MOOSE. +-- A cargo is a logical object defined that is available for transport, and has a life status within a simulation. +-- +-- The AI_CARGO is a state machine: it manages the different events and states of the cargo. +-- All derived classes from AI_CARGO follow the same state machine, expose the same cargo event functions, and provide the same cargo states. +-- +-- ## 1.2.1) AI_CARGO Events: +-- +-- * @{#AI_CARGO.Board}( ToCarrier ): Boards the cargo to a carrier. +-- * @{#AI_CARGO.Load}( ToCarrier ): Loads the cargo into a carrier, regardless of its position. +-- * @{#AI_CARGO.UnBoard}( ToPointVec2 ): UnBoard the cargo from a carrier. This will trigger a movement of the cargo to the option ToPointVec2. +-- * @{#AI_CARGO.UnLoad}( ToPointVec2 ): UnLoads the cargo from a carrier. +-- * @{#AI_CARGO.Dead}( Controllable ): The cargo is dead. The cargo process will be ended. +-- +-- ## 1.2.2) AI_CARGO States: +-- +-- * **UnLoaded**: The cargo is unloaded from a carrier. +-- * **Boarding**: The cargo is currently boarding (= running) into a carrier. +-- * **Loaded**: The cargo is loaded into a carrier. +-- * **UnBoarding**: The cargo is currently unboarding (=running) from a carrier. +-- * **Dead**: The cargo is dead ... +-- * **End**: The process has come to an end. +-- +-- ## 1.2.3) AI_CARGO state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Leaving** the state. +-- The state transition method needs to start with the name **OnLeave + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **Entering** the state. +-- The state transition method needs to start with the name **OnEnter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- # 2) #AI_CARGO_UNIT class +-- +-- The AI_CARGO_UNIT class defines a cargo that is represented by a UNIT object within the simulator, and can be transported by a carrier. +-- Use the event functions as described above to Load, UnLoad, Board, UnBoard the AI_CARGO_UNIT objects to and from carriers. +-- +-- # 5) #AI_CARGO_GROUPED class +-- +-- The AI_CARGO_GROUPED class defines a cargo that is represented by a group of UNIT objects within the simulator, and can be transported by a carrier. +-- Use the event functions as described above to Load, UnLoad, Board, UnBoard the AI_CARGO_UNIT objects to and from carriers. +-- +-- This module is still under construction, but is described above works already, and will keep working ... +-- +-- @module Cargo + +-- Events + +-- Board + +--- Boards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo to the Carrier. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] Board +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + +--- Boards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo to the Carrier. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] __Board +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + + +-- UnBoard + +--- UnBoards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo from the Carrier. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] UnBoard +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo should run after onboarding. If not provided, the cargo will run to 60 meters behind the Carrier location. + +--- UnBoards the cargo to a Carrier. The event will create a movement (= running or driving) of the cargo from the Carrier. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] __UnBoard +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo should run after onboarding. If not provided, the cargo will run to 60 meters behind the Carrier location. + + +-- Load + +--- Loads the cargo to a Carrier. The event will load the cargo into the Carrier regardless of its position. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] Load +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + +--- Loads the cargo to a Carrier. The event will load the cargo into the Carrier regardless of its position. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **UnLoaded** state. +-- @function [parent=#AI_CARGO] __Load +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Wrapper.Controllable#CONTROLLABLE ToCarrier The Carrier that will hold the cargo. + + +-- UnLoad + +--- UnLoads the cargo to a Carrier. The event will unload the cargo from the Carrier. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] UnLoad +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo will be placed after unloading. If not provided, the cargo will be placed 60 meters behind the Carrier location. + +--- UnLoads the cargo to a Carrier. The event will unload the cargo from the Carrier. There will be no movement simulated of the cargo loading. +-- The cargo must be in the **Loaded** state. +-- @function [parent=#AI_CARGO] __UnLoad +-- @param #AI_CARGO self +-- @param #number DelaySeconds The amount of seconds to delay the action. +-- @param Core.Point#POINT_VEC2 ToPointVec2 (optional) @{Point#POINT_VEC2) to where the cargo will be placed after unloading. If not provided, the cargo will be placed 60 meters behind the Carrier location. + +-- State Transition Functions + +-- UnLoaded + +--- @function [parent=#AI_CARGO] OnLeaveUnLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterUnLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- Loaded + +--- @function [parent=#AI_CARGO] OnLeaveLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterLoaded +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- Boarding + +--- @function [parent=#AI_CARGO] OnLeaveBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + +-- UnBoarding + +--- @function [parent=#AI_CARGO] OnLeaveUnBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable +-- @return #boolean + +--- @function [parent=#AI_CARGO] OnEnterUnBoarding +-- @param #AI_CARGO self +-- @param Wrapper.Controllable#CONTROLLABLE Controllable + + +-- TODO: Find all Carrier objects and make the type of the Carriers Wrapper.Unit#UNIT in the documentation. + +CARGOS = {} + +do -- AI_CARGO + + --- @type AI_CARGO + -- @extends Core.Fsm#FSM_PROCESS + -- @field #string Type A string defining the type of the cargo. eg. Engineers, Equipment, Screwdrivers. + -- @field #string Name A string defining the name of the cargo. The name is the unique identifier of the cargo. + -- @field #number Weight A number defining the weight of the cargo. The weight is expressed in kg. + -- @field #number ReportRadius (optional) A number defining the radius in meters when the cargo is signalling or reporting to a Carrier. + -- @field #number NearRadius (optional) A number defining the radius in meters when the cargo is near to a Carrier, so that it can be loaded. + -- @field Wrapper.Controllable#CONTROLLABLE CargoObject The alive DCS object representing the cargo. This value can be nil, meaning, that the cargo is not represented anywhere... + -- @field Wrapper.Controllable#CONTROLLABLE CargoCarrier The alive DCS object carrying the cargo. This value can be nil, meaning, that the cargo is not contained anywhere... + -- @field #boolean Slingloadable This flag defines if the cargo can be slingloaded. + -- @field #boolean Moveable This flag defines if the cargo is moveable. + -- @field #boolean Representable This flag defines if the cargo can be represented by a DCS Unit. + -- @field #boolean Containable This flag defines if the cargo can be contained within a DCS Unit. + AI_CARGO = { + ClassName = "AI_CARGO", + Type = nil, + Name = nil, + Weight = nil, + CargoObject = nil, + CargoCarrier = nil, + Representable = false, + Slingloadable = false, + Moveable = false, + Containable = false, + } + +--- @type AI_CARGO.CargoObjects +-- @map < #string, Wrapper.Positionable#POSITIONABLE > The alive POSITIONABLE objects representing the the cargo. + + +--- AI_CARGO Constructor. This class is an abstract class and should not be instantiated. +-- @param #AI_CARGO self +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO +function AI_CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) + + local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM_CONTROLLABLE + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:SetStartState( "UnLoaded" ) + self:AddTransition( "UnLoaded", "Board", "Boarding" ) + self:AddTransition( "Boarding", "Boarding", "Boarding" ) + self:AddTransition( "Boarding", "Load", "Loaded" ) + self:AddTransition( "UnLoaded", "Load", "Loaded" ) + self:AddTransition( "Loaded", "UnBoard", "UnBoarding" ) + self:AddTransition( "UnBoarding", "UnBoarding", "UnBoarding" ) + self:AddTransition( "UnBoarding", "UnLoad", "UnLoaded" ) + self:AddTransition( "Loaded", "UnLoad", "UnLoaded" ) + + + self.Type = Type + self.Name = Name + self.Weight = Weight + self.ReportRadius = ReportRadius + self.NearRadius = NearRadius + self.CargoObject = nil + self.CargoCarrier = nil + self.Representable = false + self.Slingloadable = false + self.Moveable = false + self.Containable = false + + + self.CargoScheduler = SCHEDULER:New() + + CARGOS[self.Name] = self + + return self +end + + +--- Template method to spawn a new representation of the AI_CARGO in the simulator. +-- @param #AI_CARGO self +-- @return #AI_CARGO +function AI_CARGO:Spawn( PointVec2 ) + self:F() + +end + + +--- Check if CargoCarrier is near the Cargo to be Loaded. +-- @param #AI_CARGO self +-- @param Core.Point#POINT_VEC2 PointVec2 +-- @return #boolean +function AI_CARGO:IsNear( PointVec2 ) + self:F( { PointVec2 } ) + + local Distance = PointVec2:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) + self:T( Distance ) + + if Distance <= self.NearRadius then + return true + else + return false + end +end + +end + +do -- AI_CARGO_REPRESENTABLE + + --- @type AI_CARGO_REPRESENTABLE + -- @extends #AI_CARGO + AI_CARGO_REPRESENTABLE = { + ClassName = "AI_CARGO_REPRESENTABLE" + } + +--- AI_CARGO_REPRESENTABLE Constructor. +-- @param #AI_CARGO_REPRESENTABLE self +-- @param Wrapper.Controllable#Controllable CargoObject +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_REPRESENTABLE +function AI_CARGO_REPRESENTABLE:New( CargoObject, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + return self +end + +--- Route a cargo unit to a PointVec2. +-- @param #AI_CARGO_REPRESENTABLE self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #number Speed +-- @return #AI_CARGO_REPRESENTABLE +function AI_CARGO_REPRESENTABLE:RouteTo( ToPointVec2, Speed ) + self:F2( ToPointVec2 ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = ToPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 2 ) + return self +end + +end -- AI_CARGO + +do -- AI_CARGO_UNIT + + --- @type AI_CARGO_UNIT + -- @extends #AI_CARGO_REPRESENTABLE + AI_CARGO_UNIT = { + ClassName = "AI_CARGO_UNIT" + } + +--- AI_CARGO_UNIT Constructor. +-- @param #AI_CARGO_UNIT self +-- @param Wrapper.Unit#UNIT CargoUnit +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_UNIT +function AI_CARGO_UNIT:New( CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_REPRESENTABLE:New( CargoUnit, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO_UNIT + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoUnit ) + self.CargoObject = CargoUnit + + self:T( self.ClassName ) + + return self +end + +--- Enter UnBoarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2 ) + self:F() + + local Angle = 180 + local Speed = 10 + local DeployDistance = 5 + local RouteDistance = 60 + + if From == "Loaded" then + + local CargoCarrierPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( DeployDistance, CargoDeployHeading ) + local CargoRoutePointVec2 = CargoCarrierPointVec2:Translate( RouteDistance, CargoDeployHeading ) + + -- if there is no ToPointVec2 given, then use the CargoRoutePointVec2 + ToPointVec2 = ToPointVec2 or CargoRoutePointVec2 + + local FromPointVec2 = CargoCarrierPointVec2 + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) + self.CargoCarrier = nil + + local Points = {} + Points[#Points+1] = FromPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = ToPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 1 ) + + self:__UnBoarding( 1, ToPointVec2 ) + end + end + +end + +--- Leave UnBoarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onleaveUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + if self:IsNear( ToPointVec2 ) then + return true + else + self:__UnBoarding( 1, ToPointVec2 ) + end + return false + end + +end + +--- UnBoard Event. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 ToPointVec2 +function AI_CARGO_UNIT:onafterUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + self.CargoInAir = self.CargoObject:InAir() + + self:T( self.CargoInAir ) + + -- Only unboard the cargo when the carrier 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 + + end + + self:__UnLoad( 1, ToPointVec2 ) + +end + + + +--- Enter UnLoaded State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Point#POINT_VEC2 +function AI_CARGO_UNIT:onenterUnLoaded( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "Loaded" then + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) + + ToPointVec2 = ToPointVec2 or POINT_VEC2:New( CargoDeployPointVec2:GetX(), CargoDeployPointVec2:GetY() ) + + -- Respawn the group... + if self.CargoObject then + self.CargoObject:ReSpawn( ToPointVec2:GetVec3(), 0 ) + self.CargoCarrier = nil + end + + end + + if self.OnUnLoadedCallBack then + self.OnUnLoadedCallBack( self, unpack( self.OnUnLoadedParameters ) ) + self.OnUnLoadedCallBack = nil + end + +end + + + +--- Enter Boarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onenterBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local Speed = 10 + local Angle = 180 + local Distance = 5 + + if From == "UnLoaded" then + local CargoCarrierPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( Distance, CargoDeployHeading ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 2 ) + end + +end + +--- Leave Boarding State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onleaveBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if self:IsNear( CargoCarrier:GetPointVec2() ) then + self:__Load( 1, CargoCarrier ) + return true + else + self:__Boarding( 1, CargoCarrier ) + end + return false +end + +--- Loaded State. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_UNIT:onenterLoaded( From, Event, To, CargoCarrier ) + self:F() + + self.CargoCarrier = CargoCarrier + + -- Only destroy the CargoObject is if there is a CargoObject (packages don't have CargoObjects). + if self.CargoObject then + self:T("Destroying") + self.CargoObject:Destroy() + end +end + + +--- Board Event. +-- @param #AI_CARGO_UNIT self +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_UNIT:onafterBoard( From, Event, To, CargoCarrier ) + self:F() + + self.CargoInAir = self.CargoObject: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 + self:Load( CargoCarrier ) + end + +end + +end + +do -- AI_CARGO_PACKAGE + + --- @type AI_CARGO_PACKAGE + -- @extends #AI_CARGO_REPRESENTABLE + AI_CARGO_PACKAGE = { + ClassName = "AI_CARGO_PACKAGE" + } + +--- AI_CARGO_PACKAGE Constructor. +-- @param #AI_CARGO_PACKAGE self +-- @param Wrapper.Unit#UNIT CargoCarrier The UNIT carrying the package. +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_PACKAGE +function AI_CARGO_PACKAGE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_REPRESENTABLE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #AI_CARGO_PACKAGE + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + + self:T( CargoCarrier ) + self.CargoCarrier = CargoCarrier + + return self +end + +--- Board Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #number Speed +-- @param #number BoardDistance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterOnBoard( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only move the CargoCarrier to the New CargoCarrier when the New CargoCarrier is not in the air. + if not self.CargoInAir then + + local Points = {} + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = CargoCarrier:GetPointVec2():Translate( BoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:Boarded( CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + +end + +--- Check if CargoCarrier is near the Cargo to be Loaded. +-- @param #AI_CARGO_PACKAGE self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @return #boolean +function AI_CARGO_PACKAGE:IsNear( CargoCarrier ) + self:F() + + local CargoCarrierPoint = CargoCarrier:GetPointVec2() + + local Distance = CargoCarrierPoint:DistanceFromPointVec2( self.CargoCarrier:GetPointVec2() ) + self:T( Distance ) + + if Distance <= self.NearRadius then + return true + else + return false + end +end + +--- Boarded Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_PACKAGE:onafterOnBoarded( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:__Load( 1, CargoCarrier, Speed, LoadDistance, Angle ) + else + self:__Boarded( 1, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) + end +end + +--- UnBoard Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Speed +-- @param #number UnLoadDistance +-- @param #number UnBoardDistance +-- @param #number Radius +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterUnBoard( From, Event, To, CargoCarrier, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) + self:F() + + self.CargoInAir = self.CargoCarrier:InAir() + + self:T( self.CargoInAir ) + + -- Only unboard the cargo when the carrier 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 + + self:_Next( self.FsmP.UnLoad, UnLoadDistance, Angle ) + + local Points = {} + + local StartPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + self:T( { CargoCarrierHeading, CargoDeployHeading } ) + local CargoDeployPointVec2 = StartPointVec2:Translate( UnBoardDistance, CargoDeployHeading ) + + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = CargoCarrier:TaskRoute( Points ) + CargoCarrier:SetTask( TaskRoute, 1 ) + end + + self:__UnBoarded( 1 , CargoCarrier, Speed ) + +end + +--- UnBoarded Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +function AI_CARGO_PACKAGE:onafterUnBoarded( From, Event, To, CargoCarrier, Speed ) + self:F() + + if self:IsNear( CargoCarrier ) then + self:__UnLoad( 1, CargoCarrier, Speed ) + else + self:__UnBoarded( 1, CargoCarrier, Speed ) + end +end + +--- Load Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #number Speed +-- @param #number LoadDistance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterLoad( From, Event, To, CargoCarrier, Speed, LoadDistance, Angle ) + self:F() + + self.CargoCarrier = CargoCarrier + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( LoadDistance, CargoDeployHeading ) + + local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + +end + +--- UnLoad Event. +-- @param #AI_CARGO_PACKAGE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param #number Distance +-- @param #number Angle +function AI_CARGO_PACKAGE:onafterUnLoad( From, Event, To, CargoCarrier, Speed, Distance, Angle ) + self:F() + + local StartPointVec2 = self.CargoCarrier:GetPointVec2() + local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = StartPointVec2:Translate( Distance, CargoDeployHeading ) + + self.CargoCarrier = CargoCarrier + + local Points = {} + Points[#Points+1] = StartPointVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoCarrier:TaskRoute( Points ) + self.CargoCarrier:SetTask( TaskRoute, 1 ) + +end + + +end + +do -- AI_CARGO_GROUP + + --- @type AI_CARGO_GROUP + -- @extends AI.AI_Cargo#AI_CARGO + -- @field Set#SET_BASE CargoSet A set of cargo objects. + -- @field #string Name A string defining the name of the cargo group. The name is the unique identifier of the cargo. + AI_CARGO_GROUP = { + ClassName = "AI_CARGO_GROUP", + } + +--- AI_CARGO_GROUP constructor. +-- @param #AI_CARGO_GROUP self +-- @param Core.Set#Set_BASE CargoSet +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_GROUP +function AI_CARGO_GROUP:New( CargoSet, Type, Name, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO:New( Type, Name, 0, ReportRadius, NearRadius ) ) -- #AI_CARGO_GROUP + self:F( { Type, Name, ReportRadius, NearRadius } ) + + self.CargoSet = CargoSet + + + return self +end + +end -- AI_CARGO_GROUP + +do -- AI_CARGO_GROUPED + + --- @type AI_CARGO_GROUPED + -- @extends AI.AI_Cargo#AI_CARGO_GROUP + AI_CARGO_GROUPED = { + ClassName = "AI_CARGO_GROUPED", + } + +--- AI_CARGO_GROUPED constructor. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Set#Set_BASE CargoSet +-- @param #string Type +-- @param #string Name +-- @param #number Weight +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #AI_CARGO_GROUPED +function AI_CARGO_GROUPED:New( CargoSet, Type, Name, ReportRadius, NearRadius ) + local self = BASE:Inherit( self, AI_CARGO_GROUP:New( CargoSet, Type, Name, ReportRadius, NearRadius ) ) -- #AI_CARGO_GROUPED + self:F( { Type, Name, ReportRadius, NearRadius } ) + + return self +end + +--- Enter Boarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if From == "UnLoaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:__Board( 1, CargoCarrier ) + end + ) + + self:__Boarding( 1, CargoCarrier ) + end + +end + +--- Enter Loaded State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterLoaded( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + if From == "UnLoaded" then + -- For each Cargo object within the AI_CARGO_GROUPED, load each cargo to the CargoCarrier. + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + Cargo:Load( CargoCarrier ) + end + end +end + +--- Leave Boarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onleaveBoarding( From, Event, To, CargoCarrier ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local Boarded = true + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( Cargo.current ) + if not Cargo:is( "Loaded" ) then + Boarded = false + end + end + + if not Boarded then + self:__Boarding( 1, CargoCarrier ) + else + self:__Load( 1, CargoCarrier ) + end + return Boarded +end + +--- Enter UnBoarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterUnBoarding( From, Event, To, ToPointVec2 ) + self:F() + + local Timer = 1 + + if From == "Loaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:__UnBoard( Timer, ToPointVec2 ) + Timer = Timer + 10 + end + ) + + self:__UnBoarding( 1, ToPointVec2 ) + end + +end + +--- Leave UnBoarding State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onleaveUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + local UnBoarded = true + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( Cargo.current ) + if not Cargo:is( "UnLoaded" ) then + UnBoarded = false + end + end + + if UnBoarded then + return true + else + self:__UnBoarding( 1, ToPointVec2 ) + end + + return false + end + +end + +--- UnBoard Event. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onafterUnBoarding( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + self:__UnLoad( 1, ToPointVec2 ) +end + + + +--- Enter UnLoaded State. +-- @param #AI_CARGO_GROUPED self +-- @param Core.Point#POINT_VEC2 +-- @param #string Event +-- @param #string From +-- @param #string To +function AI_CARGO_GROUPED:onenterUnLoaded( From, Event, To, ToPointVec2 ) + self:F( { ToPointVec2, From, Event, To } ) + + if From == "Loaded" then + + -- For each Cargo object within the AI_CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:UnLoad( ToPointVec2 ) + end + ) + + end + +end + +end -- AI_CARGO_GROUPED + + + +--- (SP) (MP) (FSM) Accept or reject process for player (task) assignments. +-- +-- === +-- +-- # @{#ACT_ASSIGN} FSM template class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ASSIGN state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ASSIGN **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: Start the tasking acceptance process. +-- * **Assign**: Assign the task. +-- * **Reject**: Reject the task.. +-- +-- ### ACT_ASSIGN **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ASSIGN **States**: +-- +-- * **UnAssigned**: The player has not accepted the task. +-- * **Assigned (*)**: The player has accepted the task. +-- * **Rejected (*)**: The player has not accepted the task. +-- * **Waiting**: The process is awaiting player feedback. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ASSIGN state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ASSIGN_ACCEPT} class, extends @{Fsm.Assign#ACT_ASSIGN} +-- +-- The ACT_ASSIGN_ACCEPT class accepts by default a task for a player. No player intervention is allowed to reject the task. +-- +-- ## 1.1) ACT_ASSIGN_ACCEPT constructor: +-- +-- * @{#ACT_ASSIGN_ACCEPT.New}(): Creates a new ACT_ASSIGN_ACCEPT object. +-- +-- === +-- +-- # 2) @{#ACT_ASSIGN_MENU_ACCEPT} class, extends @{Fsm.Assign#ACT_ASSIGN} +-- +-- The ACT_ASSIGN_MENU_ACCEPT class accepts a task when the player accepts the task through an added menu option. +-- This assignment type is useful to conditionally allow the player to choose whether or not he would accept the task. +-- The assignment type also allows to reject the task. +-- +-- ## 2.1) ACT_ASSIGN_MENU_ACCEPT constructor: +-- ----------------------------------------- +-- +-- * @{#ACT_ASSIGN_MENU_ACCEPT.New}(): Creates a new ACT_ASSIGN_MENU_ACCEPT object. +-- +-- === +-- +-- @module Assign + + +do -- ACT_ASSIGN + + --- ACT_ASSIGN class + -- @type ACT_ASSIGN + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends Core.Fsm#FSM_PROCESS + ACT_ASSIGN = { + ClassName = "ACT_ASSIGN", + } + + + --- Creates a new task assignment state machine. The process will accept the task by default, no player intervention accepted. + -- @param #ACT_ASSIGN self + -- @return #ACT_ASSIGN The task acceptance process. + function ACT_ASSIGN:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ASSIGN" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "UnAssigned", "Start", "Waiting" ) + self:AddTransition( "Waiting", "Assign", "Assigned" ) + self:AddTransition( "Waiting", "Reject", "Rejected" ) + self:AddTransition( "*", "Fail", "Failed" ) + + self:AddEndState( "Assigned" ) + self:AddEndState( "Rejected" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "UnAssigned" ) + + return self + end + +end -- ACT_ASSIGN + + + +do -- ACT_ASSIGN_ACCEPT + + --- ACT_ASSIGN_ACCEPT class + -- @type ACT_ASSIGN_ACCEPT + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIGN + ACT_ASSIGN_ACCEPT = { + ClassName = "ACT_ASSIGN_ACCEPT", + } + + + --- Creates a new task assignment state machine. The process will accept the task by default, no player intervention accepted. + -- @param #ACT_ASSIGN_ACCEPT self + -- @param #string TaskBriefing + function ACT_ASSIGN_ACCEPT:New( TaskBriefing ) + + local self = BASE:Inherit( self, ACT_ASSIGN:New() ) -- #ACT_ASSIGN_ACCEPT + + self.TaskBriefing = TaskBriefing + + return self + end + + function ACT_ASSIGN_ACCEPT:Init( FsmAssign ) + + self.TaskBriefing = FsmAssign.TaskBriefing + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_ACCEPT self + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_ACCEPT:onafterStart( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:__Assign( 1 ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_ACCEPT self + -- @param Wrapper.Unit#UNIT ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_ACCEPT:onenterAssigned( ProcessUnit, From, Event, To ) + env.info( "in here" ) + self:E( { ProcessUnit, From, Event, To } ) + + local ProcessGroup = ProcessUnit:GetGroup() + + self:Message( "You are assigned to the task " .. self.Task:GetName() ) + + self.Task:Assign( ProcessUnit, ProcessUnit:GetPlayerName() ) + end + +end -- ACT_ASSIGN_ACCEPT + + +do -- ACT_ASSIGN_MENU_ACCEPT + + --- ACT_ASSIGN_MENU_ACCEPT class + -- @type ACT_ASSIGN_MENU_ACCEPT + -- @field Tasking.Task#TASK Task + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIGN + ACT_ASSIGN_MENU_ACCEPT = { + ClassName = "ACT_ASSIGN_MENU_ACCEPT", + } + + --- Init. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param #string TaskName + -- @param #string TaskBriefing + -- @return #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:New( TaskName, TaskBriefing ) + + -- Inherits from BASE + local self = BASE:Inherit( self, ACT_ASSIGN:New() ) -- #ACT_ASSIGN_MENU_ACCEPT + + self.TaskName = TaskName + self.TaskBriefing = TaskBriefing + + return self + end + + function ACT_ASSIGN_MENU_ACCEPT:Init( FsmAssign ) + + self.TaskName = FsmAssign.TaskName + self.TaskBriefing = FsmAssign.TaskBriefing + end + + + --- Creates a new task assignment state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param #string TaskName + -- @param #string TaskBriefing + -- @return #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:Init( TaskName, TaskBriefing ) + + self.TaskBriefing = TaskBriefing + self.TaskName = TaskName + + return self + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterStart( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:Message( "Access the radio menu to accept the task. You have 30 seconds or the assignment will be cancelled." ) + + local ProcessGroup = ProcessUnit:GetGroup() + + self.Menu = MENU_GROUP:New( ProcessGroup, "Task " .. self.TaskName .. " acceptance" ) + self.MenuAcceptTask = MENU_GROUP_COMMAND:New( ProcessGroup, "Accept task " .. self.TaskName, self.Menu, self.MenuAssign, self ) + self.MenuRejectTask = MENU_GROUP_COMMAND:New( ProcessGroup, "Reject task " .. self.TaskName, self.Menu, self.MenuReject, self ) + end + + --- Menu function. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:MenuAssign() + self:E( ) + + self:__Assign( 1 ) + end + + --- Menu function. + -- @param #ACT_ASSIGN_MENU_ACCEPT self + function ACT_ASSIGN_MENU_ACCEPT:MenuReject() + self:E( ) + + self:__Reject( 1 ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterAssign( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit.UnitNameFrom, Event, To } ) + + self.Menu:Remove() + end + + --- StateMachine callback function + -- @param #ACT_ASSIGN_MENU_ACCEPT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIGN_MENU_ACCEPT:onafterReject( ProcessUnit, From, Event, To ) + self:E( { ProcessUnit.UnitName, From, Event, To } ) + + self.Menu:Remove() + --TODO: need to resolve this problem ... it has to do with the events ... + --self.Task:UnAssignFromUnit( ProcessUnit )needs to become a callback funtion call upon the event + ProcessUnit:Destroy() + end + +end -- ACT_ASSIGN_MENU_ACCEPT +--- (SP) (MP) (FSM) Route AI or players through waypoints or to zones. +-- +-- === +-- +-- # @{#ACT_ROUTE} FSM class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ROUTE state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ROUTE **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: The process is started. The process will go into the Report state. +-- * **Report**: The process is reporting to the player the route to be followed. +-- * **Route**: The process is routing the controllable. +-- * **Pause**: The process is pausing the route of the controllable. +-- * **Arrive**: The controllable has arrived at a route point. +-- * **More**: There are more route points that need to be followed. The process will go back into the Report state. +-- * **NoMore**: There are no more route points that need to be followed. The process will go into the Success state. +-- +-- ### ACT_ROUTE **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ROUTE **States**: +-- +-- * **None**: The controllable did not receive route commands. +-- * **Arrived (*)**: The controllable has arrived at a route point. +-- * **Aborted (*)**: The controllable has aborted the route path. +-- * **Routing**: The controllable is understay to the route point. +-- * **Pausing**: The process is pausing the routing. AI air will go into hover, AI ground will stop moving. Players can fly around. +-- * **Success (*)**: All route points were reached. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ROUTE state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ROUTE_ZONE} class, extends @{Fsm.Route#ACT_ROUTE} +-- +-- The ACT_ROUTE_ZONE class implements the core functions to route an AIR @{Controllable} player @{Unit} to a @{Zone}. +-- The player receives on perioding times messages with the coordinates of the route to follow. +-- Upon arrival at the zone, a confirmation of arrival is sent, and the process will be ended. +-- +-- # 1.1) ACT_ROUTE_ZONE constructor: +-- +-- * @{#ACT_ROUTE_ZONE.New}(): Creates a new ACT_ROUTE_ZONE object. +-- +-- === +-- +-- @module Route + + +do -- ACT_ROUTE + + --- ACT_ROUTE class + -- @type ACT_ROUTE + -- @field Tasking.Task#TASK TASK + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE Zone + -- @extends Core.Fsm#FSM_PROCESS + ACT_ROUTE = { + ClassName = "ACT_ROUTE", + } + + + --- Creates a new routing state machine. The process will route a CLIENT to a ZONE until the CLIENT is within that ZONE. + -- @param #ACT_ROUTE self + -- @return #ACT_ROUTE self + function ACT_ROUTE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ROUTE" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "None", "Start", "Routing" ) + self:AddTransition( "*", "Report", "Reporting" ) + self:AddTransition( "*", "Route", "Routing" ) + self:AddTransition( "Routing", "Pause", "Pausing" ) + self:AddTransition( "*", "Abort", "Aborted" ) + self:AddTransition( "Routing", "Arrive", "Arrived" ) + self:AddTransition( "Arrived", "Success", "Success" ) + self:AddTransition( "*", "Fail", "Failed" ) + self:AddTransition( "", "", "" ) + self:AddTransition( "", "", "" ) + + self:AddEndState( "Arrived" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "None" ) + + return self + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE:onafterStart( ProcessUnit, From, Event, To ) + + + self:__Route( 1 ) + end + + --- Check if the controllable has arrived. + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE:onfuncHasArrived( ProcessUnit ) + return false + end + + --- StateMachine callback function + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE:onbeforeRoute( ProcessUnit, From, Event, To ) + self:F( { "BeforeRoute 1", self.DisplayCount, self.DisplayInterval } ) + + if ProcessUnit:IsAlive() then + self:F( "BeforeRoute 2" ) + local HasArrived = self:onfuncHasArrived( ProcessUnit ) -- Polymorphic + if self.DisplayCount >= self.DisplayInterval then + self:T( { HasArrived = HasArrived } ) + if not HasArrived then + self:Report() + end + self.DisplayCount = 1 + else + self.DisplayCount = self.DisplayCount + 1 + end + + self:T( { DisplayCount = self.DisplayCount } ) + + if HasArrived then + self:__Arrive( 1 ) + else + self:__Route( 1 ) + end + + return HasArrived -- if false, then the event will not be executed... + end + + return false + + end + +end -- ACT_ROUTE + + +do -- ACT_ROUTE_POINT + + --- ACT_ROUTE_POINT class + -- @type ACT_ROUTE_POINT + -- @field Tasking.Task#TASK TASK + -- @extends #ACT_ROUTE + ACT_ROUTE_POINT = { + ClassName = "ACT_ROUTE_POINT", + } + + + --- Creates a new routing state machine. + -- The task will route a controllable to a PointVec2 until the controllable is within the Range. + -- @param #ACT_ROUTE_POINT self + -- @param Core.Point#POINT_VEC2 The PointVec2 to Target. + -- @param #number Range The Distance to Target. + -- @param Core.Zone#ZONE_BASE Zone + function ACT_ROUTE_POINT:New( PointVec2, Range ) + local self = BASE:Inherit( self, ACT_ROUTE:New() ) -- #ACT_ROUTE_POINT + + self.PointVec2 = PointVec2 + self.Range = Range or 0 + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + + return self + end + + function ACT_ROUTE_POINT:Init( FsmRoute ) + + self.PointVec2 = FsmRoute.PointVec2 + self.Range = FsmRoute.Range or 0 + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + end + + --- Set PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @param Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. + function ACT_ROUTE_POINT:SetPointVec2( PointVec2 ) + self:F2( { PointVec2 } ) + self.PointVec2 = PointVec2 + end + + --- Get PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @return Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. + function ACT_ROUTE_POINT:GetPointVec2() + self:F2( { self.PointVec2 } ) + return self.PointVec2 + end + + --- Set Range around PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @param #number Range The Range to consider the arrival. Default is 10000 meters. + function ACT_ROUTE_POINT:SetRange( Range ) + self:F2( { self.Range } ) + self.Range = Range or 10000 + end + + --- Get Range around PointVec2 + -- @param #ACT_ROUTE_POINT self + -- @return #number The Range to consider the arrival. Default is 10000 meters. + function ACT_ROUTE_POINT:GetRange() + return self.Range + end + + --- Method override to check if the controllable has arrived. + -- @param #ACT_ROUTE_POINT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE_POINT:onfuncHasArrived( ProcessUnit ) + + if ProcessUnit:IsAlive() then + local Distance = self.PointVec2:Get2DDistance( ProcessUnit:GetPointVec2() ) + + if Distance <= self.Range then + local RouteText = "You have arrived." + self:Message( RouteText ) + return true + end + end + + return false + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE_POINT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE_POINT:onenterReporting( ProcessUnit, From, Event, To ) + + local TaskUnitPointVec2 = ProcessUnit:GetPointVec2() + local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( self.PointVec2 ) .. " km." + self:Message( RouteText ) + end + +end -- ACT_ROUTE_POINT + + +do -- ACT_ROUTE_ZONE + + --- ACT_ROUTE_ZONE class + -- @type ACT_ROUTE_ZONE + -- @field Tasking.Task#TASK TASK + -- @field Wrapper.Unit#UNIT ProcessUnit + -- @field Core.Zone#ZONE_BASE Zone + -- @extends #ACT_ROUTE + ACT_ROUTE_ZONE = { + ClassName = "ACT_ROUTE_ZONE", + } + + + --- Creates a new routing state machine. The task will route a controllable to a ZONE until the controllable is within that ZONE. + -- @param #ACT_ROUTE_ZONE self + -- @param Core.Zone#ZONE_BASE Zone + function ACT_ROUTE_ZONE:New( Zone ) + local self = BASE:Inherit( self, ACT_ROUTE:New() ) -- #ACT_ROUTE_ZONE + + self.Zone = Zone + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + + return self + end + + function ACT_ROUTE_ZONE:Init( FsmRoute ) + + self.Zone = FsmRoute.Zone + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + end + + --- Set Zone + -- @param #ACT_ROUTE_ZONE self + -- @param Core.Zone#ZONE_BASE Zone The Zone object where to route to. + function ACT_ROUTE_ZONE:SetZone( Zone ) + self.Zone = Zone + end + + --- Get Zone + -- @param #ACT_ROUTE_ZONE self + -- @return Core.Zone#ZONE_BASE Zone The Zone object where to route to. + function ACT_ROUTE_ZONE:GetZone() + return self.Zone + end + + --- Method override to check if the controllable has arrived. + -- @param #ACT_ROUTE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @return #boolean + function ACT_ROUTE_ZONE:onfuncHasArrived( ProcessUnit ) + + if ProcessUnit:IsInZone( self.Zone ) then + local RouteText = "You have arrived within the zone." + self:Message( RouteText ) + end + + return ProcessUnit:IsInZone( self.Zone ) + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ROUTE_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ROUTE_ZONE:onenterReporting( ProcessUnit, From, Event, To ) + + local ZoneVec2 = self.Zone:GetVec2() + local ZonePointVec2 = POINT_VEC2:New( ZoneVec2.x, ZoneVec2.y ) + local TaskUnitVec2 = ProcessUnit:GetVec2() + local TaskUnitPointVec2 = POINT_VEC2:New( TaskUnitVec2.x, TaskUnitVec2.y ) + local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( ZonePointVec2 ) .. " km." + self:Message( RouteText ) + end + +end -- ACT_ROUTE_ZONE +--- **Actions** - ACT_ACCOUNT_ classes **account for** (detect, count & report) various DCS events occuring on @{Unit}s. +-- +-- ![Banner Image](..\Presentations\ACT_ACCOUNT\Dia1.JPG) +-- +-- === +-- +-- @module Account + + +do -- ACT_ACCOUNT + + --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} + -- + -- ## ACT_ACCOUNT state machine: + -- + -- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. + -- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. + -- Each derived class follows exactly the same process, using the same events and following the same state transitions, + -- but will have **different implementation behaviour** upon each event or state transition. + -- + -- ### ACT_ACCOUNT States + -- + -- * **Asigned**: The player is assigned. + -- * **Waiting**: Waiting for an event. + -- * **Report**: Reporting. + -- * **Account**: Account for an event. + -- * **Accounted**: All events have been accounted for, end of the process. + -- * **Failed**: Failed the process. + -- + -- ### ACT_ACCOUNT Events + -- + -- * **Start**: Start the process. + -- * **Wait**: Wait for an event. + -- * **Report**: Report the status of the accounting. + -- * **Event**: An event happened, process the event. + -- * **More**: More targets. + -- * **NoMore (*)**: No more targets. + -- * **Fail (*)**: The action process has failed. + -- + -- (*) End states of the process. + -- + -- ### ACT_ACCOUNT state transition methods: + -- + -- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. + -- There are 2 moments when state transition methods will be called by the state machine: + -- + -- * **Before** the state transition. + -- The state transition method needs to start with the name **OnBefore + the name of the state**. + -- If the state transition method returns false, then the processing of the state transition will not be done! + -- If you want to change the behaviour of the AIControllable at this event, return false, + -- but then you'll need to specify your own logic using the AIControllable! + -- + -- * **After** the state transition. + -- The state transition method needs to start with the name **OnAfter + the name of the state**. + -- These state transition methods need to provide a return value, which is specified at the function description. + -- + -- @type ACT_ACCOUNT + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Core.Fsm#FSM_PROCESS + ACT_ACCOUNT = { + ClassName = "ACT_ACCOUNT", + TargetSetUnit = nil, + } + + --- Creates a new DESTROY process. + -- @param #ACT_ACCOUNT self + -- @return #ACT_ACCOUNT + function ACT_ACCOUNT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New() ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "Assigned", "Start", "Waiting") + self:AddTransition( "*", "Wait", "Waiting") + self:AddTransition( "*", "Report", "Report") + self:AddTransition( "*", "Event", "Account") + self:AddTransition( "Account", "More", "Wait") + self:AddTransition( "Account", "NoMore", "Accounted") + self:AddTransition( "*", "Fail", "Failed") + + self:AddEndState( "Accounted" ) + self:AddEndState( "Failed" ) + + self:SetStartState( "Assigned" ) + + return self + end + + --- Process Events + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onafterStart( ProcessUnit, From, Event, To ) + + self:HandleEvent( EVENTS.Dead, self.onfuncEventDead ) + + self:__Wait( 1 ) + end + + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onenterWaiting( ProcessUnit, From, Event, To ) + + if self.DisplayCount >= self.DisplayInterval then + self:Report() + self.DisplayCount = 1 + else + self.DisplayCount = self.DisplayCount + 1 + end + + return true -- Process always the event. + end + + --- StateMachine callback function + -- @param #ACT_ACCOUNT self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT:onafterEvent( ProcessUnit, From, Event, To, Event ) + + self:__NoMore( 1 ) + end + +end -- ACT_ACCOUNT + +do -- ACT_ACCOUNT_DEADS + + --- # @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} + -- + -- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. + -- The process is given a @{Set} of units that will be tracked upon successful destruction. + -- The process will end after each target has been successfully destroyed. + -- Each successful dead will trigger an Account state transition that can be scored, modified or administered. + -- + -- + -- ## ACT_ACCOUNT_DEADS constructor: + -- + -- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. + -- + -- @type ACT_ACCOUNT_DEADS + -- @field Set#SET_UNIT TargetSetUnit + -- @extends #ACT_ACCOUNT + ACT_ACCOUNT_DEADS = { + ClassName = "ACT_ACCOUNT_DEADS", + TargetSetUnit = nil, + } + + + --- Creates a new DESTROY process. + -- @param #ACT_ACCOUNT_DEADS self + -- @param Set#SET_UNIT TargetSetUnit + -- @param #string TaskName + function ACT_ACCOUNT_DEADS:New( TargetSetUnit, TaskName ) + -- Inherits from BASE + local self = BASE:Inherit( self, ACT_ACCOUNT:New() ) -- #ACT_ACCOUNT_DEADS + + self.TargetSetUnit = TargetSetUnit + self.TaskName = TaskName + + self.DisplayInterval = 30 + self.DisplayCount = 30 + self.DisplayMessage = true + self.DisplayTime = 10 -- 10 seconds is the default + self.DisplayCategory = "HQ" -- Targets is the default display category + + return self + end + + function ACT_ACCOUNT_DEADS:Init( FsmAccount ) + + self.TargetSetUnit = FsmAccount.TargetSetUnit + self.TaskName = FsmAccount.TaskName + end + + --- Process Events + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, Task, From, Event, To ) + self:E( { ProcessUnit, From, Event, To } ) + + self:Message( "Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:GetUnitTypesText() .. " targets left to be destroyed." ) + end + + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Task, From, Event, To, EventData ) + self:T( { ProcessUnit, EventData, From, Event, To } ) + + self:T({self.Controllable}) + + self.TargetSetUnit:Flush() + + self:T( { "Before sending Message", EventData.IniUnitName, self.TargetSetUnit:FindUnit( EventData.IniUnitName ) } ) + if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then + self:T( "Sending Message" ) + local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:Remove( EventData.IniUnitName ) + self:Message( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed." ) + end + self:T( { "After sending Message" } ) + end + + --- StateMachine callback function + -- @param #ACT_ACCOUNT_DEADS self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Task, From, Event, To ) + + if self.TargetSetUnit:Count() > 0 then + self:__More( 1 ) + else + self:__NoMore( 1 ) + end + end + + --- DCS Events + + --- @param #ACT_ACCOUNT_DEADS self + -- @param Event#EVENTDATA EventData + function ACT_ACCOUNT_DEADS:onfuncEventDead( EventData ) + self:T( { "EventDead", EventData } ) + + if EventData.IniDCSUnit then + self:Event( EventData ) + end + end + +end -- ACT_ACCOUNT DEADS +--- (SP) (MP) (FSM) Route AI or players through waypoints or to zones. +-- +-- === +-- +-- # @{#ACT_ASSIST} FSM class, extends @{Fsm#FSM_PROCESS} +-- +-- ## ACT_ASSIST state machine: +-- +-- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. +-- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. +-- Each derived class follows exactly the same process, using the same events and following the same state transitions, +-- but will have **different implementation behaviour** upon each event or state transition. +-- +-- ### ACT_ASSIST **Events**: +-- +-- These are the events defined in this class: +-- +-- * **Start**: The process is started. +-- * **Next**: The process is smoking the targets in the given zone. +-- +-- ### ACT_ASSIST **Event methods**: +-- +-- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. +-- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: +-- +-- * **Immediate**: The event method has exactly the name of the event. +-- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. +-- +-- ### ACT_ASSIST **States**: +-- +-- * **None**: The controllable did not receive route commands. +-- * **AwaitSmoke (*)**: The process is awaiting to smoke the targets in the zone. +-- * **Smoking (*)**: The process is smoking the targets in the zone. +-- * **Failed (*)**: The process has failed. +-- +-- (*) End states of the process. +-- +-- ### ACT_ASSIST state transition methods: +-- +-- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. +-- There are 2 moments when state transition methods will be called by the state machine: +-- +-- * **Before** the state transition. +-- The state transition method needs to start with the name **OnBefore + the name of the state**. +-- If the state transition method returns false, then the processing of the state transition will not be done! +-- If you want to change the behaviour of the AIControllable at this event, return false, +-- but then you'll need to specify your own logic using the AIControllable! +-- +-- * **After** the state transition. +-- The state transition method needs to start with the name **OnAfter + the name of the state**. +-- These state transition methods need to provide a return value, which is specified at the function description. +-- +-- === +-- +-- # 1) @{#ACT_ASSIST_SMOKE_TARGETS_ZONE} class, extends @{Fsm.Route#ACT_ASSIST} +-- +-- The ACT_ASSIST_SMOKE_TARGETS_ZONE class implements the core functions to smoke targets in a @{Zone}. +-- The targets are smoked within a certain range around each target, simulating a realistic smoking behaviour. +-- At random intervals, a new target is smoked. +-- +-- # 1.1) ACT_ASSIST_SMOKE_TARGETS_ZONE constructor: +-- +-- * @{#ACT_ASSIST_SMOKE_TARGETS_ZONE.New}(): Creates a new ACT_ASSIST_SMOKE_TARGETS_ZONE object. +-- +-- === +-- +-- @module Smoke + +do -- ACT_ASSIST + + --- ACT_ASSIST class + -- @type ACT_ASSIST + -- @extends Core.Fsm#FSM_PROCESS + ACT_ASSIST = { + ClassName = "ACT_ASSIST", + } + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST self + -- @return #ACT_ASSIST + function ACT_ASSIST:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ASSIST" ) ) -- Core.Fsm#FSM_PROCESS + + self:AddTransition( "None", "Start", "AwaitSmoke" ) + self:AddTransition( "AwaitSmoke", "Next", "Smoking" ) + self:AddTransition( "Smoking", "Next", "AwaitSmoke" ) + self:AddTransition( "*", "Stop", "Success" ) + self:AddTransition( "*", "Fail", "Failed" ) + + self:AddEndState( "Failed" ) + self:AddEndState( "Success" ) + + self:SetStartState( "None" ) + + return self + end + + --- Task Events + + --- StateMachine callback function + -- @param #ACT_ASSIST self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST:onafterStart( ProcessUnit, From, Event, To ) + + local ProcessGroup = ProcessUnit:GetGroup() + local MissionMenu = self:GetMission():GetMenu( ProcessGroup ) + + local function MenuSmoke( MenuParam ) + self:E( MenuParam ) + local self = MenuParam.self + local SmokeColor = MenuParam.SmokeColor + self.SmokeColor = SmokeColor + self:__Next( 1 ) + end + + self.Menu = MENU_GROUP:New( ProcessGroup, "Target acquisition", MissionMenu ) + self.MenuSmokeBlue = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop blue smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Blue } ) + self.MenuSmokeGreen = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop green smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Green } ) + self.MenuSmokeOrange = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop Orange smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Orange } ) + self.MenuSmokeRed = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop Red smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.Red } ) + self.MenuSmokeWhite = MENU_GROUP_COMMAND:New( ProcessGroup, "Drop White smoke on targets", self.Menu, MenuSmoke, { self = self, SmokeColor = SMOKECOLOR.White } ) + end + + --- StateMachine callback function + -- @param #ACT_ASSIST self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST:onafterStop( ProcessUnit, From, Event, To ) + + self.Menu:Remove() -- When stopped, remove the menus + end + +end + +do -- ACT_ASSIST_SMOKE_TARGETS_ZONE + + --- ACT_ASSIST_SMOKE_TARGETS_ZONE class + -- @type ACT_ASSIST_SMOKE_TARGETS_ZONE + -- @field Set#SET_UNIT TargetSetUnit + -- @field Core.Zone#ZONE_BASE TargetZone + -- @extends #ACT_ASSIST + ACT_ASSIST_SMOKE_TARGETS_ZONE = { + ClassName = "ACT_ASSIST_SMOKE_TARGETS_ZONE", + } + +-- function ACT_ASSIST_SMOKE_TARGETS_ZONE:_Destructor() +-- self:E("_Destructor") +-- +-- self.Menu:Remove() +-- self:EventRemoveAll() +-- end + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Set#SET_UNIT TargetSetUnit + -- @param Core.Zone#ZONE_BASE TargetZone + function ACT_ASSIST_SMOKE_TARGETS_ZONE:New( TargetSetUnit, TargetZone ) + local self = BASE:Inherit( self, ACT_ASSIST:New() ) -- #ACT_ASSIST + + self.TargetSetUnit = TargetSetUnit + self.TargetZone = TargetZone + + return self + end + + function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init( FsmSmoke ) + + self.TargetSetUnit = FsmSmoke.TargetSetUnit + self.TargetZone = FsmSmoke.TargetZone + end + + --- Creates a new target smoking state machine. The process will request from the menu if it accepts the task, if not, the unit is removed from the simulator. + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Set#SET_UNIT TargetSetUnit + -- @param Core.Zone#ZONE_BASE TargetZone + -- @return #ACT_ASSIST_SMOKE_TARGETS_ZONE self + function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init( TargetSetUnit, TargetZone ) + + self.TargetSetUnit = TargetSetUnit + self.TargetZone = TargetZone + + return self + end + + --- StateMachine callback function + -- @param #ACT_ASSIST_SMOKE_TARGETS_ZONE self + -- @param Wrapper.Controllable#CONTROLLABLE ProcessUnit + -- @param #string Event + -- @param #string From + -- @param #string To + function ACT_ASSIST_SMOKE_TARGETS_ZONE:onenterSmoking( ProcessUnit, From, Event, To ) + + self.TargetSetUnit:ForEachUnit( + --- @param Wrapper.Unit#UNIT SmokeUnit + function( SmokeUnit ) + if math.random( 1, ( 100 * self.TargetSetUnit:Count() ) / 4 ) <= 100 then + SCHEDULER:New( self, + function() + if SmokeUnit:IsAlive() then + SmokeUnit:Smoke( self.SmokeColor, 150 ) + end + end, {}, math.random( 10, 60 ) + ) + end + end + ) + + end + +end--- A COMMANDCENTER is the owner of multiple missions within MOOSE. +-- A COMMANDCENTER governs multiple missions, the tasking and the reporting. +-- @module CommandCenter + + + +--- The REPORT class +-- @type REPORT +-- @extends Core.Base#BASE +REPORT = { + ClassName = "REPORT", +} + +--- Create a new REPORT. +-- @param #REPORT self +-- @param #string Title +-- @return #REPORT +function REPORT:New( Title ) + + local self = BASE:Inherit( self, BASE:New() ) + + self.Report = {} + if Title then + self.Report[#self.Report+1] = Title + end + + return self +end + +--- Add a new line to a REPORT. +-- @param #REPORT self +-- @param #string Text +-- @return #REPORT +function REPORT:Add( Text ) + self.Report[#self.Report+1] = Text + return self.Report[#self.Report] +end + +--- Produces the text of the report, taking into account an optional delimeter, which is \n by default. +-- @param #REPORT self +-- @param #string Delimiter (optional) A delimiter text. +-- @return #string The report text. +function REPORT:Text( Delimiter ) + Delimiter = Delimiter or "\n" + local ReportText = table.concat( self.Report, Delimiter ) or "" + return ReportText +end + +--- The COMMANDCENTER class +-- @type COMMANDCENTER +-- @field Wrapper.Group#GROUP HQ +-- @field Dcs.DCSCoalitionWrapper.Object#coalition CommandCenterCoalition +-- @list Missions +-- @extends Core.Base#BASE +COMMANDCENTER = { + ClassName = "COMMANDCENTER", + CommandCenterName = "", + CommandCenterCoalition = nil, + CommandCenterPositionable = nil, + Name = "", +} +--- The constructor takes an IDENTIFIABLE as the HQ command center. +-- @param #COMMANDCENTER self +-- @param Wrapper.Positionable#POSITIONABLE CommandCenterPositionable +-- @param #string CommandCenterName +-- @return #COMMANDCENTER +function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) + + local self = BASE:Inherit( self, BASE:New() ) + + self.CommandCenterPositionable = CommandCenterPositionable + self.CommandCenterName = CommandCenterName or CommandCenterPositionable:GetName() + self.CommandCenterCoalition = CommandCenterPositionable:GetCoalition() + + self.Missions = {} + + self:HandleEvent( EVENTS.Birth, + --- @param #COMMANDCENTER self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + if EventData.IniObjectCategory == 1 then + local EventGroup = GROUP:Find( EventData.IniDCSGroup ) + if EventGroup and self:HasGroup( EventGroup ) then + local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu ) + local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup ) + local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup ) + self:ReportSummary( EventGroup ) + end + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled! + Mission:JoinUnit( PlayerUnit, PlayerGroup ) + Mission:ReportDetails() + end + end + + end + ) + + -- When a player enters a client or a unit, the CommandCenter will check for each Mission and each Task in the Mission if the player has things to do. + -- For these elements, it will= + -- - Set the correct menu. + -- - Assign the PlayerUnit to the Task if required. + -- - Send a message to the other players in the group that this player has joined. + self:HandleEvent( EVENTS.PlayerEnterUnit, + --- @param #COMMANDCENTER self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled! + Mission:JoinUnit( PlayerUnit, PlayerGroup ) + Mission:ReportDetails() + end + end + ) + + -- Handle when a player leaves a slot and goes back to spectators ... + -- The PlayerUnit will be UnAssigned from the Task. + -- When there is no Unit left running the Task, the Task goes into Abort... + self:HandleEvent( EVENTS.PlayerLeaveUnit, + --- @param #TASK self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:AbortUnit( PlayerUnit ) + end + end + ) + + -- Handle when a player leaves a slot and goes back to spectators ... + -- The PlayerUnit will be UnAssigned from the Task. + -- When there is no Unit left running the Task, the Task goes into Abort... + self:HandleEvent( EVENTS.Crash, + --- @param #TASK self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + Mission:CrashUnit( PlayerUnit ) + end + end + ) + + return self +end + +--- Gets the name of the HQ command center. +-- @param #COMMANDCENTER self +-- @return #string +function COMMANDCENTER:GetName() + + return self.CommandCenterName +end + +--- Gets the POSITIONABLE of the HQ command center. +-- @param #COMMANDCENTER self +-- @return Wrapper.Positionable#POSITIONABLE +function COMMANDCENTER:GetPositionable() + return self.CommandCenterPositionable +end + +--- Get the Missions governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @return #list +function COMMANDCENTER:GetMissions() + + return self.Missions +end + +--- Add a MISSION to be governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @param Tasking.Mission#MISSION Mission +-- @return Tasking.Mission#MISSION +function COMMANDCENTER:AddMission( Mission ) + + self.Missions[Mission] = Mission + + return Mission +end + +--- Removes a MISSION to be governed by the HQ command center. +-- The given Mission is not nilified. +-- @param #COMMANDCENTER self +-- @param Tasking.Mission#MISSION Mission +-- @return Tasking.Mission#MISSION +function COMMANDCENTER:RemoveMission( Mission ) + + self.Missions[Mission] = nil + + return Mission +end + +--- Sets the menu structure of the Missions governed by the HQ command center. +-- @param #COMMANDCENTER self +function COMMANDCENTER:SetMenu() + self:F() + + self.CommandCenterMenu = self.CommandCenterMenu or MENU_COALITION:New( self.CommandCenterCoalition, "Command Center (" .. self:GetName() .. ")" ) + + local MenuTime = timer.getTime() + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:SetMenu( MenuTime ) + end + + for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION + Mission:RemoveMenu( MenuTime ) + end + +end + +--- Gets the commandcenter menu structure governed by the HQ command center. +-- @param #COMMANDCENTER self +-- @return Core.Menu#MENU_COALITION +function COMMANDCENTER:GetMenu() + self:F() + return self.CommandCenterMenu +end + +--- Checks of the COMMANDCENTER has a GROUP. +-- @param #COMMANDCENTER self +-- @param Wrapper.Group#GROUP +-- @return #boolean +function COMMANDCENTER:HasGroup( MissionGroup ) + + local Has = false + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + if Mission:HasGroup( MissionGroup ) then + Has = true + break + end + end + + return Has +end + +--- Send a CC message to the coalition of the CC. +-- @param #COMMANDCENTER self +function COMMANDCENTER:MessageToAll( Message ) + + self:GetPositionable():MessageToAll( Message, 20, self:GetName() ) + +end + +--- Send a CC message to a GROUP. +-- @param #COMMANDCENTER self +-- @param #string Message +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #sring Name (optional) The name of the Group used as a prefix for the message to the Group. If not provided, there will be nothing shown. +function COMMANDCENTER:MessageToGroup( Message, TaskGroup, Name ) + + local Prefix = "@ Group" + Prefix = Prefix .. ( Name and " (" .. Name .. "): " or '' ) + Message = Prefix .. Message + self:GetPositionable():MessageToGroup( Message , 20, TaskGroup, self:GetName() ) + +end + +--- Send a CC message to the coalition of the CC. +-- @param #COMMANDCENTER self +function COMMANDCENTER:MessageToCoalition( Message ) + + local CCCoalition = self:GetPositionable():GetCoalition() + --TODO: Fix coalition bug! + self:GetPositionable():MessageToCoalition( Message, 20, CCCoalition, self:GetName() ) + +end + + +--- Report the status of all MISSIONs to a GROUP. +-- Each Mission is listed, with an indication how many Tasks are still to be completed. +-- @param #COMMANDCENTER self +function COMMANDCENTER:ReportSummary( ReportGroup ) + self:E( ReportGroup ) + + local Report = REPORT:New() + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + Report:Add( " - " .. Mission:ReportOverview() ) + end + + self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) + +end + +--- Report the status of a Task to a Group. +-- Report the details of a Mission, listing the Mission, and all the Task details. +-- @param #COMMANDCENTER self +function COMMANDCENTER:ReportDetails( ReportGroup, Task ) + self:E( ReportGroup ) + + local Report = REPORT:New() + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + Report:Add( " - " .. Mission:ReportDetails() ) + end + + self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) +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 + +--- The MISSION class +-- @type MISSION +-- @field #MISSION.Clients _Clients +-- @field Core.Menu#MENU_COALITION MissionMenu +-- @field #string MissionBriefing +-- @extends Core.Fsm#FSM +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", +} + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param #MISSION self +-- @param Tasking.CommandCenter#COMMANDCENTER CommandCenter +-- @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 Dcs.DCSCoalitionWrapper.Object#coalition 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 self +function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM + + self:SetStartState( "Idle" ) + + self:AddTransition( "Idle", "Start", "Ongoing" ) + + --- OnLeave Transition Handler for State Idle. + -- @function [parent=#MISSION] OnLeaveIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Idle. + -- @function [parent=#MISSION] OnEnterIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnLeave Transition Handler for State Ongoing. + -- @function [parent=#MISSION] OnLeaveOngoing + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Ongoing. + -- @function [parent=#MISSION] OnEnterOngoing + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Start. + -- @function [parent=#MISSION] OnBeforeStart + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Start. + -- @function [parent=#MISSION] OnAfterStart + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Start. + -- @function [parent=#MISSION] Start + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Start. + -- @function [parent=#MISSION] __Start + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Ongoing", "Stop", "Idle" ) + + --- OnLeave Transition Handler for State Idle. + -- @function [parent=#MISSION] OnLeaveIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Idle. + -- @function [parent=#MISSION] OnEnterIdle + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Stop. + -- @function [parent=#MISSION] OnBeforeStop + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Stop. + -- @function [parent=#MISSION] OnAfterStop + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Stop. + -- @function [parent=#MISSION] Stop + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Stop. + -- @function [parent=#MISSION] __Stop + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "Ongoing", "Complete", "Completed" ) + + --- OnLeave Transition Handler for State Completed. + -- @function [parent=#MISSION] OnLeaveCompleted + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Completed. + -- @function [parent=#MISSION] OnEnterCompleted + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Complete. + -- @function [parent=#MISSION] OnBeforeComplete + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Complete. + -- @function [parent=#MISSION] OnAfterComplete + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Complete. + -- @function [parent=#MISSION] Complete + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Complete. + -- @function [parent=#MISSION] __Complete + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:AddTransition( "*", "Fail", "Failed" ) + + --- OnLeave Transition Handler for State Failed. + -- @function [parent=#MISSION] OnLeaveFailed + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnEnter Transition Handler for State Failed. + -- @function [parent=#MISSION] OnEnterFailed + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- OnBefore Transition Handler for Event Fail. + -- @function [parent=#MISSION] OnBeforeFail + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event Fail. + -- @function [parent=#MISSION] OnAfterFail + -- @param #MISSION self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event Fail. + -- @function [parent=#MISSION] Fail + -- @param #MISSION self + + --- Asynchronous Event Trigger for Event Fail. + -- @function [parent=#MISSION] __Fail + -- @param #MISSION self + -- @param #number Delay The delay in seconds. + + self:T( { MissionName, MissionPriority, MissionBriefing, MissionCoalition } ) + + self.CommandCenter = CommandCenter + CommandCenter:AddMission( self ) + + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + + self.Tasks = {} + + -- Private implementations + + + + return self +end + +-- FSM function for a MISSION +-- @param #MISSION self +-- @param #string From +-- @param #string Event +-- @param #string To +function MISSION:onbeforeComplete( From, Event, To ) + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if not Task:IsStateSuccess() and not Task:IsStateFailed() and not Task:IsStateAborted() and not Task:IsStateCancelled() then + return false -- Mission cannot be completed. Other Tasks are still active. + end + end + return true -- Allow Mission completion. +end + +-- FSM function for a MISSION +-- @param #MISSION self +-- @param #string From +-- @param #string Event +-- @param #string To +function MISSION:onenterCompleted( From, Event, To ) + + self:GetCommandCenter():MessageToCoalition( "Mission " .. self:GetName() .. " has been completed! Good job guys!" ) +end + +--- Gets the mission name. +-- @param #MISSION self +-- @return #MISSION self +function MISSION:GetName() + return self.Name +end + +--- Add a Unit to join the Mission. +-- For each Task within the Mission, the Unit is joined with the Task. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @param Wrapper.Group#GROUP PlayerGroup The GROUP of the player joining the Mission. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:JoinUnit( PlayerUnit, PlayerGroup ) + self:F( { PlayerUnit = PlayerUnit, PlayerGroup = PlayerGroup } ) + + local PlayerUnitAdded = false + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:JoinUnit( PlayerUnit, PlayerGroup ) then + PlayerUnitAdded = true + end + end + + return PlayerUnitAdded +end + +--- Aborts a PlayerUnit from the Mission. +-- For each Task within the Mission, the PlayerUnit is removed from Task where it is assigned. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:AbortUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitRemoved = false + + for TaskID, Task in pairs( self:GetTasks() ) do + if Task:AbortUnit( PlayerUnit ) then + PlayerUnitRemoved = true + end + end + + return PlayerUnitRemoved +end + +--- Handles a crash of a PlayerUnit from the Mission. +-- For each Task within the Mission, the PlayerUnit is removed from Task where it is assigned. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player crashing. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:CrashUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitRemoved = false + + for TaskID, Task in pairs( self:GetTasks() ) do + if Task:CrashUnit( PlayerUnit ) then + PlayerUnitRemoved = true + end + end + + return PlayerUnitRemoved +end + +--- Add a scoring to the mission. +-- @param #MISSION self +-- @return #MISSION self +function MISSION:AddScoring( Scoring ) + self.Scoring = Scoring + return self +end + +--- Get the scoring object of a mission. +-- @param #MISSION self +-- @return #SCORING Scoring +function MISSION:GetScoring() + return self.Scoring +end + +--- Get the groups for which TASKS are given in the mission +-- @param #MISSION self +-- @return Core.Set#SET_GROUP +function MISSION:GetGroups() + + local SetGroup = SET_GROUP:New() + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + local GroupSet = Task:GetGroups() + GroupSet:ForEachGroup( + function( TaskGroup ) + SetGroup:Add( TaskGroup, TaskGroup ) + end + ) + end + + return SetGroup + +end + + +--- Sets the Planned Task menu. +-- @param #MISSION self +-- @param #number MenuTime +function MISSION:SetMenu( MenuTime ) + self:F() + + for _, TaskData in pairs( self:GetTasks() ) do + local Task = TaskData -- Tasking.Task#TASK + Task:SetMenu( MenuTime ) + end +end + +--- Removes the Planned Task menu. +-- @param #MISSION self +-- @param #number MenuTime +function MISSION:RemoveMenu( MenuTime ) + self:F() + + for _, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Task:RemoveMenu( MenuTime ) + end +end + + +--- Gets the COMMANDCENTER. +-- @param #MISSION self +-- @return Tasking.CommandCenter#COMMANDCENTER +function MISSION:GetCommandCenter() + return self.CommandCenter +end + + +--- Removes a Task menu. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task +-- @return #MISSION self +function MISSION:RemoveTaskMenu( Task ) + + Task:RemoveMenu() +end + + +--- Gets the mission menu for the coalition. +-- @param #MISSION self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return Core.Menu#MENU_COALITION self +function MISSION:GetMenu( TaskGroup ) + + local CommandCenter = self:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local MissionName = self:GetName() + local MissionMenu = CommandCenterMenu:GetMenu( MissionName ) + + return MissionMenu +end + + +--- Get the TASK identified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param #string TaskName The Name of the @{Task} within the @{Mission}. +-- @return Tasking.Task#TASK The Task +-- @return #nil Returns nil if no task was found. +function MISSION:GetTask( TaskName ) + self:F( { TaskName } ) + + return self.Tasks[TaskName] +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 Goals. The Mission will not be completed until all Goals are reached. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return Tasking.Task#TASK The task added. +function MISSION:AddTask( Task ) + + local TaskName = Task:GetTaskName() + self:F( TaskName ) + + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + self.Tasks[TaskName] = Task + + self:GetCommandCenter():SetMenu() + + return Task +end + +--- Removes 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 Goals. The Mission will not be completed until all Goals are reached. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return #nil The cleaned Task reference. +function MISSION:RemoveTask( Task ) + + local TaskName = Task:GetTaskName() + + self:F( TaskName ) + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + -- Ensure everything gets garbarge collected. + self.Tasks[TaskName] = nil + Task = nil + + collectgarbage() + + self:GetCommandCenter():SetMenu() + + return nil +end + +--- Return the next @{Task} ID to be completed within the @{Mission}. +-- @param #MISSION self +-- @param Tasking.Task#TASK Task is the @{Task} object. +-- @return Tasking.Task#TASK The task added. +function MISSION:GetNextTaskID( Task ) + + local TaskName = Task:GetTaskName() + self:F( TaskName ) + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } + + self.Tasks[TaskName].n = self.Tasks[TaskName].n + 1 + + return self.Tasks[TaskName].n +end + +--- Is the @{Mission} **Completed**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsCompleted() + return self:Is( "Completed" ) +end + +--- Is the @{Mission} **Idle**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsIdle() + return self:Is( "Idle" ) +end + +--- Is the @{Mission} **Ongoing**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsOngoing() + return self:Is( "Ongoing" ) +end + +--- Is the @{Mission} **Failed**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsFailed() + return self:Is( "Failed" ) +end + +--- Is the @{Mission} **Hold**. +-- @param #MISSION self +-- @return #boolean +function MISSION:IsHold() + return self:Is( "Hold" ) +end + +--- Validates if the Mission has a Group +-- @param #MISSION +-- @return #boolean true if the Mission has a Group. +function MISSION:HasGroup( TaskGroup ) + local Has = false + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:HasGroup( TaskGroup ) then + Has = true + break + end + end + + return Has +end + +--- Create a summary report of the Mission (one line). +-- @param #MISSION self +-- @return #string +function MISSION:ReportSummary() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:IsStateSuccess() or Task:IsStateFailed() then + else + TasksRemaining = TasksRemaining + 1 + end + end + + Report:Add( "Mission " .. Name .. " - " .. Status .. " - " .. TasksRemaining .. " tasks remaining." ) + + return Report:Text() +end + +--- Create a overview report of the Mission (multiple lines). +-- @param #MISSION self +-- @return #string +function MISSION:ReportOverview() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Report:Add( "- " .. Task:ReportSummary() ) + end + + return Report:Text() +end + +--- Create a detailed report of the Mission, listing all the details of the Task. +-- @param #MISSION self +-- @return #string +function MISSION:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + Report:Add( Task:ReportDetails() ) + end + + return Report:Text() +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 + + +--- This module contains the TASK class. +-- +-- 1) @{#TASK} class, extends @{Base#BASE} +-- ============================================ +-- 1.1) The @{#TASK} class implements the methods for task orchestration within MOOSE. +-- ---------------------------------------------------------------------------------------- +-- The class provides a couple of methods to: +-- +-- * @{#TASK.AssignToGroup}():Assign a task to a group (of players). +-- * @{#TASK.AddProcess}():Add a @{Process} to a task. +-- * @{#TASK.RemoveProcesses}():Remove a running @{Process} from a running task. +-- * @{#TASK.SetStateMachine}():Set a @{Fsm} to a task. +-- * @{#TASK.RemoveStateMachine}():Remove @{Fsm} from a task. +-- * @{#TASK.HasStateMachine}():Enquire if the task has a @{Fsm} +-- * @{#TASK.AssignToUnit}(): Assign a task to a unit. (Needs to be implemented in the derived classes from @{#TASK}. +-- * @{#TASK.UnAssignFromUnit}(): Unassign the task from a unit. +-- * @{#TASK.SetTimeOut}(): Set timer in seconds before task gets cancelled if not assigned. +-- +-- 1.2) Set and enquire task status (beyond the task state machine processing). +-- ---------------------------------------------------------------------------- +-- A task needs to implement as a minimum the following task states: +-- +-- * **Success**: Expresses the successful execution and finalization of the task. +-- * **Failed**: Expresses the failure of a task. +-- * **Planned**: Expresses that the task is created, but not yet in execution and is not assigned yet. +-- * **Assigned**: Expresses that the task is assigned to a Group of players, and that the task is in execution mode. +-- +-- A task may also implement the following task states: +-- +-- * **Rejected**: Expresses that the task is rejected by a player, who was requested to accept the task. +-- * **Cancelled**: Expresses that the task is cancelled by HQ or through a logical situation where a cancellation of the task is required. +-- +-- A task can implement more statusses than the ones outlined above. Please consult the documentation of the specific tasks to understand the different status modelled. +-- +-- The status of tasks can be set by the methods **State** followed by the task status. An example is `StateAssigned()`. +-- The status of tasks can be enquired by the methods **IsState** followed by the task status name. An example is `if IsStateAssigned() then`. +-- +-- 1.3) Add scoring when reaching a certain task status: +-- ----------------------------------------------------- +-- Upon reaching a certain task status in a task, additional scoring can be given. If the Mission has a scoring system attached, the scores will be added to the mission scoring. +-- Use the method @{#TASK.AddScore}() to add scores when a status is reached. +-- +-- 1.4) Task briefing: +-- ------------------- +-- A task briefing can be given that is shown to the player when he is assigned to the task. +-- +-- === +-- +-- ### Authors: FlightControl - Design and Programming +-- +-- @module Task + +--- The TASK class +-- @type TASK +-- @field Core.Scheduler#SCHEDULER TaskScheduler +-- @field Tasking.Mission#MISSION Mission +-- @field Core.Set#SET_GROUP SetGroup The Set of Groups assigned to the Task +-- @field Core.Fsm#FSM_PROCESS FsmTemplate +-- @field Tasking.Mission#MISSION Mission +-- @field Tasking.CommandCenter#COMMANDCENTER CommandCenter +-- @extends Core.Fsm#FSM_TASK +TASK = { + ClassName = "TASK", + TaskScheduler = nil, + ProcessClasses = {}, -- The container of the Process classes that will be used to create and assign new processes for the task to ProcessUnits. + Processes = {}, -- The container of actual process objects instantiated and assigned to ProcessUnits. + Players = nil, + Scores = {}, + Menu = {}, + SetGroup = nil, + FsmTemplate = nil, + Mission = nil, + CommandCenter = nil, + TimeOut = 0, +} + +--- FSM PlayerAborted event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerAborted +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he went back to spectators or left the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM PlayerCrashed event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerCrashed +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he crashed in the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM PlayerDead event handler prototype for TASK. +-- @function [parent=#TASK] OnAfterPlayerDead +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The Unit of the Player when he died in the mission. +-- @param #string PlayerName The name of the Player. + +--- FSM Fail synchronous event function for TASK. +-- Use this event to Fail the Task. +-- @function [parent=#TASK] Fail +-- @param #TASK self + +--- FSM Fail asynchronous event function for TASK. +-- Use this event to Fail the Task. +-- @function [parent=#TASK] __Fail +-- @param #TASK self + +--- FSM Abort synchronous event function for TASK. +-- Use this event to Abort the Task. +-- @function [parent=#TASK] Abort +-- @param #TASK self + +--- FSM Abort asynchronous event function for TASK. +-- Use this event to Abort the Task. +-- @function [parent=#TASK] __Abort +-- @param #TASK self + +--- FSM Success synchronous event function for TASK. +-- Use this event to make the Task a Success. +-- @function [parent=#TASK] Success +-- @param #TASK self + +--- FSM Success asynchronous event function for TASK. +-- Use this event to make the Task a Success. +-- @function [parent=#TASK] __Success +-- @param #TASK self + +--- FSM Cancel synchronous event function for TASK. +-- Use this event to Cancel the Task. +-- @function [parent=#TASK] Cancel +-- @param #TASK self + +--- FSM Cancel asynchronous event function for TASK. +-- Use this event to Cancel the Task. +-- @function [parent=#TASK] __Cancel +-- @param #TASK self + +--- FSM Replan synchronous event function for TASK. +-- Use this event to Replan the Task. +-- @function [parent=#TASK] Replan +-- @param #TASK self + +--- FSM Replan asynchronous event function for TASK. +-- Use this event to Replan the Task. +-- @function [parent=#TASK] __Replan +-- @param #TASK self + + +--- Instantiates a new TASK. Should never be used. Interface Class. +-- @param #TASK self +-- @param Tasking.Mission#MISSION Mission The mission wherein the Task is registered. +-- @param Core.Set#SET_GROUP SetGroupAssign The set of groups for which the Task can be assigned. +-- @param #string TaskName The name of the Task +-- @param #string TaskType The type of the Task +-- @return #TASK self +function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) + + local self = BASE:Inherit( self, FSM_TASK:New() ) -- Core.Fsm#FSM_TASK + + self:SetStartState( "Planned" ) + self:AddTransition( "Planned", "Assign", "Assigned" ) + self:AddTransition( "Assigned", "AssignUnit", "Assigned" ) + self:AddTransition( "Assigned", "Success", "Success" ) + self:AddTransition( "Assigned", "Fail", "Failed" ) + self:AddTransition( "Assigned", "Abort", "Aborted" ) + self:AddTransition( "Assigned", "Cancel", "Cancelled" ) + self:AddTransition( "*", "PlayerCrashed", "*" ) + self:AddTransition( "*", "PlayerAborted", "*" ) + self:AddTransition( "*", "PlayerDead", "*" ) + self:AddTransition( { "Failed", "Aborted", "Cancelled" }, "Replan", "Planned" ) + self:AddTransition( "*", "TimeOut", "Cancelled" ) + + self:E( "New TASK " .. TaskName ) + + self.Processes = {} + self.Fsm = {} + + self.Mission = Mission + self.CommandCenter = Mission:GetCommandCenter() + + self.SetGroup = SetGroupAssign + + self:SetType( TaskType ) + self:SetName( TaskName ) + self:SetID( Mission:GetNextTaskID( self ) ) -- The Mission orchestrates the task sequences .. + + self.TaskBriefing = "You are invited for the task: " .. self.TaskName .. "." + + self.FsmTemplate = self.FsmTemplate or FSM_PROCESS:New() + + + return self +end + +--- Get the Task FSM Process Template +-- @param #TASK self +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetUnitProcess( TaskUnit ) + + if TaskUnit then + return self:GetStateMachine( TaskUnit ) + else + return self.FsmTemplate + end +end + +--- Sets the Task FSM Process Template +-- @param #TASK self +-- @param Core.Fsm#FSM_PROCESS +function TASK:SetUnitProcess( FsmTemplate ) + + self.FsmTemplate = FsmTemplate +end + +--- Add a PlayerUnit to join the Task. +-- For each Group within the Task, the Unit is check if it can join the Task. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. +-- @param Wrapper.Group#GROUP PlayerGroup The GROUP of the player joining the Mission. +-- @return #boolean true if Unit is part of the Task. +function TASK:JoinUnit( PlayerUnit, PlayerGroup ) + self:F( { PlayerUnit = PlayerUnit, PlayerGroup = PlayerGroup } ) + + local PlayerUnitAdded = false + + local PlayerGroups = self:GetGroups() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is added to the Task. + -- If the PlayerGroup is not assigned to the Task, the menu needs to be set. In that case, the PlayerUnit will become the GroupPlayer leader. + if self:IsStatePlanned() or self:IsStateReplanned() then + self:SetMenuForGroup( PlayerGroup ) + --self:MessageToGroups( PlayerUnit:GetPlayerName() .. " is planning to join Task " .. self:GetName() ) + end + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:AssignToUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " joined Task " .. self:GetName() ) + end + end + end + + return PlayerUnitAdded +end + +--- Abort a PlayerUnit from a Task. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. +-- @return #boolean true if Unit is part of the Task. +function TASK:AbortUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitAborted = false + + local PlayerGroups = self:GetGroups() + local PlayerGroup = PlayerUnit:GetGroup() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. + -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:UnAssignFromUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " aborted Task " .. self:GetName() ) + self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) + if #PlayerGroup:GetUnits() == 1 then + self:UnAssignFromGroup( PlayerGroup ) + PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:RemoveMenuForGroup( PlayerGroup ) + end + self:Abort() + end + end + end + + return PlayerUnitAborted +end + +--- A PlayerUnit crashed in a Task. Abort the Player. +-- If the Unit was not part of the Task, false is returned. +-- If the Unit is part of the Task, true is returned. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. +-- @return #boolean true if Unit is part of the Task. +function TASK:CrashUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitCrashed = false + + local PlayerGroups = self:GetGroups() + local PlayerGroup = PlayerUnit:GetGroup() + + -- Is the PlayerGroup part of the PlayerGroups? + if PlayerGroups:IsIncludeObject( PlayerGroup ) then + + -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. + -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. + if self:IsStateAssigned() then + local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) + self:E( { IsAssignedToGroup = IsAssignedToGroup } ) + if IsAssignedToGroup then + self:UnAssignFromUnit( PlayerUnit ) + self:MessageToGroups( PlayerUnit:GetPlayerName() .. " crashed in Task " .. self:GetName() ) + self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) + if #PlayerGroup:GetUnits() == 1 then + PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:RemoveMenuForGroup( PlayerGroup ) + end + self:PlayerCrashed( PlayerUnit ) + end + end + end + + return PlayerUnitCrashed +end + + + +--- Gets the Mission to where the TASK belongs. +-- @param #TASK self +-- @return Tasking.Mission#MISSION +function TASK:GetMission() + + return self.Mission +end + + +--- Gets the SET_GROUP assigned to the TASK. +-- @param #TASK self +-- @return Core.Set#SET_GROUP +function TASK:GetGroups() + return self.SetGroup +end + + + +--- Assign the @{Task} to a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return #TASK +function TASK:AssignToGroup( TaskGroup ) + self:F2( TaskGroup:GetName() ) + + local TaskGroupName = TaskGroup:GetName() + + TaskGroup:SetState( TaskGroup, "Assigned", self ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + MissionMenu:RemoveSubMenus() + + --self:RemoveMenuForGroup( TaskGroup ) + self:SetAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + self:E(PlayerName) + if PlayerName ~= nil or PlayerName ~= "" then + self:AssignToUnit( TaskUnit ) + end + end + + return self +end + +--- +-- @param #TASK self +-- @param Wrapper.Group#GROUP FindGroup +-- @return #boolean +function TASK:HasGroup( FindGroup ) + + return self:GetGroups():IsIncludeObject( FindGroup ) + +end + +--- Assign the @{Task} to an alive @{Unit}. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:AssignToUnit( TaskUnit ) + self:F( TaskUnit:GetName() ) + + local FsmTemplate = self:GetUnitProcess() + + -- Assign a new FsmUnit to TaskUnit. + local FsmUnit = self:SetStateMachine( TaskUnit, FsmTemplate:Copy( TaskUnit, self ) ) -- Core.Fsm#FSM_PROCESS + self:E({"Address FsmUnit", tostring( FsmUnit ) } ) + + FsmUnit:SetStartState( "Planned" ) + + FsmUnit:Accept() -- Each Task needs to start with an Accept event to start the flow. + + return self +end + +--- UnAssign the @{Task} from an alive @{Unit}. +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:UnAssignFromUnit( TaskUnit ) + self:F( TaskUnit:GetName() ) + + self:RemoveStateMachine( TaskUnit ) + + return self +end + +--- Sets the TimeOut for the @{Task}. If @{Task} stayed planned for longer than TimeOut, it gets into Cancelled status. +-- @param #TASK self +-- @param #integer Timer in seconds +-- @return #TASK self +function TASK:SetTimeOut ( Timer ) + self:F( Timer ) + self.TimeOut = Timer + self:__TimeOut( self.TimeOut ) + return self +end + +--- Send a message of the @{Task} to the assigned @{Group}s. +-- @param #TASK self +function TASK:MessageToGroups( Message ) + self:F( { Message = Message } ) + + local Mission = self:GetMission() + local CC = Mission:GetCommandCenter() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroup -- Wrapper.Group#GROUP + CC:MessageToGroup( Message, TaskGroup, TaskGroup:GetName() ) + end +end + + +--- Send the briefng message of the @{Task} to the assigned @{Group}s. +-- @param #TASK self +function TASK:SendBriefingToAssignedGroups() + self:F2() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + + if self:IsAssignedToGroup( TaskGroup ) then + TaskGroup:Message( self.TaskBriefing, 60 ) + end + end +end + + +--- UnAssign the @{Task} from the @{Group}s. +-- @param #TASK self +function TASK:UnAssignFromGroups() + self:F2() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + self:UnAssignFromGroup( TaskGroup ) + end +end + +--- UnAssign the @{Task} from a @{Group}. +-- @param #TASK self +function TASK:UnAssignFromGroup( TaskGroup ) + self:F2( { TaskGroup } ) + + TaskGroup:SetState( TaskGroup, "Assigned", nil ) + + self:RemoveAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + if PlayerName ~= nil or PlayerName ~= "" then + self:UnAssignFromUnit( TaskUnit ) + end + end +end + + + +--- Returns if the @{Task} is assigned to the Group. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @return #boolean +function TASK:IsAssignedToGroup( TaskGroup ) + + local TaskGroupName = TaskGroup:GetName() + + if self:IsStateAssigned() then + if TaskGroup:GetState( TaskGroup, "Assigned" ) == self then + self:T( { "Task is assigned to:", TaskGroup:GetName() } ) + return true + end + end + + self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) + return false +end + +--- Returns if the @{Task} has still alive and assigned Units. +-- @param #TASK self +-- @return #boolean +function TASK:HasAliveUnits() + self:F() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + if self:IsStateAssigned() then + if self:IsAssignedToGroup( TaskGroup ) then + for TaskUnitID, TaskUnit in pairs( TaskGroup:GetUnits() ) do + if TaskUnit:IsAlive() then + self:T( { HasAliveUnits = true } ) + return true + end + end + end + end + end + + self:T( { HasAliveUnits = false } ) + return false +end + +--- Set the menu options of the @{Task} to all the groups in the SetGroup. +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:SetMenu( MenuTime ) + self:F() + + self.SetGroup:Flush() + for TaskGroupID, TaskGroupData in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroupData -- Wrapper.Group#GROUP + if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then + if self:IsStatePlanned() or self:IsStateReplanned() then + self:SetMenuForGroup( TaskGroup, MenuTime ) + end + end + end +end + + + +--- Set the Menu for a Group +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:SetMenuForGroup( TaskGroup, MenuTime ) + + if not TaskGroup:GetState( TaskGroup, "Assigned" ) then + self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) + else + if not self:IsAssignedToGroup( TaskGroup ) then + self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) + end + end +end + + +--- Set the planned menu option of the @{Task}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #string MenuText The menu text. +-- @param #number MenuTime +-- @return #TASK self +function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) + self:E( TaskGroup:GetName() ) + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) + + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + local TaskType = self:GetType() + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, MissionMenu ):SetTime( MenuTime ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, MenuText, TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + + return self +end + +--- Set the assigned menu options of the @{Task}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) + self:E( TaskGroup:GetName() ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + + self:E( { MissionMenu = MissionMenu } ) + + local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Task Status", MissionMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Abort Task", MissionMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ) + + return self +end + +--- Remove the menu options of the @{Task} to all the groups in the SetGroup. +-- @param #TASK self +-- @param #number MenuTime +-- @return #TASK +function TASK:RemoveMenu( MenuTime ) + self:F() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + local TaskGroup = TaskGroup -- Wrapper.Group#GROUP + if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then + if not self:IsAssignedToGroup( TaskGroup ) then + self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) + end + end + end +end + + +--- Remove the menu option of the @{Task} for a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) + self:F() + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + if MissionMenu then + local TaskType = self:GetType() + local TypeMenu = MissionMenu:GetMenu( TaskType ) + + if TypeMenu then + local TaskMenu = TypeMenu:GetMenu( self:GetTaskName() ) + if TaskMenu then + TaskMenu:Remove( MenuTime ) + end + end + end + +end + +--- Remove the assigned menu option of the @{Task} for a @{Group}. +-- @param #TASK self +-- @param Wrapper.Group#GROUP TaskGroup +-- @param #number MenuTime +-- @return #TASK self +function TASK:RemoveAssignedMenuForGroup( TaskGroup ) + self:F() + + local Mission = self:GetMission() + local MissionName = Mission:GetName() + + local MissionMenu = Mission:GetMenu( TaskGroup ) + + if MissionMenu then + MissionMenu:RemoveSubMenus() + end + +end + +function TASK.MenuAssignToGroup( MenuParam ) + + local self = MenuParam.self + local TaskGroup = MenuParam.TaskGroup + + self:E( "Assigned menu selected") + + self:AssignToGroup( TaskGroup ) +end + +--- Report the task status. +-- @param #TASK self +function TASK:MenuTaskStatus( TaskGroup ) + + local ReportText = self:ReportDetails() + + self:T( ReportText ) + self:GetMission():GetCommandCenter():MessageToGroup( ReportText, TaskGroup ) + +end + +--- Report the task status. +-- @param #TASK self +function TASK:MenuTaskAbort( TaskGroup ) + + self:Abort() +end + + + +--- Returns the @{Task} name. +-- @param #TASK self +-- @return #string TaskName +function TASK:GetTaskName() + return self.TaskName +end + + + + +--- Get the default or currently assigned @{Process} template with key ProcessName. +-- @param #TASK self +-- @param #string ProcessName +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetProcessTemplate( ProcessName ) + + local ProcessTemplate = self.ProcessClasses[ProcessName] + + return ProcessTemplate +end + + + +-- TODO: Obscolete? +--- Fail processes from @{Task} with key @{Unit} +-- @param #TASK self +-- @param #string TaskUnitName +-- @return #TASK self +function TASK:FailProcesses( TaskUnitName ) + + for ProcessID, ProcessData in pairs( self.Processes[TaskUnitName] ) do + local Process = ProcessData + Process.Fsm:Fail() + end +end + +--- Add a FiniteStateMachine to @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @param Core.Fsm#FSM_PROCESS Fsm +-- @return #TASK self +function TASK:SetStateMachine( TaskUnit, Fsm ) + self:F2( { TaskUnit, self.Fsm[TaskUnit] ~= nil, Fsm:GetClassNameAndID() } ) + + self.Fsm[TaskUnit] = Fsm + + return Fsm +end + +--- Gets the FiniteStateMachine of @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return Core.Fsm#FSM_PROCESS +function TASK:GetStateMachine( TaskUnit ) + self:F2( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + return self.Fsm[TaskUnit] +end + +--- Remove FiniteStateMachines from @{Task} with key Task@{Unit} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:RemoveStateMachine( TaskUnit ) + self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + self:E( self.Fsm ) + for TaskUnitT, Fsm in pairs( self.Fsm ) do + self:E( TaskUnitT ) + end + + self.Fsm[TaskUnit] = nil + + collectgarbage() + self:E( "Garbage Collected, Processes should be finalized now ...") +end + +--- Checks if there is a FiniteStateMachine assigned to Task@{Unit} for @{Task} +-- @param #TASK self +-- @param Wrapper.Unit#UNIT TaskUnit +-- @return #TASK self +function TASK:HasStateMachine( TaskUnit ) + self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) + + return ( self.Fsm[TaskUnit] ~= nil ) +end + + +--- Gets the Scoring of the task +-- @param #TASK self +-- @return Functional.Scoring#SCORING Scoring +function TASK:GetScoring() + return self.Mission:GetScoring() +end + + +--- Gets the Task Index, which is a combination of the Task type, the Task name. +-- @param #TASK self +-- @return #string The Task ID +function TASK:GetTaskIndex() + + local TaskType = self:GetType() + local TaskName = self:GetName() + + return TaskType .. "." .. TaskName +end + +--- Sets the Name of the Task +-- @param #TASK self +-- @param #string TaskName +function TASK:SetName( TaskName ) + self.TaskName = TaskName +end + +--- Gets the Name of the Task +-- @param #TASK self +-- @return #string The Task Name +function TASK:GetName() + return self.TaskName +end + +--- Sets the Type of the Task +-- @param #TASK self +-- @param #string TaskType +function TASK:SetType( TaskType ) + self.TaskType = TaskType +end + +--- Gets the Type of the Task +-- @param #TASK self +-- @return #string TaskType +function TASK:GetType() + return self.TaskType +end + +--- Sets the ID of the Task +-- @param #TASK self +-- @param #string TaskID +function TASK:SetID( TaskID ) + self.TaskID = TaskID +end + +--- Gets the ID of the Task +-- @param #TASK self +-- @return #string TaskID +function TASK:GetID() + return self.TaskID +end + + +--- Sets a @{Task} to status **Success**. +-- @param #TASK self +function TASK:StateSuccess() + self:SetState( self, "State", "Success" ) + return self +end + +--- Is the @{Task} status **Success**. +-- @param #TASK self +function TASK:IsStateSuccess() + return self:Is( "Success" ) +end + +--- Sets a @{Task} to status **Failed**. +-- @param #TASK self +function TASK:StateFailed() + self:SetState( self, "State", "Failed" ) + return self +end + +--- Is the @{Task} status **Failed**. +-- @param #TASK self +function TASK:IsStateFailed() + return self:Is( "Failed" ) +end + +--- Sets a @{Task} to status **Planned**. +-- @param #TASK self +function TASK:StatePlanned() + self:SetState( self, "State", "Planned" ) + return self +end + +--- Is the @{Task} status **Planned**. +-- @param #TASK self +function TASK:IsStatePlanned() + return self:Is( "Planned" ) +end + +--- Sets a @{Task} to status **Aborted**. +-- @param #TASK self +function TASK:StateAborted() + self:SetState( self, "State", "Aborted" ) + return self +end + +--- Is the @{Task} status **Aborted**. +-- @param #TASK self +function TASK:IsStateAborted() + return self:Is( "Aborted" ) +end + +--- Sets a @{Task} to status **Cancelled**. +-- @param #TASK self +function TASK:StateCancelled() + self:SetState( self, "State", "Cancelled" ) + return self +end + +--- Is the @{Task} status **Cancelled**. +-- @param #TASK self +function TASK:IsStateCancelled() + return self:Is( "Cancelled" ) +end + +--- Sets a @{Task} to status **Assigned**. +-- @param #TASK self +function TASK:StateAssigned() + self:SetState( self, "State", "Assigned" ) + return self +end + +--- Is the @{Task} status **Assigned**. +-- @param #TASK self +function TASK:IsStateAssigned() + return self:Is( "Assigned" ) +end + +--- Sets a @{Task} to status **Hold**. +-- @param #TASK self +function TASK:StateHold() + self:SetState( self, "State", "Hold" ) + return self +end + +--- Is the @{Task} status **Hold**. +-- @param #TASK self +function TASK:IsStateHold() + return self:Is( "Hold" ) +end + +--- Sets a @{Task} to status **Replanned**. +-- @param #TASK self +function TASK:StateReplanned() + self:SetState( self, "State", "Replanned" ) + return self +end + +--- Is the @{Task} status **Replanned**. +-- @param #TASK self +function TASK:IsStateReplanned() + return self:Is( "Replanned" ) +end + +--- Gets the @{Task} status. +-- @param #TASK self +function TASK:GetStateString() + return self:GetState( self, "State" ) +end + +--- Sets a @{Task} briefing. +-- @param #TASK self +-- @param #string TaskBriefing +-- @return #TASK self +function TASK:SetBriefing( TaskBriefing ) + self.TaskBriefing = TaskBriefing + return self +end + + + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterAssigned( From, Event, To, PlayerUnit, PlayerName ) + + self:E( { "Task Assigned", self.Dispatcher } ) + + self:MessageToGroups( "Task " .. self:GetName() .. " has been assigned to your group." ) + + if self.Dispatcher then + self:E( "Firing Assign event " ) + self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + end + + self:GetMission():__Start( 1 ) +end + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterSuccess( From, Event, To ) + + self:E( "Task Success" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " is successful! Good job!" ) + self:UnAssignFromGroups() + + self:GetMission():__Complete( 1 ) + +end + + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onenterAborted( From, Event, To ) + + self:E( "Task Aborted" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) + + self:UnAssignFromGroups() + + self:__Replan( 5 ) +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onafterReplan( From, Event, To ) + + self:E( "Task Replanned" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Replanning Task " .. self:GetName() .. "." ) + + self:SetMenu() + +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string From +-- @param #string Event +-- @param #string To +function TASK:onenterFailed( From, Event, To ) + + self:E( "Task Failed" ) + + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has failed!" ) + + self:UnAssignFromGroups() +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onstatechange( From, Event, To ) + + if self:IsTrace() then + MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + end + + if self.Scores[To] then + local Scoring = self:GetScoring() + if Scoring then + self:E( { self.Scores[To].ScoreText, self.Scores[To].Score } ) + Scoring:_AddMissionScore( self.Mission, self.Scores[To].ScoreText, self.Scores[To].Score ) + end + end + +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onenterPlanned( From, Event, To) + if not self.TimeOut == 0 then + self.__TimeOut( self.TimeOut ) + end +end + +--- FSM function for a TASK +-- @param #TASK self +-- @param #string Event +-- @param #string From +-- @param #string To +function TASK:onbeforeTimeOut( From, Event, To ) + if From == "Planned" then + self:RemoveMenu() + return true + end + return false +end + +do -- Dispatcher + + --- Set dispatcher of a task + -- @param #TASK self + -- @param Tasking.DetectionManager#DETECTION_MANAGER Dispatcher + -- @return #TASK + function TASK:SetDispatcher( Dispatcher ) + self.Dispatcher = Dispatcher + end + +end + +do -- Reporting + +--- Create a summary report of the Task. +-- List the Task Name and Status +-- @param #TASK self +-- @return #string +function TASK:ReportSummary() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + Report:Add( "Task " .. Name .. " - State '" .. State ) + + return Report:Text() +end + + +--- Create a detailed report of the Task. +-- List the Task Status, and the Players assigned to the Task. +-- @param #TASK self +-- @return #string +function TASK:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + -- Loop each Unit active in the Task, and find Player Names. + local PlayerNames = {} + local PlayerReport = REPORT:New( " - Players:" ) + for PlayerGroupID, PlayerGroupData in pairs( self:GetGroups():GetSet() ) do + local PlayerGroup = PlayerGroupData -- Wrapper.Group#GROUP + PlayerNames = PlayerGroup:GetPlayerNames() + if PlayerNames then + PlayerReport:Add( " -- Group " .. PlayerGroup:GetCallsign() .. ": " .. table.concat( PlayerNames, ", " ) ) + end + end + + -- Loop each Process in the Task, and find Reporting Details. + Report:Add( string.format( " - Task %s\n -- State '%s'\n%s", Name, State, PlayerReport:Text() ) ) + return Report:Text() +end + + +end -- Reporting +--- This module contains the DETECTION_MANAGER class and derived classes. +-- +-- === +-- +-- 1) @{DetectionManager#DETECTION_MANAGER} class, extends @{Fsm#FSM} +-- ==================================================================== +-- The @{DetectionManager#DETECTION_MANAGER} class defines the core functions to report detected objects to groups. +-- Reportings can be done in several manners, and it is up to the derived classes if DETECTION_MANAGER to model the reporting behaviour. +-- +-- 1.1) DETECTION_MANAGER constructor: +-- ----------------------------------- +-- * @{DetectionManager#DETECTION_MANAGER.New}(): Create a new DETECTION_MANAGER instance. +-- +-- 1.2) DETECTION_MANAGER reporting: +-- --------------------------------- +-- Derived DETECTION_MANAGER classes will reports detected units using the method @{DetectionManager#DETECTION_MANAGER.ReportDetected}(). This method implements polymorphic behaviour. +-- +-- The time interval in seconds of the reporting can be changed using the methods @{DetectionManager#DETECTION_MANAGER.SetReportInterval}(). +-- To control how long a reporting message is displayed, use @{DetectionManager#DETECTION_MANAGER.SetReportDisplayTime}(). +-- Derived classes need to implement the method @{DetectionManager#DETECTION_MANAGER.GetReportDisplayTime}() to use the correct display time for displayed messages during a report. +-- +-- Reporting can be started and stopped using the methods @{DetectionManager#DETECTION_MANAGER.StartReporting}() and @{DetectionManager#DETECTION_MANAGER.StopReporting}() respectively. +-- If an ad-hoc report is requested, use the method @{DetectionManager#DETECTION_MANAGER#ReportNow}(). +-- +-- The default reporting interval is every 60 seconds. The reporting messages are displayed 15 seconds. +-- +-- === +-- +-- 2) @{DetectionManager#DETECTION_REPORTING} class, extends @{DetectionManager#DETECTION_MANAGER} +-- ========================================================================================= +-- The @{DetectionManager#DETECTION_REPORTING} class implements detected units reporting. Reporting can be controlled using the reporting methods available in the @{DetectionManager#DETECTION_MANAGER} class. +-- +-- 2.1) DETECTION_REPORTING constructor: +-- ------------------------------- +-- The @{DetectionManager#DETECTION_REPORTING.New}() method creates a new DETECTION_REPORTING instance. +-- +-- +-- === +-- +-- ### Contributions: Mechanist, Prof_Hilactic, FlightControl - Concept & Testing +-- ### Author: FlightControl - Framework Design & Programming +-- +-- @module DetectionManager + +do -- DETECTION MANAGER + + --- DETECTION_MANAGER class. + -- @type DETECTION_MANAGER + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @extends Core.Fsm#FSM + DETECTION_MANAGER = { + ClassName = "DETECTION_MANAGER", + SetGroup = nil, + Detection = nil, + } + + --- FAC constructor. + -- @param #DETECTION_MANAGER self + -- @param Set#SET_GROUP SetGroup + -- @param Functional.Detection#DETECTION_BASE Detection + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:New( SetGroup, Detection ) + + -- Inherits from BASE + local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_MANAGER + + self.SetGroup = SetGroup + self.Detection = Detection + + self:SetStartState( "Stopped" ) + self:AddTransition( "Stopped", "Start", "Started" ) + self:AddTransition( "Started", "Stop", "Stopped" ) + self:AddTransition( "Started", "Report", "Started" ) + + self:SetReportInterval( 30 ) + self:SetReportDisplayTime( 25 ) + + Detection:__Start( 1 ) + + return self + end + + function DETECTION_MANAGER:onafterStart( From, Event, To ) + self:Report() + end + + function DETECTION_MANAGER:onafterReport( From, Event, To ) + + self:E( "onafterReport" ) + + self:__Report( -self._ReportInterval ) + + self:ProcessDetected( self.Detection ) + end + + --- Set the reporting time interval. + -- @param #DETECTION_MANAGER self + -- @param #number ReportInterval The interval in seconds when a report needs to be done. + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:SetReportInterval( ReportInterval ) + self:F2() + + self._ReportInterval = ReportInterval + end + + + --- Set the reporting message display time. + -- @param #DETECTION_MANAGER self + -- @param #number ReportDisplayTime The display time in seconds when a report needs to be done. + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:SetReportDisplayTime( ReportDisplayTime ) + self:F2() + + self._ReportDisplayTime = ReportDisplayTime + end + + --- Get the reporting message display time. + -- @param #DETECTION_MANAGER self + -- @return #number ReportDisplayTime The display time in seconds when a report needs to be done. + function DETECTION_MANAGER:GetReportDisplayTime() + self:F2() + + return self._ReportDisplayTime + end + + --- Reports the detected items to the @{Set#SET_GROUP}. + -- @param #DETECTION_MANAGER self + -- @param Functional.Detection#DETECTION_BASE Detection + -- @return #DETECTION_MANAGER self + function DETECTION_MANAGER:ProcessDetected( Detection ) + self:E() + + end + +end + + +do -- DETECTION_REPORTING + + --- DETECTION_REPORTING class. + -- @type DETECTION_REPORTING + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @extends #DETECTION_MANAGER + DETECTION_REPORTING = { + ClassName = "DETECTION_REPORTING", + } + + + --- DETECTION_REPORTING constructor. + -- @param #DETECTION_REPORTING self + -- @param Set#SET_GROUP SetGroup + -- @param Functional.Detection#DETECTION_AREAS Detection + -- @return #DETECTION_REPORTING self + function DETECTION_REPORTING:New( SetGroup, Detection ) + + -- Inherits from DETECTION_MANAGER + local self = BASE:Inherit( self, DETECTION_MANAGER:New( SetGroup, Detection ) ) -- #DETECTION_REPORTING + + self:Schedule( 1, 30 ) + return self + end + + --- Creates a string of the detected items in a @{Detection}. + -- @param #DETECTION_MANAGER self + -- @param Set#SET_UNIT DetectedSet The detected Set created by the @{Detection#DETECTION_BASE} object. + -- @return #DETECTION_MANAGER self + function DETECTION_REPORTING:GetDetectedItemsText( DetectedSet ) + self:F2() + + local MT = {} -- Message Text + local UnitTypes = {} + + for DetectedUnitID, DetectedUnitData in pairs( DetectedSet:GetSet() ) do + local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT + if DetectedUnit:IsAlive() then + local UnitType = DetectedUnit:GetTypeName() + + if not UnitTypes[UnitType] then + UnitTypes[UnitType] = 1 + else + UnitTypes[UnitType] = UnitTypes[UnitType] + 1 + end + end + end + + for UnitTypeID, UnitType in pairs( UnitTypes ) do + MT[#MT+1] = UnitType .. " of " .. UnitTypeID + end + + return table.concat( MT, ", " ) + end + + + + --- Reports the detected items to the @{Set#SET_GROUP}. + -- @param #DETECTION_REPORTING self + -- @param Wrapper.Group#GROUP Group The @{Group} object to where the report needs to go. + -- @param Functional.Detection#DETECTION_AREAS Detection The detection created by the @{Detection#DETECTION_BASE} object. + -- @return #boolean Return true if you want the reporting to continue... false will cancel the reporting loop. + function DETECTION_REPORTING:ProcessDetected( Group, Detection ) + self:F2( Group ) + + self:E( Group ) + local DetectedMsg = {} + for DetectedAreaID, DetectedAreaData in pairs( Detection:GetDetectedAreas() ) do + local DetectedArea = DetectedAreaData -- Functional.Detection#DETECTION_AREAS.DetectedArea + DetectedMsg[#DetectedMsg+1] = " - Group #" .. DetectedAreaID .. ": " .. self:GetDetectedItemsText( DetectedArea.Set ) + end + local FACGroup = Detection:GetDetectionGroups() + FACGroup:MessageToGroup( "Reporting detected target groups:\n" .. table.concat( DetectedMsg, "\n" ), self:GetReportDisplayTime(), Group ) + + return true + end + +end + +--- **Tasking** - The TASK_A2G_DISPATCHER creates and manages player TASK_A2G tasks based on detected targets. +-- +-- === +-- +-- # 1) @{#TASK_A2G_DISPATCHER} class, extends @{#DETECTION_MANAGER} +-- +-- The @{#TASK_A2G_DISPATCHER} class implements the dynamic dispatching of tasks upon groups of detected units determined a @{Set} of FAC (groups). +-- The FAC will detect units, will group them, and will dispatch @{Task}s to groups. Depending on the type of target detected, different tasks will be dispatched. +-- Find a summary below describing for which situation a task type is created: +-- +-- * **CAS Task**: Is created when there are enemy ground units within range of the FAC, while there are friendly units in the FAC perimeter. +-- * **BAI Task**: Is created when there are enemy ground units within range of the FAC, while there are NO other friendly units within the FAC perimeter. +-- * **SEAD Task**: Is created when there are enemy ground units wihtin range of the FAC, with air search radars. +-- +-- Other task types will follow... +-- +-- 3.1) TASK_A2G_DISPATCHER constructor: +-- -------------------------------------- +-- The @{#TASK_A2G_DISPATCHER.New}() method creates a new TASK_A2G_DISPATCHER instance. +-- +-- === +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-09: Initial class and API. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Task_A2G_Dispatcher + +do -- TASK_A2G_DISPATCHER + + --- TASK_A2G_DISPATCHER class. + -- @type TASK_A2G_DISPATCHER + -- @field Set#SET_GROUP SetGroup The groups to which the FAC will report to. + -- @field Functional.Detection#DETECTION_BASE Detection The DETECTION_BASE object that is used to report the detected objects. + -- @field Tasking.Mission#MISSION Mission + -- @extends Tasking.DetectionManager#DETECTION_MANAGER + TASK_A2G_DISPATCHER = { + ClassName = "TASK_A2G_DISPATCHER", + Mission = nil, + Detection = nil, + } + + + --- TASK_A2G_DISPATCHER constructor. + -- @param #TASK_A2G_DISPATCHER self + -- @param Tasking.Mission#MISSION The mission for which the task dispatching is done. + -- @param Set#SET_GROUP SetGroup The set of groups that can join the tasks within the mission. + -- @param Functional.Detection#DETECTION_BASE Detection The detection results that are used to dynamically assign new tasks to human players. + -- @return #TASK_A2G_DISPATCHER self + function TASK_A2G_DISPATCHER:New( Mission, SetGroup, Detection ) + + -- Inherits from DETECTION_MANAGER + local self = BASE:Inherit( self, DETECTION_MANAGER:New( SetGroup, Detection ) ) -- #TASK_A2G_DISPATCHER + + self.Detection = Detection + self.Mission = Mission + + self:AddTransition( "Started", "Assign", "Started" ) + + --- OnAfter Transition Handler for Event Assign. + -- @function [parent=#TASK_A2G_DISPATCHER] OnAfterAssign + -- @param #TASK_A2G_DISPATCHER self + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @param Tasking.Task_A2G#TASK_A2G Task + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param #string PlayerName + + self:__Start( 5 ) + + return self + end + + + --- Creates a SEAD task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Set#SET_UNIT TargetSetUnit: The target set of units. + -- @return #nil If there are no targets to be set. + function TASK_A2G_DISPATCHER:EvaluateSEAD( DetectedItem ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local RadarCount = DetectedSet:HasSEAD() + + if RadarCount > 0 then + + -- Here we're doing something advanced... We're copying the DetectedSet, but making a new Set only with SEADable Radar units in it. + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterHasSEAD() + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Creates a CAS task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateCAS( DetectedItem ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local GroundUnitCount = DetectedSet:HasGroundUnits() + local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem ) + + if GroundUnitCount > 0 and FriendliesNearBy == true then + + -- Copy the Set + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Creates a BAI task when there are targets for it. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateBAI( DetectedItem, FriendlyCoalition ) + self:F( { DetectedItem.ItemID } ) + + local DetectedSet = DetectedItem.Set + local DetectedZone = DetectedItem.Zone + + + -- Determine if the set has radar targets. If it does, construct a SEAD task. + local GroundUnitCount = DetectedSet:HasGroundUnits() + local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem ) + + if GroundUnitCount > 0 and FriendliesNearBy == false then + + -- Copy the Set + local TargetSetUnit = SET_UNIT:New() + TargetSetUnit:SetDatabase( DetectedSet ) + TargetSetUnit:FilterOnce() -- Filter but don't do any events!!! Elements are added manually upon each detection. + + return TargetSetUnit + end + + return nil + end + + --- Evaluates the removal of the Task from the Mission. + -- Can only occur when the DetectedItem is Changed AND the state of the Task is "Planned". + -- @param #TASK_A2G_DISPATCHER self + -- @param Tasking.Mission#MISSION Mission + -- @param Tasking.Task#TASK Task + -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @return Tasking.Task#TASK + function TASK_A2G_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedItem ) + + if Task then + if Task:IsStatePlanned() and DetectedItem.Changed == true then + self:E( "Removing Tasking: " .. Task:GetTaskName() ) + Task = Mission:RemoveTask( Task ) + end + end + + return Task + end + + + --- Assigns tasks in relation to the detected items to the @{Set#SET_GROUP}. + -- @param #TASK_A2G_DISPATCHER self + -- @param Functional.Detection#DETECTION_BASE Detection The detection created by the @{Detection#DETECTION_BASE} derived object. + -- @return #boolean Return true if you want the task assigning to continue... false will cancel the loop. + function TASK_A2G_DISPATCHER:ProcessDetected( Detection ) + self:E() + + local AreaMsg = {} + local TaskMsg = {} + local ChangeMsg = {} + + local Mission = self.Mission + local ReportSEAD = REPORT:New( "- SEAD Tasks:") + local ReportCAS = REPORT:New( "- CAS Tasks:") + local ReportBAI = REPORT:New( "- BAI Tasks:") + local ReportChanges = REPORT:New( " - Changes:" ) + + --- First we need to the detected targets. + for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do + + local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet + local DetectedZone = DetectedItem.Zone + self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) + DetectedSet:Flush() + + local ItemID = DetectedItem.ItemID + + -- Evaluate SEAD Tasking + local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) + SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) + if not SEADTask then + local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + SEADTask = Mission:AddTask( Task ) + end + end + if SEADTask and SEADTask:IsStatePlanned() then + ReportSEAD:Add( string.format( " - %s.%02d - %s", "SEAD", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + -- Evaluate CAS Tasking + local CASTask = Mission:GetTask( string.format( "CAS.%03d", ItemID ) ) + CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem ) + if not CASTask then + local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + CASTask = Mission:AddTask( Task ) + end + end + if CASTask and CASTask:IsStatePlanned() then + ReportCAS:Add( string.format( " - %s.%02d - %s", "CAS", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + -- Evaluate BAI Tasking + local BAITask = Mission:GetTask( string.format( "BAI.%03d", ItemID ) ) + BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem ) + if not BAITask then + local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + BAITask = Mission:AddTask( Task ) + end + end + if BAITask and BAITask:IsStatePlanned() then + ReportBAI:Add( string.format( " - %s.%02d - %s", "BAI", ItemID, Detection:DetectedItemReportSummary(DetectedItemID) ) ) + end + + + -- Loop through the changes ... + local ChangeText = Detection:GetChangeText( DetectedItem ) + ReportChanges:Add( ChangeText ) + + + -- OK, so the tasking has been done, now delete the changes reported for the area. + Detection:AcceptChanges( DetectedItem ) + + end + + -- TODO set menus using the HQ coordinator + Mission:GetCommandCenter():SetMenu() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + if not TaskGroup:GetState( TaskGroup, "Assigned" ) then + Mission:GetCommandCenter():MessageToGroup( + string.format( "HQ Reporting - Planned tasks for mission '%s':\n%s\n", + self.Mission:GetName(), + string.format( "%s\n\n%s\n\n%s\n\n%s", ReportSEAD:Text(), ReportCAS:Text(), ReportBAI:Text(), ReportChanges:Text() + ) + ), TaskGroup + ) + end + end + + return true + end + +end--- **Tasking** - The TASK_A2G models tasks for players in Air to Ground engagements. +-- +-- ![Banner Image](..\Presentations\TASK_A2G\Dia1.JPG) +-- +-- +-- # 1) @{Task_A2G#TASK_A2G} class, extends @{Task#TASK} +-- +-- The @{#TASK_A2G} class defines Air To Ground tasks for a @{Set} of Target Units, +-- based on the tasking capabilities defined in @{Task#TASK}. +-- The TASK_A2G is implemented using a @{Statemachine#FSM_TASK}, and has the following statuses: +-- +-- * **None**: Start of the process +-- * **Planned**: The A2G task is planned. +-- * **Assigned**: The A2G task is assigned to a @{Group#GROUP}. +-- * **Success**: The A2G task is successfully completed. +-- * **Failed**: The A2G task has failed. This will happen if the player exists the task early, without communicating a possible cancellation to HQ. +-- +-- # 1.1) Set the scoring of achievements in an A2G attack. +-- +-- Scoring or penalties can be given in the following circumstances: +-- +-- * @{#TASK_A2G.SetScoreOnDestroy}(): Set a score when a target in scope of the A2G attack, has been destroyed. +-- * @{#TASK_A2G.SetScoreOnSuccess}(): Set a score when all the targets in scope of the A2G attack, have been destroyed. +-- * @{#TASK_A2G.SetPenaltyOnFailed}(): Set a penalty when the A2G attack has failed. +-- +-- # 2) @{Task_A2G#TASK_SEAD} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_SEAD} class defines a SEAD task for a @{Set} of Target Units. +-- +-- === +-- +-- # 3) @{Task_A2G#TASK_CAS} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_CAS} class defines a CAS task for a @{Set} of Target Units. +-- +-- === +-- +-- # 4) @{Task_A2G#TASK_BAI} class, extends @{Task_A2G#TASK_A2G} +-- +-- The @{#TASK_BAI} class defines a BAI task for a @{Set} of Target Units. +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2017-03-09: Revised version. +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- * **[WingThor]**: Concept, Advice & Testing. +-- +-- ### Authors: +-- +-- * **FlightControl**: Concept, Design & Programming. +-- +-- @module Task_A2G + +do -- TASK_A2G + + --- The TASK_A2G class + -- @type TASK_A2G + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_A2G = { + ClassName = "TASK_A2G", + } + + --- Instantiates a new TASK_A2G. + -- @param #TASK_A2G self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_A2G self + function TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskType ) + local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType ) ) -- Tasking.Task#TASK_A2G + self:F() + + self.TargetSetUnit = TargetSetUnit + self.TaskType = TaskType + + Mission:AddTask( self ) + + local Fsm = self:GetUnitProcess() + + + Fsm:AddProcess ( "Planned", "Accept", ACT_ASSIGN_ACCEPT:New( self.TaskBriefing ), { Assigned = "RouteToRendezVous", Rejected = "Reject" } ) + + Fsm:AddTransition( "Assigned", "RouteToRendezVous", "RoutingToRendezVous" ) + Fsm:AddProcess ( "RoutingToRendezVous", "RouteToRendezVousPoint", ACT_ROUTE_POINT:New(), { Arrived = "ArriveAtRendezVous" } ) + Fsm:AddProcess ( "RoutingToRendezVous", "RouteToRendezVousZone", ACT_ROUTE_ZONE:New(), { Arrived = "ArriveAtRendezVous" } ) + + Fsm:AddTransition( { "Arrived", "RoutingToRendezVous" }, "ArriveAtRendezVous", "ArrivedAtRendezVous" ) + + Fsm:AddTransition( { "ArrivedAtRendezVous", "HoldingAtRendezVous" }, "Engage", "Engaging" ) + Fsm:AddTransition( { "ArrivedAtRendezVous", "HoldingAtRendezVous" }, "HoldAtRendezVous", "HoldingAtRendezVous" ) + + Fsm:AddProcess ( "Engaging", "Account", ACT_ACCOUNT_DEADS:New( self.TargetSetUnit, self.TaskType ), { Accounted = "Success" } ) + Fsm:AddTransition( "Engaging", "RouteToTarget", "Engaging" ) + Fsm:AddProcess( "Engaging", "RouteToTargetZone", ACT_ROUTE_ZONE:New(), {} ) + Fsm:AddProcess( "Engaging", "RouteToTargetPoint", ACT_ROUTE_POINT:New(), {} ) + Fsm:AddTransition( "Engaging", "RouteToTargets", "Engaging" ) + + Fsm:AddTransition( "Accounted", "DestroyedAll", "Accounted" ) + Fsm:AddTransition( "Accounted", "Success", "Success" ) + Fsm:AddTransition( "Rejected", "Reject", "Aborted" ) + Fsm:AddTransition( "Failed", "Fail", "Failed" ) + + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToRendezVous( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.RendezVousSetUnit + + if Task:GetRendezVousZone( TaskUnit ) then + self:__RouteToRendezVousZone( 0.1 ) + else + if Task:GetRendezVousPointVec2( TaskUnit ) then + self:__RouteToRendezVousPoint( 0.1 ) + else + self:__ArriveAtRendezVous( 0.1 ) + end + end + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task#TASK_A2G Task + function Fsm:OnAfterArriveAtRendezVous( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.TargetSetUnit + + self:__Engage( 0.1 ) + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task#TASK_A2G Task + function Fsm:onafterEngage( TaskUnit, Task ) + self:E( { self } ) + self:__Account( 0.1 ) + self:__RouteToTarget(0.1 ) + self:__RouteToTargets( -10 ) + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToTarget( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- Determine the first Unit from the self.TargetSetUnit + + if Task:GetTargetZone( TaskUnit ) then + self:__RouteToTargetZone( 0.1 ) + else + local TargetUnit = Task.TargetSetUnit:GetFirst() -- Wrapper.Unit#UNIT + if TargetUnit then + local PointVec2 = TargetUnit:GetPointVec2() + self:T( { TargetPointVec2 = PointVec2, PointVec2:GetX(), PointVec2:GetAlt(), PointVec2:GetZ() } ) + Task:SetTargetPointVec2( TargetUnit:GetPointVec2(), TaskUnit ) + end + self:__RouteToTargetPoint( 0.1 ) + end + end + + --- Test + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_A2G#TASK_A2G Task + function Fsm:onafterRouteToTargets( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + local TargetUnit = Task.TargetSetUnit:GetFirst() -- Wrapper.Unit#UNIT + if TargetUnit then + Task:SetTargetPointVec2( TargetUnit:GetPointVec2(), TaskUnit ) + end + self:__RouteToTargets( -10 ) + end + + return self + + end + + --- @param #TASK_A2G self + function TASK_A2G:GetPlannedMenuText() + return self:GetStateString() .. " - " .. self:GetTaskName() .. " ( " .. self.TargetSetUnit:GetUnitTypesText() .. " )" + end + + --- @param #TASK_A2G self + -- @param Core.Point#POINT_VEC2 RendezVousPointVec2 The PointVec2 object referencing to the 2D point where the RendezVous point is located on the map. + -- @param #number RendezVousRange The RendezVousRange that defines when the player is considered to have arrived at the RendezVous point. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetRendezVousPointVec2( RendezVousPointVec2, RendezVousRange, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + ActRouteRendezVous:SetPointVec2( RendezVousPointVec2 ) + ActRouteRendezVous:SetRange( RendezVousRange ) + end + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Point#POINT_VEC2 The PointVec2 object referencing to the 2D point where the RendezVous point is located on the map. + -- @return #number The RendezVousRange that defines when the player is considered to have arrived at the RendezVous point. + function TASK_A2G:GetRendezVousPointVec2( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + return ActRouteRendezVous:GetPointVec2(), ActRouteRendezVous:GetRange() + end + + + + --- @param #TASK_A2G self + -- @param Core.Zone#ZONE_BASE RendezVousZone The Zone object where the RendezVous is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetRendezVousZone( RendezVousZone, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + ActRouteRendezVous:SetZone( RendezVousZone ) + end + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Zone#ZONE_BASE The Zone object where the RendezVous is located on the map. + function TASK_A2G:GetRendezVousZone( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteRendezVous = ProcessUnit:GetProcess( "RoutingToRendezVous", "RouteToRendezVousZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + return ActRouteRendezVous:GetZone() + end + + --- @param #TASK_A2G self + -- @param Core.Point#POINT_VEC2 TargetPointVec2 The PointVec2 object where the Target is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetTargetPointVec2( TargetPointVec2, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + ActRouteTarget:SetPointVec2( TargetPointVec2 ) + end + + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Point#POINT_VEC2 The PointVec2 object where the Target is located on the map. + function TASK_A2G:GetTargetPointVec2( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT + return ActRouteTarget:GetPointVec2() + end + + + --- @param #TASK_A2G self + -- @param Core.Zone#ZONE_BASE TargetZone The Zone object where the Target is located on the map. + -- @param Wrapper.Unit#UNIT TaskUnit + function TASK_A2G:SetTargetZone( TargetZone, TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + ActRouteTarget:SetZone( TargetZone ) + end + + + --- @param #TASK_A2G self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return Core.Zone#ZONE_BASE The Zone object where the Target is located on the map. + function TASK_A2G:GetTargetZone( TaskUnit ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + return ActRouteTarget:GetZone() + end + + --- Set a score when a target in scope of the A2G attack, has been destroyed . + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when the target has been destroyed. + -- @param #number Score The score in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetScoreOnDestroy( Text, Score, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScoreProcess( "Engaging", "Account", "Account", Text, Score ) + + return self + end + + --- Set a score when all the targets in scope of the A2G attack, have been destroyed. + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when all targets hav been destroyed. + -- @param #number Score The score in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetScoreOnSuccess( Text, Score, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScore( "Success", Text, Score ) + + return self + end + + --- Set a penalty when the A2G attack has failed. + -- @param #TASK_A2G self + -- @param #string Text The text to display to the player, when the A2G attack has failed. + -- @param #number Penalty The penalty in points. + -- @param Wrapper.Unit#UNIT TaskUnit + -- @return #TASK_A2G + function TASK_A2G:SetPenaltyOnFailed( Text, Penalty, TaskUnit ) + self:F( { Text, Score, TaskUnit } ) + + local ProcessUnit = self:GetUnitProcess( TaskUnit ) + + ProcessUnit:AddScore( "Failed", Text, Penalty ) + + return self + end + + +end + + +do -- TASK_SEAD + + --- The TASK_SEAD class + -- @type TASK_SEAD + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_SEAD = { + ClassName = "TASK_SEAD", + } + + --- Instantiates a new TASK_SEAD. + -- @param #TASK_SEAD self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_SEAD self + function TASK_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD" ) ) -- #TASK_SEAD + self:F() + + return self + end + +end + +do -- TASK_BAI + + --- The TASK_BAI class + -- @type TASK_BAI + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_BAI = { + ClassName = "TASK_BAI", + } + + --- Instantiates a new TASK_BAI. + -- @param #TASK_BAI self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_BAI self + function TASK_BAI:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "BAI" ) ) -- #TASK_BAI + self:F() + + return self + end + +end + +do -- TASK_CAS + + --- The TASK_CAS class + -- @type TASK_CAS + -- @field Set#SET_UNIT TargetSetUnit + -- @extends Tasking.Task#TASK + TASK_CAS = { + ClassName = "TASK_CAS", + } + + --- Instantiates a new TASK_CAS. + -- @param #TASK_CAS self + -- @param Tasking.Mission#MISSION Mission + -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param #string TaskName The name of the Task. + -- @param Set#SET_UNIT UnitSetTargets + -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. + -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. + -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @return #TASK_CAS self + function TASK_CAS:New( Mission, SetGroup, TaskName, TargetSetUnit ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "CAS" ) ) -- #TASK_CAS + self:F() + + return self + end + +end +--- The main include file for the MOOSE system. +-- Test of permissions + +--- Core Routines +Include.File( "Utilities/Routines" ) +Include.File( "Utilities/Utils" ) + +--- Core Classes +Include.File( "Core/Base" ) +Include.File( "Core/Scheduler" ) +Include.File( "Core/ScheduleDispatcher") +Include.File( "Core/Event" ) +Include.File( "Core/Menu" ) +Include.File( "Core/Zone" ) +Include.File( "Core/Database" ) +Include.File( "Core/Set" ) +Include.File( "Core/Point" ) +Include.File( "Core/Message" ) +Include.File( "Core/Fsm" ) + +--- Wrapper Classes +Include.File( "Wrapper/Object" ) +Include.File( "Wrapper/Identifiable" ) +Include.File( "Wrapper/Positionable" ) +Include.File( "Wrapper/Controllable" ) +Include.File( "Wrapper/Group" ) +Include.File( "Wrapper/Unit" ) +Include.File( "Wrapper/Client" ) +Include.File( "Wrapper/Static" ) +Include.File( "Wrapper/Airbase" ) +Include.File( "Wrapper/Scenery" ) + +--- Functional Classes +Include.File( "Functional/Scoring" ) +Include.File( "Functional/CleanUp" ) +Include.File( "Functional/Spawn" ) +Include.File( "Functional/Movement" ) +Include.File( "Functional/Sead" ) +Include.File( "Functional/Escort" ) +Include.File( "Functional/MissileTrainer" ) +Include.File( "Functional/AirbasePolice" ) +Include.File( "Functional/Detection" ) + +--- AI Classes +Include.File( "AI/AI_Balancer" ) +Include.File( "AI/AI_Patrol" ) +Include.File( "AI/AI_Cap" ) +Include.File( "AI/AI_Cas" ) +Include.File( "AI/AI_Cargo" ) + +--- Actions +Include.File( "Actions/Act_Assign" ) +Include.File( "Actions/Act_Route" ) +Include.File( "Actions/Act_Account" ) +Include.File( "Actions/Act_Assist" ) + +--- Task Handling Classes +Include.File( "Tasking/CommandCenter" ) +Include.File( "Tasking/Mission" ) +Include.File( "Tasking/Task" ) +Include.File( "Tasking/DetectionManager" ) +Include.File( "Tasking/Task_A2G_Dispatcher") +Include.File( "Tasking/Task_A2G" ) + + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT + +--- Declare the timer dispatcher based on the SCHEDULEDISPATCHER class +_SCHEDULEDISPATCHER = SCHEDULEDISPATCHER:New() -- Core.Timer#SCHEDULEDISPATCHER + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + + + + +BASE:TraceOnOff( false ) env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/SCO - Scoring/SCO-100 - Scoring of Statics/SCO-100 - Scoring of Statics.miz b/Moose Test Missions/SCO - Scoring/SCO-100 - Scoring of Statics/SCO-100 - Scoring of Statics.miz index 61d664e891d99db082b17de9c7cac5a410f60500..8dcf03ff6e0b4b537c5cdaadc57d4614c63ca50d 100644 GIT binary patch delta 219854 zcmV(xKM1HdP$@YSP)kv%u*pJvyUChlfyKh#ZXa{z*aLVxJn#ugPfvGGPj}BfiIPh{ zPWowEwBCOEZLxQ7aI`IsjyI2Yo{OFR=eyr;(d*%{z~q+bh}U1U^6aH)9*M7_B+7y! zP7`q)52L&Ye}RX)hRvvjFmJh|{lLf9>_xc9Py;9OC<* zxBAWhG9E;E6^3a2aneIpZ6Ol~-a)ZKB)GD&B7O+6I34FAOUFf=L^(pm=fgA{1F8!Q z#>GXNi7yB7`9;x7lOjt8K!ysLN5yuQrP*GT=fQdOe?@w|odjotC~WtGK^}D!yY1^D z3wnh}`(khB=va%G`wow5MbRd@p$Z?m(P?G_k9r$@)ZHKcgb4t#O^o{V+4C5Dtf-95`-$n zWA1*Ie-6b(QH-9w`|e;Itc-J@;iuX8yI1jx_}%B}XmX5|UMAs(Q8dC-+a}Yq-=kgu zhOxw^K1kCS1c;|f(OJZ44`^5!m*T!CCZkA!#9td?nFuVSQ6z}6ltsljO9Z1J zBm#Scj5fa$PW`o2<$$^%nd`WcWioH}ze|y6qB2FL7JWj&s+7p+-U>w1V7zJ^b z>(YcNiK26zaQP`y2kG%U9--Yg-fX#JL4mydXR0mPKN)B(zacJSR9< z6jZc-j?xV3{~XJ7G=N~z%0Zkg4hHc}bebciTQQO}iFV=jNa5MWQk)GsLI7b!g+eGs zf0012>VpADoxp1jeBpfnq&$(NVCutRloVjy!ytrUk%}xD4T4@I(m{yIAiaQ8MFu%F zODxDzolVx5r53p@Ku`>@mT|J|8yliUWLjinP!yFNq#jJfRhqrX1=<8*Mbs{XR6 z0y%A`vkjGN6`!QkkR6MvN+X$6Icz9Qe}g0eCvPem?}#--Z2j3H7TTsgFiB(1fQ`0n z*B%&q0i}(jL6}2EB^>5;gfmKn6jI`HG9I2qnf7n|fi#wjAB~fb<{_B{p@*toDgO-ImPax-+ZTI;4^37tDB7~fokj8hN0mp1f46un zZfl;hO|7M;Sm62+C-FdsB5_6CsR+6R;vyK0BIp%l*vb2BYEhWVlPC@0JJkm$z>7l0 z=_xgtPRv+YY2t10XQM(@3T&2ke}HtHyujbNfPbVsPwa@_F-8Po7=;k=fSxJ zo|bH?ihh4d=2O3_vV}5PbtdD{l-g5Gp{l@H6{MTaW#Rj75TBX(E{ftB1ETn&hjgtm zjc|a!Y1gr1u&)4zWV$ zt3#4%d8>6mrEz^LZ)n$We>lfLA3AG8sN~jLf3!S76wJ`UsZd=Z75x_JR&<_4j%EYw zep^*b?{BYtwE8Y^yYNS`B3C7L7=&?<%qAuYy$eK}h`|U4#-_*V{+>;ap%y&`0HOE0 zvnYKTMa4X{R{izW_daT(w!e3r?h&F*Yk$w8v%mNDGe_K@W_3i1h3`bC` zZ<4fd=m69r18;Ayf3UhrDwN{92bm10VgHa>)4e8u(EX4CyE8`Q}yzk(rp2TN>fU zg}4fG0h4577}HK*e_)$MK{yeYAcW5jIj_*`ZIm2XNV!3M0wG3r1)Z1(f%2>>|F6p2 zRWeUJaic&JRmjE+>e|0{u}MCxzAyWc5*4ljL73_{4=z6#T}8-&mS~WT~#QAl2pzQ-Bgc z&(EU_W^?l%s_i5QinBH#d7N3-D3S(=scD4%LefPf|HdPN z*NDal`1>72mI&@cC+p%lipYkd>BfD+{zR-QT{<+nsvRaT9*qlv#~?G!%BOwImjc=- zR$7w!L&UPm0G5N;J(wC&O({&S6jxCM{hX_mN()%+e=Z=xd>&3+L%(^drn*~OK$FX} zCiT_Df-yvFGzAfvMWc3Sp>|EnVh};`fOgKF%@n~5SNKu8`6@WJNxxC)XQNS*NeM7`he`%S%Uz1dv; z6r=@1TWZ+Qo=C+QkgP5v-i_3i0m;fURIiQtf6CrdlF<^bO||n|mrLtU^wZ66-Og{T z{`<8w(SyHF;sRWzMB20q#J1|k@VBBHlHpxQwG4z_jeX#&XeeNo!m1K=mP^8PJ#0XV zpu&*##qCHh&D)Hnoq-czK}RMiu}mhDrd_v8jfH*Li>ou&cJ@{qY`lpm+wV1%DWfzqaD@EErwL{@LOgO;TmjVHKe$7~zC1uiQAnYZA7J z;vZ{3SPEH{4+3T-CQ@pkJ4Cdl`@h}*0 z>xNYdTMfnq@PJ(zh;dYdl1DJn79z?h&0}hzgFdwCSWOBW@aT1b)&Yx~=Skd;dqIM| zt@F450gh7m^cG6c8*{WQNY$AFLWGD0!KRWMmK|6%=O$-z61UcvLbKoO;b6 zO`qkSvKEg9UB)it@*OT!?@IZkf1sGgPp&isBY{l0j<9*CxB9lBydo*1uqt@C63DX2 zLSh;}RrKLX0DxH%U>2#assx}lU5X9yfw7w#6CUuMJNsK~G;dszgHAGs<=9*kHr79j*vRK*I~e*lzJZ2kl|8>2{4f93p)=#x-} z9s0vttKG0=&C4sHuHvx3X}ERq4pJt1t84!H+N!`-Cn#Dl)52I7CqD2Uum`dyMx>Ev6CCla|5Q%ZRJu7V{CJWm<_T zJkw-8+0tYY+0w+7&4f}Jf99MhpsHQB9mdI~5|Fc^}8MfYGaQEyK9%UQHfzA7?S#$_`WVfoh)$ zHfQ}YhDoyUnFw%rmeG>X>#w2nnlzdSfmEIYL21)bL9-o@ZD3Lae|TeolTfq?6}r!~ z)CZO^Nyl;z=~a*r#u(D$qT@TnfD9C@2lR+eHm22H7<7>U*j5v}7}pc%ZAke?8Q2)k zzChg$27q!EOmLGv_FPUri*4{8>idNZ# znXScOgfoN`3VQ}Ii6Yp@fQn-4rJRd^dR$HV|> z4zsj-R1GU2sRup6(BC~M(%s#*J7dkloYK(8VD19u0XA#cG!PXtYhcfATba$QB2LfP z3D-K|+Ma9-Q!PUr?vICD1c0rq9K{f=VT2WhxE%^Y!v#3$Aj%+7RS3>BZe!Zloa8LR zc0i4B2pdXte-L>?H*1oX*@UN<(_hsTN+chs$P^peM{YJCO-L4JZ$mWbdn`V$>LbAK zw%Wcl&t5(tB z$$s5HRam=&Y6zVG%U=a;=CF6hlHIGFFqLIZZWt=e6EjQ~|14ke9WZW~mlnkFJWghyu^&N(EGU_l3@vgU&0{5Z&8 zAXkn**bUu_bL^|MJkno~1;bn+kmE<{O==fYe;dwsw27TZ$hYuE{wJ`*Ij%^G-J_G#cd?pE^f%FB9rFkg8Gw9HvD%w&dfbT{OV>X7W zuQDkro-o;+h~l1x_&$&N;{o&;(qY^)N1k{Mc!(W3IxrE1zFVu*o8Z>MK>P7^6#fW` ze=8?kM1z=NRU&-4>Bny?JqMUmz69@#;cOUmvdr7j2qK_8e|9xe&DPb(w@g-gtK+Ev zK`hIbrRi4^CZ$^KlMp#FcL^hiS_KRXu9Ox_iMC;9Ds3)svN}8Y>gX73L#c$)wE3vr zU1ggsl?02Z3gReV^CyfA3tcicX->Xsf7C=IyEK97HMYQJqgIKW>1PkpD{vizsf`qz z4jEzN%xRVeVG9~T2Pz1vxRux)K>8u1>*2IRGO44OOedH$(}Py|F;3>m}HxQpW%Mh47x3;`T* zsTT+IO;o=c;hW4-jm1;q>yO_ebs5xXD~Po8o$^YUprtYv(}Me2K_ekSQAZ6dGS_ z9!e64iRq1;su4VQTAkV^r<$p-_4DJml8Z^JMsdSt-WKQm)zwaYBSn9!ELe`(rlR5u zhA!r+RxUzK-SQjndLK-%xx$JmfkgxSl;BFNvRq$6#sfewf{|n{(}IO3fBh1NYMPjq zcuI*{hMBsl4Mb(Ug<_8#c?iAK)%#C{ocI5aI8QR-bpMYyj}md_4LC0?;?RiqI6b79 zCd}aOISevuMoW$30V*>>SL{%(-DoT-uEL@hz{*Nka(+gk@f&U5R~Tk`$)H&vXJo0; z@fnE7exgEAo3<5}d<8^zf0pfSJyTcC$!jZG3>T`9*)tRly#R|D!$=dgaiI!_K)LoQ zCIm|$uxp=_v<)d-;6{@g#-mJ%I|XX02Z|`02jb+G(Xh};Dj@-><#lBm3&{KDN$a|W2!=0af#sx= z){UERLkYK@HN&CGf43Mr_Drw{9gXms`kQxCjoR z#SBi_YSrMD%5&bOiEiDBH8f$|fZ>^kBUlu3Cd@}$u(HSt?251SC?kLg3ia_oQZbl) zI46ReWK~d6@4jl-h+nylS;y6NTx0LpS;%S3ia}261s*<`e^VAYuN&02+ek&1Q<1GN z>l~`Isn#j-rkS`|50KdP3j&;0SrJf~Y~y^Gvt#IA(~iSYb9-Z|Z*JlzcI`qOdXuRC z>Xx9?|DM_TCWOky3F;0gb2D8qfUwpiR2!gO9+f6LOZZ2DDqS22km+u}UjntoHXcw^ znuiQix|-C#f1GZSunYrd?SeS@0gn1R2Z4GVND5BIkz0<7^m5IRYBfs6*dLTPNu{)L zEE>_9%11UK`&>lP8W+<$j(}B)yQo1~pYx`Qh?jF5leHzQnl8^`;(bZ_q9J&JMe``< zyDMN)v-d(RyZ2yOsn`iUe!%M1i|>5k^k|&*Vc#1vf3sHJ-Eoy9g0eUXB}svuld4(H z%4nAHNyX4z&p|b9TTM^`B}HlNUV3S>@`z@Q?g-wjIwA*}qrZ;g93E0>_t5qN>Xwo$ zrfMpNR`NnxM*UXQ&A+L>ZG%!4f0AZa#>L)nsVhjJ~fCj zf|ZtCe;ZpW3L|xm6h^3q=HAo&TD!fX4D~GxCDpeADj!Sz3Znf(MRaGFxuG>Qf52xw z+%?|6{#s3^tFrB(Gkd=Qh6dJD0v(F^cORHxcmiR?-hA*q0@}`z6A%wKNHOlo+OK-Z zE|bi@^E+BGYdIm8If5I0)&OI5m(lCMogI=PQQI@9t9HJVL zvJQ-3FaXC+^q!%M@wt8Nq(?#--^Di>+|1=!pBOS$Jh4b476YBKHpCDl%Xrl4qQaov z-oC~I$PDjjjeyV-x?67$7X@9il!Bztfl6cSg$-32#?z(qIHq?rk7GoT(sK3W7wLEq%DZVhz9a}e z3fdi2L=YMDq3u;t1PsPvyq`CZFC%kot14V&#;szEMs}S9j8y_W(g{M7c6t77WhAqS zKxGhAX%eq|c(C>qV%u!vRIg_LC)4S4fA|2x+|{$Y%jJKRy72_BO#or}l=GoH_uzoc ziif$dk3lVyCqU@Y7`>``uuC8665;^e`YO(+W}vM=#u|(+9@G}rbsCgJrNQHUO=QYG zU}Fc=P zF2m1cZa!APcYA?IJnI!o&ke!!03j~m2`e+V?Nyy2FqzN6(cQ}&UJT)PUO*T_;rI9a zYR!Lf$Tg3>iRRj$HV_p?Q#u1`V#@6nN^!Vjox(EJ7Bw7ldpKx<-g9i%)FnQ?CeO=v zN`o5AI#DV728pGsTO_i)@}Yc%e~VZ_;b{`YO_^{CO^UcFH=M$AB=)^2Q|?*83>|~c z#~hk(8!_B;&hn{*C3sPCO{!axYYu_5LCD&pA7)C>x@o@2YMu$Yj^-J0#u}qLK&Lnr zIrswx+JA`$-YNDzDL;FF*lwIsraKO)p^h_Z=wmn{bDHIZjP(F+2zi}7f4_%Bg|tTX z$1Px-1kkptGyMUWd;nJ^snh=oj@NHSu<1CEKxtRQG)IF#6g5^e7fSh4dr*XpC7q*# zD>3vcmEj>%)MkI#KLTiVIB7dueih@^yIc!hq^i4PoUAJ9o!qQ`4R`8tG8s7oX0CBI zTv^$!$z4BWgmN994dj5Ge+Ogmf-}NY4mkib_>lNL{ISNPJeZ7sRYr~PIEqYV9 zi*7=B(@n!2IPIp3Bn?%pMLp}(Q6uj*1bCK;CRtUvKC#*Q*VcesX~{*f)8t^iGA`#T zg5flM6#~DZpsNU)Q(BXw_M9L*_`cuRHqA35V^)Z(4I87Xt$NzxnkQ`THR&?Cf6I&u%euS!0F|aDR34@B zKq$T!sXS@J6Vq+DIEl~Up9cjD0Xoh!j%G@;Ir5qSz90Y)n(blsoXkU7!#XEc=WJ%r zyNn)U(q%5o`Qq@OU^$g>p`OXZp=EVQXa=G+dGtV3k3*edFO7QNrEx91!?Zqh@!2Yy z4Quv*^X`Vlf8$XlpN3Zll2b>Lwd282buc)pjs!=KGYlNf9s`aZdH~qq9z*^%9vryW z%V|Y)jS{rJhIx)u{D`O8Th>w=Of^sNGl6vIM!|>q`IjkOBG5|%{L_LBv#ncP%N-{m zPLvby`xm%q9kpO5*;f&Kqb&{qhx`s!StZWq%G&Dlf7b0S&ooaHJ*S3dwm08xVrc%= z5v?`Ahd+7{!MX*6vg!a2uRnl$cmM*U?=*v|w)BYU@O3k}@KP@DoyMSU%+_F8*SZ8c z!L8_W0W_MfcT0NrzLbVVtv{8l^w(qg@b|5K9r!VeWOgUuh^>u+f(5_(S zrAZ73189hLAYpnSnA7XOIDFM!@AjVcc2cYuzVq!YlGhi7sGGV~ zqi6cV;7O?fG-=Y(7tDMT-O18 zf7Al3UtzCj@PY=HbRQF9o=0>;C&EmW@*g8GvS9#I+(HK*;``SHzVQHzbyBzgqq417 z>4o<`f=bLrRh49W`PLV}fp3DseWU)FWCeIMD0Zu#xk@jZ&Kc|Bj;t|j1MkP*wV=o# z&GHn^zroJRP3&g9k(HMtO=VZBxDmHzf5Fi?%<4?iXvl`W|9dXGSb2#*Gsb>qso-97 zpbtOyDcb60%FdM4j|Vocs%jRVUU?baxV!BZxWk$6r!gfYHQzilR5^X^X&uN1uTpLo z@c;DE!*%>9h|LjXc6aX;VqV@dixp}fd9BXk{L%y2tDl2<)nV+3Om?a2c#PQgfB(eU zgM~S(2meIFm=#U#xN>Y!SacED$~yOY@=K0*uYUgR(IQ^sEL?Tw?xjo)zM2^N#o@i&mnb2(=y!#+3& z3lKm+@HD+tEkcs=kxEH+%~8%E2>HXO;1R!#xSsV{74NJgZ~Et)peEwl!LqQbsKOhG zF^*euNs)w$p?izVnwqDrRAUjV9J_{@V$&f2Fo0|R^Oa3m^)jZc`*iSld_LG8&oKSc|#7n zaX)Hz@T#&kf7RL=Tq=mIe<{rBst6%v4e8Cw4kdf@@fkFHFJ@iKU=*FT#qzR8|NmJc zdMnKJ^lp-=^lG(N3v&#|uXDVp9--5!oCK+-vW%FP^&6s?d>G~M$prloj~Wb^HJp|# z(~J}Lp}k!Jo61v&p8Cdw7~MC=ke!c5m{*<`$OIttNU)!qBo}LSA5_fgjkfI0vh}p-fM2pf~!Q za+I_}))=&t-!|x)di+!O9-Ks9^(C$=Dds~N^+~k5u$pAPs3E0<>*-1ct&Xsj#ngA! zRj_aBu+24gpKMf8e`Ue+Tsi&JdVpJvjA~+n2@2Kdzzx-1Dw4eT302fns;2r%TC0R* zlDY=jkWyhXZkrg1@zTlkY#DltwRH3s$rd06ArZpYdEA5OTixecA95bzr*@q9~kqOeJoYUJHPv9RyyhFP)v(=F(6{9fee^0O75u&!?VQKE#^kCk( z8y`VG_icZK{8>13aT{a^G_*rP|2&BpXT*85P-nYN&8T6nw#d#PTOogCs%_{q4pXYsIvOa!<2SPWtuPcH#b$L!WW}xw^t>pr?pv%)nbffv&Gr$hHIW- z@lgS>xmO(_e=&UKu=rm(4AR9aD}=-@1FJ31B4eKWHaU0cD67_{dBF3e#yc`RmGwS< zfMWdlLew06=>VM;6Yyyj3!K;$k1I7RV>oR}?X zWNA)?EG=j~)$aBp3bFIOLZv+NC^YWR9<}hmv#gW3wSpvAHHN0q4t^McJt@K~l>S60wPIAnAM$C8BGCXmyd|- zgiOr+8Uul(c~x6XoxyH5U1r>eo~Mfdq}{B|F}|gTezvY=hxSXvCU^8(HtIu%`lhNy z6DA|HK037%MtJ(V!0-R_G+PdWyurwO_VJ%x^CLtkE<7xW=@KwW+7dn0X?*_?c|D4Iiw9rIyY#ia5H83-LJIx8HX z@7bBC??_l5X;3Ldfbwx+5O^Ag9zT_eQ>H6RqB5svztb0DSsnVdM8pu**-2_QJ2hSS z@!%fpDaO87nLhWnFXB-{65h`de>J3CMi+5UHHu4gHRynplt=vaB$#TylzWtOmQTvb zwbrJZP;^Vxp=!%XX5%5a%v?>al4!qKgNB!ycH}lvRi`biQc8V83#+Py;inkF`LR?V zH7u}Vn2IU1$!h%7WFbe|U{6)n#wS(bAG|ZZxB~aiBHH;1UW#!=GO2R$e=(lX-pUHl z=Zc}UHyaZ5)vq=K`+KhXQ#9s>UySA$ku=ATMrjRPrA1db5)QUu6{hMmDKlU)MsD+? zDcGOCZo(;j4CdE%j2s5k zlnGOW2sK3@sj;aFjQi9Jm~LW-p{UTyj0$AqKhf@jyQ?)dKyA)yzo@P& zQ&TC`T>48(b~+mB)F_3)zYNojEWzN7KCx_w0?h{rpiJs1wHzdye-Z7~w7&I3X?;kK zSB;GK>tQgBdvtM_z#ThRI`f?Uy?MHOK$pqR>V(#IK=t^c{9#-8I&GE?XzWmTbPE5O z6F?LML;6YTCk=?UD;K z-=B6grbqU&99AXMEn|P*|;PY5Wo1CaUoG#r~c;ejV^j>(l!dsGeS$ zRI(&ZIhMG}OJ$Shz#Um#ySnRomwJ)^oBDZESNYtZ1-DA>f4N%jl)gJ)gmynWfMBT@ zjd2pInlB*|BO)!~7&#B?oK_c+ARi@K+ziL`#%u$V| zXabJ-V%{t&$J`lCDMzPXDW*J_L_wj7W7O;v6o2Vx?HC2K=4lqUHcZ_*863Lm*Ii83 z)`O>wj-QOZe;Q6y0Q7uvIaj9y=Awk@7@FC$p!cFx{!&D5oDsw7JGk%TZ=S>bH|W}S3Z)7pH70~y$tO*ohk&O zI>=%}B=BQ~XLrL*st33z8&mKjqeK3@2GuWDlFFxY9`&+#RJ1&XnLPB4Uj!cx(HAyk z#ayvDI?mFBrMCg_e@El>_i)$cm}5n*A8%2wXDRF|-^S?Tfd-M76&cXgE{5$>{-j3^7RD}m6WHI}-GwU^e~A2d z#bh@g#_Br9+glUwjZgXPFelokew7=L_xQey;}krrUAohw^%m^jYk9`P!RKY6Xknzs z;lnl=NcY6rDqJH1^q4h98rPOVxCX!a5xy{IJgR&aaoI(DrG9h-vx+FhT7w&5xTMdf8YYmh`Q@9CF&+vk~@dpgX}CWW(QnEe|t&2xMyyt zy>Ikrj!-{tZ+;8W;_HLmt)~*BTt?5deG6&PS}!4jU8BaCF?wKBsv!ph9t&7&Pb{M* zq;DDQA8tP1K0Sut-v}7Edti*|2pEQD8YLWOfqeO3brrDizs_t!fA3C)z5^%1P(I$! zc@@Ms{@3Tp;sj`n$#C;Ke_Q)8Og10%`?Kv`BK~jj_qO;ie)@Lv=;(BFf9rJn==tWi z+w&OEM|UzHth5!VwL6=~*XbafZ5xR7zhS%@!+8Hrh51lLdK_hCz1c(riV*F`Yznn7l@vr(_@Asbrc3f0bu_!SayfZ4Tng zlFwC(V=&7;d<+uI^kFy4HXgLeRaa1+oHEpOKh{Au>CfVvfM(qX{?;Aau(>(Ma_ofq zTHeXGU{goCe9ESwHwdfhmvMB(YH!!+uZm{raVTf;O|0W9H}z`4s!pk@&g?CxLqcv| zv-_-UeR7X9s@W{Nf3zsHDmew?KNDXm>cF>bRJ5jzh5?Dq_9WN*DM?i?LdqqDDO;1g z#Cn0>z_a8H%jgZumN(SoSe`MFyR3I#)CtmkDT2uJ{_B$5Z_~R{0%TQpzq46ArbM5|sq-hlUVY;;$@>)UeYFV|Hh7W;O|0_}P6& zpVKqD!=ZS^gPrbo_3PKKU*FD(u5!7@npxYe2p?|nY~yQ%6!bhV+B%vbWN76Han6su zxS%Z*IG$J8fA~~ZvL1-Z^hyN$_3_+<;9~&%P|5Oenp_Qj_TvapT8O^K?dN;&`!f{H zD(#S}Btkwu8yhA#Jx&9yrD|V(e`7mciJB*ft$@gA$U%Z%ieg^lt@&28XmcYhEdBXx z&g?fs9cv6ND$vXA9gBW#TOSOH-`7&SH-yT2$RLVCf2>6zD0jYe5=@AtkXyYWw|hhW zs5hi>@mwgo$H9a1CPfL9jzehJ0N_OFEG3OAZEi@y&beG@chC5GGmVx~z${mDn_mvvgFP}?Z3h(YKFirmd zDXOCiIK&QjvQEPIZBCVLXT=W z^UBduf-c%xkl^jyb#Zc86;oMDvlEnGVfrL*e`*X`ONoy=qrFYaWJVvc*D=1iE{aMX z<&%WYXbr@foRR|HmvWMQrMGq?lX#qbZQR^V+uc@%LGS6)g((xg?XQLY8$2L}yTV)Y zS}}lbD!-xw20g_kXt|gT@B~IDap1jF#7;gu-0sY$h@hJ_V|V8>y4A4e=PTWry)hYw ze}HdJQ3bhgi{geiSJ*sNp3b6ZKp%i4S|tI#TxV11v*4}!9zq9;bK>z)wIgq%ta*<+*6$mEbc>R_g-9KXFId-tA@4T7{avHUO3KLCNJ$HT@L08 z%9B_fa{6x}co0^JzICzi&A}mC+0VO8f8JJ!Hc0-b4~f2XC- z^CrPpTU#RQ+-RW<(-)_EF5_M%J9Og2c5!W~JZ*MHBEgJ*m@ynKBgShjt3&tHOGwBB zl~g2|YJ4_q8!*zr3U!`C421d>J|@R13g@qUD{_cYh`1QS3|z)(2T zhzHde+KLY6H=NeMIbH36bGb(K*W0A3zfErGpq5TM$gg1Xcqa3DKdb5_e;>=^#2}m{ zC71~whO3q}Cq{4^)KZwoH7TE%S6)qw(^?voX2brigQ*2qgpPS|P3@pb$;<0TWT&pa zc`msjWjEmvwL@?-+v~Eo=X}80JmSq0K-h=)R_A=_e%zzXYHajlh~@XXFF8fPe>-7it)KNwNN9Scn5}&n|skgZ9)ug^s{iTmQ$7FpY z!<=qpa1nH5-GX#J{}|`@RiF6&##ZXw7>H4aYTKBR^kYF~yC`Z;92I(&a*8X^ahtfPr zWf)NIV)APHtx9~ga6qFA6&9<>5%%veH~fWrRrp6Xlk@`#e}?6L zIl}<0$YEu&mZ_0JFuqv9vYAv0Pgg{i*M&#~C-FM%yp-`O2c`x%+^Av+`SaYI9##s6 zq2~w55ysR{FDOA1bt?2u z_#$vnuPcaEe{HUJnX#gAnR#G~F>FqC1{I>sxRN<7v0^PO7ma2-*MC9KS|@f%q1*m| z7~j)Egzj&C8uR&UPfPMtwX|4oa6QZ5e#$yN7>)LReX#RRerdy8QKVPIaObSB%lIN( z$6o^R`t65OP<{j3l`R2Z3h6=H#eucveQfAk_E)kn(+P0qV+$nPy4(D|Sb zCp!ho`M^N>jeY2En)j!V5XOf2Eq=m9;f=L4J!o-)yQ2b(@CqqT_ivHnG<%VhL&j5D z6ZDoj_PJ83DUK5MUw5yRxjEakHreny6BI`8d1ssJbOE}2d=EZe|Y@1O!vCXYJ4rz`Bdt>0o%_=C6{4ra+XLw+l?Af|Dbe8f5}8nZdBZh2rl#;IyJ-`Y=o^K%;hi6e^EP5EHxpVi z1@_$*>I*~sDdl12NvKP#Gn-&aM^NWBXIzeJ^K0JS<1RUS_SN55MI_!NIb9t-U}zic z4K{~OV|DQt7WCw|0^87tE;Ln|womGye_+t4>@Fl0mUV+WPc)mQd=yer2|2r|Z(~6n zBThFYwcs^=kNpeg9PY(!)hA*3`;W*qXd+#B>4)&3(Y_9y@9 zQ58m5Hah+Ujr2e@%A{n%?=B5}aiD}cA`*;(JiXNd%RM|Qf$d3XWjb3BE@wK^dCnPO7B(?nA-0iXiAacZfBQE789t7#z%4`{{ub ztLF=v-F-h~TdsSReF;^f;t=eIb+ivCzDf0E$aTlI(GNp+5{#z5`r)cerAf|~?Tz%O zYf{Pg>a5ycM+iN{omD?-qRf+df9-8_@D22Ql?t%>QFUJn`zdX+3uO>2eHi$d&4hl$ z)!a|(%C3!gqmhob%*n>NQ!y~=GaokQ3tOc7wyr^l{W#2iIc=2_!;QkOxRxL#Fn}v} z=)VjGSrUSEKc?#ijo$v=B^6_3R2Ac<42L}lIO92+&-sl79N3v^bXw6w1{ z$?{61vdlgM@Vw4&o*SPJNj^zDxmV2ijme|YnLWoB38W?949WPK-Vv2w$8tL5RjFcH z!T*a(DM~r7fM|v%IK|0{09muL$Y%iey%;GlnU^nLioJP#U6j?1f3V3ytU;fd%|MtP zu`jFaDi=Qx@5|x}#F(L_6q6R&n6R*TC%-*-bMp4&lwl{CoTg9)DRU{?KUqNkB?S5<^>rn_F1QS5{8 z!lItDQV4H|MERQt3|#?jQ7T!_WStQDzz~YWm6NVnA_*p-%f}gt)NW8GzN#B9tdMo7 zYnQNeqbaoGe^oF+{dmwtg(+Lwa!wj=3%M2~>dUDZ3NUYjo?r&LqeO5GBvX(#htCQa z!uJ%2MItZ2`N27-(Ai?P%TC5Ay`n-&UEUWBCzStucDmPFlDXECo(5lLM>>*UF3dfxK4LkV~pw;r*({JD7g} zz;f~rE9d!YAF#S$Qz1ru5LQ3#8p7<1prEsPRb!8x2&UGHP(J}1uXbG~7%pkGK2&P9 z8owT(e-2yf!M^ni`Q8J0LjjfF$hw5+MJ9M+EvP4eVae!6SOG+&55j6>OVVwp{@Y|q z8^e1eGH*t7Iv-tXZ&O(BA}_4c{|r5JXaa^Z#v6hI%vWn6Kg&{Fa zK3TV)TIZG3N+FwipA=Se*l$F5J$i!%Rk}&S0bxe!I3x;e@2g# zq$!RcYNl$7#f^V?C0zJc*$?UAqV=pQUB?eV^=jEV!zGoj`*p7OKBlz-lZtdHl-IxX zvdV|54<&c$n}O}>oKCZVB(^)|IF*V?b45#Bl2M1+44Kp%?~2u+h{IMHL@F=mS20eh zf6#NJye`nF0Vk$e8id@f`eD9b%?f&G2Mj*65g8%fVB7rZ4x5cu5O-dp4#*DpQV{&W!ToF?+(#l`)aEiC`NB9r<5-z*nkyl;ac;$EEVUCiaEsONu zl8$3ce8nBII40<-2`-l30;|sc6$>9+fA9R4)krWIchJ6X)m2cns5P;3xKvcfetevsp6b^YS<}o@M#GmN?OKgb71)ofSpCc|g5bl^oa!~_P~C82r{#~ISVe{`{~FotVC z+3@HTd6N$D@*or)6lop5Jv!M0RZm)=7&0a2Rz=!^B3f*)wqi$s#Wa1Zg=A?tmw)>* zQ5uWo6mTTR0LE5wit7-AfhD@G2%)HCBY@pxugk`TS)SNf=;*v3S6T7CWGP+y3h#v@2co;N z8ErWVNT~ykE0^K^*a~UIjFgoy^a{diPsMzM@J6x=xE6Uo>5BY5(iOQcopr(5 zDSDp57=rC{tl>8r7$_(x+6<(Nc$yb)85Q$ncxv$-wYzUy%#Y&XpZN6P`i!6YjJqNLqzPH*kLxG z)_j@LpTvMNf%t}SLsQ$y5(%-!NIw)C@sGt&yrNH1NcXZ(sshA7w153##G^e?xnfNs zArCeKsrtx}jbU;nGf>dBZ zWAVx?i=Ui8wpqkpTZ_d(GQQ^ZR%jSFJ<|rLHUm_&_)k2XwfgU!zfSTTs_QbyF6fvlPpgjMXwU*=J*0z!{Jl7xu1cia4|U8rad55ujq0 zM++KzsI1{U!A%N;%2O5OWpArm&f37QGg&6(`1)2<692Y>;(r8`+WC;>So3P-u~f4+ zV7hbUqpybtCn?8sf&plr#k#_Uu6cP=1aepN%L+G-5PV&T{Wl|={?2Ps68{v}P@pNd z7uJDh?O4gXqLw>IlC{nS%qq}@fUyS_qUJr8RuKW) zS%yT`)=*J8)_;@VGHK5^2q6MjCmVG&2UU1w5qv${O+7UcV21Ej za00dg2$QS}NPJ_lOW9*tA|X}3vF24tpE9;Y-8evDmw&fHf}3&M2jte63sS3!s0xB% z${diWn$p$An4H9gOLDF{+YG|8Wp!ms5qnm_lf{0+A)=R{5^TgNk>T?B^kb@Aj+b!r z3uNhfb~hAp>_46C91P&yAPJBw!tsEovVxvR8x;7kR72^sbX>*L;>ybH#7KK(ncUJ5 z%*}}I(|-{w*Yv{KO0p8IT&{>aNcjqX0#O)qsMB3x*anC<9lD3}z`L8#`S!pnk6kh+@ z3X5vM4AfR+h}`v80T-GPx#ZiRl-BgSKo5qAUw;_BzK?KeC-D2dZ{P8O^c8v|2Ta9B z;QitT;n$}pAKvdAW_hYF%~&A-zzfyD%#e*`8ZkjgbO>v$EY%1R+WlJ$|Ar9}ppUTl zt`)qN&{)vF6x3IPGnvX1UyOzV>n$^koJ}SY&-khqhi#R6X5AEB|Huv!yMeQY9~grh zxqm83=+zNYJFHToi{ga}x=3rA=@a(`h2%2`iAw=~M4$tU`0#E=d|+Qexa<}{@>0hI ziJ4L4&JFZ=1r9Bzd&YRuItG6v4$<{Pb!I4Ziv7j7n9gUp_|cD)PO<+*or($QEe=FE zYl>ptN&}p1tlhhn2j!sPfjW5FF;QkvR)5q)>5C`M9xL5}BV986lH7uqc006t3Y3e3 zhe+fZ%$7BnDa10<79&B^@IaInxi@3uww<64D9OktS*{BGxyYb5oKHV_hQ{&DmCR+C zsP1xF)C3a7QG1oB=Hu&#N_R;1bY@KTI{7Sd9W`^6m)Ev8WXZ%9;cW}(^KXED27hU{ zWZj{0Z$YJXxy0U6v=5fen`^mX%x3mr_%TqRsp2a)c{#P*GZn5ue z9Wy58zEcaOO`k&^1H%z+1vE<#0GnyU@r{7_*m75cjS2c~=moB*pD<-7_9ywtWO6qc zDnqpz+GCcqJ5m$uCIiF3MMP+iqJJ9<`Y|gWoO=_+dI_R6ZJzQT;?QaUyvORlY4Qr85NMVdIyBhjU8 z*fronsvYy|nP7K+{-}uH(0_+yomt3YJf4?TWTBberNp`isuG(BRRbf$jZU}zQkW{` zGbOjhoCkY_@JbFM&8;rD8k5|m8u(+fDoN@Bv)!?JrGi^shMxRG-o*V7@V59ZmAK^^ zHn-u{x;x3aFSHXSnvEHhauIRq6Kc<=3RS565LJvGRTm}GqiWYja(}**SzXJVD#O$g zM#X&UqqBCoT{X(1`Id4lv(MB3KzRi7^5FLe@6Pu3&i3x?Re%xKuAQMsF!pJT$+_)a z7W3Mco5W>7O6j^Y91n?09%k6N7amn$yQ~Y0^m(?Wpu$T8^k=echYUiXG4joEJHiG@ zc2stjLAnSVbV!yK_keK8a>^&(njx zf$7{?3i1Cd)$ck z(LQxH@L5sej(_&WfL9QPNXWYQSR912sAMM6s5;dov3P!wckJ)d^_UO!zKlzn7<09S#eqKG2IVO0zD1JfyWG&NS-* z{**G0qE|*W$WyI2;S^Nq7>p#VW~?<{t2B!qN}&l(2Y*wwPi5_h0#%UCvYakEgAThQ z^0)%W)R`T}s8xlAhVxQrPS6hPOuEwnkv(Q>jFRgv0m{FXx6uECHt6g3xGS32ER5nu zvL*>Yuc!mP;KDnsYoJ7Qc-WbUQqtTU6dsrXjAwv~2gZ~otpk?;UzZuQGL%bD$rZiJ z1est%M1M+=U5K&u&SEKfo5iTSNKrRFpaz52TWZm_U}7ZVCn;|f@1(}%@GH7K9vVEN zjip($W6>(DhN^~^n>r%{QwyZyDG;;;q|&01Tq$2mk(Nx|@HVTsU#5A0Y=&#i3B@x! z7la+Jq#nAha*$`2cGwr`&`TuLHlP-05MU<{oPRQ)Q)FAhMAnWQ8)Dsq?I_{r6$KR* zGIPM}=B#99$R|}dGZq~4{pIuz52YU|;b3{3%C4JV-4JE2F5)D^n89HdwGetCZ z&VQy<3)+_Q!l&UKcHi~a*ufa~-XDoK-|W5n^?~>X4#}UK{$Xv+SJXTQw>Z58e#(*s zPN1g6c#f)JsgVk2R(NHLgk~(TvGW4v804AE!F|OI&F2O03DC9f_j)KDF0g`^fD+Zp z8GgONl}VnIx-6!=5P*yIPA_$FN{VvtJ0=zhxrW)?Tg7qP5q0uK|skKBL;$QMikF5YlRbice zIQ!=0bi~g%oxD3cJ$em$Q%>HExN5uZJrKV3-+@=^cLl@Rns-UU+FJW%4B-_Cuz&Ck z?TP=x1EC8$KdA0kF*$bH3UW66WbDNG8XyaA=hFDRr%m_g*i^2`R{@s3Q+3^)WTHHC z4*@5-Hy@aw1X03BC-z{O4?)5oj>5XZ{dlLHzTm?_GN;gq=Y$tgr!wu*`yiG+B&=Wt zzrN#WgT61`mo#rjTB8)6s<7YG1%GLs-?=J0)WL3`$HSA;<2^J{uf*6b?qQjD7owi7 zHo!`B1SF~P?}|`N72{wZh#xZW{t7!YpeF)!g4dV%Vs;1ee_b z8Uh5S#p-ye*d-81bsDn%$@^a!KFpMms zG83@zV{|hH&b!^l&T$eJnr|$jp9AbQhK+nQ7=ZDv5ups$oCS)pqyTBujk@&?dafMh zqz?2+d;pfJHyD!I1EAT2Kw`%>{A0G1?ORoNq>uGV;}+6}K6XeR#*|)^IE#SgWA!@G zBNI?Hn^ip7p;w!e@_#b9lIyTwt{yl9KsC|JrM)hSPfWqgA!YgJ;uF?Xo)TPY1A&CABV1#!EAH(T|4JSnuEDzpMTRA`B(#>D+giao#FCin|VvVNICFoQ38qt6ycrfxA)Uh`}qR#`iGHi$R7Go#o> zEkj{kH*@N5RC=@?RBkNnW>u=_u=?>@6mNeZnLfgK#uEc!2x~_cld*2(}BMs zZE2_Nq;?uRD}T`ryqRCP5M(DY;^h&6DTHf@o<;f2*MK2u`wD=mYAtIqq3UL6Tickl z3T5lE1#1eN=h*_tN(Hy@Kh$Ba7a*J1L``^fpk$RkBZICGMEZUO@3a3bU5$IiSL#sB z**yjF)gN{~pn{I`DptUV#Ibra-^_ZrSZf`kJ-E#GFMp|5NWUm;qA%6y{RO{w1^G4O z>D!3R_e%MzIJ)~^_a=)Z!QhKm7^KOPVZuV_bmkf?(O|YOE-%0sx-7GI{^WuecaC6} z>e-ub4odhLAo?%5@!g#VMF{Wb_yN28b1dYusSg;@4L}#_R5h;#16^#K5 zAaUeVrhkoLuMC#XHA8lLnk~4!p6Yzb@}T6)OBk31!D|p!v~M1I#2tH(IQ92qqjanA z(SNhTDc$JX(?>t;BN0cpVTFvE71H3s^|P>Ic72qVI^sbf4scw}NZ#_%)8;TE6h9ne z3SlJfJ!qMPqFnjm_Jn zV%8;aAQ|`5s<&@}{zMIVmMdDVZ~q#1^=9LNkIx;iB6^=X_>i~Mf_%DKSge;1d8nBl zs$iQNJgm$NA8yRCTX`y1K_^t{WD0akTaw>W%?s~T(VT3%#eXaD=`8dh*BIm_Qg@cnV1@9?j*?9exbQ+If?2HZ)ua34AVd@bDfepld*_~D(N4Jv9dJ`Txtf3@UIf^$;chb&GI>pCIWh`u7q|%gr zF&?9-54g#j{#t~jMn(kB&uTNg`d}6(4u9~Mgd~eaPi=maJ%cjoFk@DZ%Vbj1ZP_@U znQ%ACS!hC$m?Y&5t>snM+08-)^B5FnVt@|A@uq_vr5vJ-yi3XJaz_NcuGzvsidM0a z{T{Pdn2|W#JAF@5j6jO2uVT-jSU~-ml{-yxT)?dZwQ8*{RqAz85fz!X>Xj9*F@G3P z6#3KZ^DU5m7G>UAZNmRo*AhoFDq6du!}Jz>s0bS9ot@6KfQ`dxc!TI0N|MY9Hq4-!zHeq%FG*kXpbm$2q_=Jp-cbO zA&<#iPM24ER;djrfJG?1UG}L&aDPC19-VO4^l*F6D(s{zM(=VzLvgWza5jm+M-S zqPwdfp#0Nx0M_-8S_J3#utf`t< z%HTxi@E7%8z*hHbF)bF-*a~Zhi9u{;pTHh+;FplDd66iY;x3?DAc%Ri>RWut5ud^O zR}yX&dBZ|JPd(|eLWMzm@9zAVu`u#~j)rZ;mU&v;Pv(PX3Pe2bgWD=7WZ-_MXQ%Te zd3>)ks*9UvDgUk0^;CGKUVo-064TY$PX&bCKL&Z7mG!fPTluZJ$p*YaHm!L7@AZ6^ zfV-hBW!M85vshmC>x6tCQ3JMp%l{2>JY<|_QiCp|@-lo`Nq&W^x66y2Rg4D4>mv3x z{R4t0S2cew)3*w^p5umm=q(+_$$v`Sa-`b=#b{XK z9xVa1aVb$1{8pEx&|4q;^4LLMKvqQpzbVNLQgM^t!^{(Q>6YQR`Gr`p+S; zD&ETEvwTKXU^(<)Y?9$}qzSOi=o8&1Y{(TQ9TT4*oQ%bBQBkZtD{>0GZDZpJ%}NY@ zz4u}Lr^CpZ<>X@x?td(3zeboAI)<;V3;Z2>GkTqd%GviAF6qhDXA7}Zosiq%Dq+{7 zCrp_Z#l!lVlW|d&vVzQ1540;)3ijYMh2Nuje@R*teQ(YED*`=9Ja|E#w}IMA#3=4y z%pQBV_QzEWs~l%I)Bo};n<<|7izKMw2WoM4qgNqWnJqN*seeYEv3tpX#F17vlGDnk zIS!q2T~{v3Wq*NoNkmRDQtldoG5L-pX32`&U$7$UY&T7uf&9-k%}(RNVs#i#5A%4C z0lYcg8$HMXde)rU`20pqCHZy1;MOCF_J8)I!Ys);uKcc>r*R(GVLyOt~fec!*yMxvO4F=$kLAy6Mr*xsP-nCU7aW`;T`Qq{DW=J zzI{jV+znLj1G+9WXCKh3JgKJbKZ`3?RRP2qLV4IDK2YF4z0(93is1sHy1)S$ov{!- zEK5KqfG`BJiNk$2B<1KstG@|1a;wCnX&VaIWixFjs}8d&mwcY8=L3mi?aGSNp5XndPF? z=do|K>t(ilBN-oJMrG;q(s5%qapoaq&T0W&;5k(nj9(JIj(DP1MSQbQjZi3_vw}9;lEvl(6aBB z(SO)S6Y=WYhk&=m7UmWu9J^XV;vD1zIxH!|a!cL9rs{)wMY^+_gIKLgdFZBRH}dMH zLC7B;T#2J!2*2Jy(2kWChvyFG`+^jXB+rIrci zqR$%(anA;z&7V`fEp9ps?Xu(W;hU*U%72EM=o5H8#%x>v1-a0(9MPwoW$khw4BTrWelBQ{}?7URi07N95?-%Ycky%Vx1nGk?c*C zzQ6E!Vm`jh&DW}P&p%U#!JzBMLlxjB_|lvNnd{UfA9Ks$h127rsE{5#03lN%#DA9! zM`Dm*(InkUJB-|G5-Yk}Q>G{d`h-+YlKHgOckO9Va}3GC=K>^{BYlz48PC$J1!fcc zroD=+E|$$o6kD-puGk2h-sZ`S!NdT{$q@P+G#<|{Zcsm6<;ZO@`i!Yxs;3%-y%@k; zIC?F^OGg#Sc?Eu)e!_oS;7@YQQM6lR=K)+&_kc zZZf=aApjb-zkbs7@Cm21MCR_L#yw0+og;XQ;H_0gIRgf8Yl{MSgNs}P_K z`;?83HgdgOy?_Rh=&pMGI#t4Lp@%Lx2I7vgRY{aHU;tw7Sv&ndbadKWLt8f>6jg_+ zVoAwTER*h{x%aTztA!s}+_~-&% zj1pc3aX7Fzk=RF{eUwj%H}kTDB)VD1NyfLmC`~+ z>|G2YgrOYPT2Vf_#&iSHLfK|)3;Z_ArLDUS%iZi%PUG)agYQ?v6%o0`j0|@$ zrNfoQXR#w=7E$v$ha#6q$iCU`xQ`+HC%8$ZkMlZK!-=F09$>%(1I`z@{1aT7>(ScW zlp8ivr7m_U5AqM4P2RRTFCP5GuGn-9jFhmbv=LG64pZn#T zssA-S#@T;nhkwx)rky>u!&n}uxfQqd%oX=v6r??}=K43b?PspD|Dy2hDeDZD4*3G# zvAiK|@!fWOOQl*MOx4!w=dHnm1r=!fxChnOi+fks3;Mq$lU6U5&RO*dcmPV(o#lD& zxFHA@);EbY1@nEa_hWefNdci_`^&U=TiblooUXeE_ z?(N?m2Y(A<-)4iQ+FA;kRJZCXao%K;dz*3K5^a|#p4(~Lx8S_Py4GGAdNqDPceCQ- zb+Vq{s2jEoNca-Z4Uo>NnjRMvT`;v zmcL2MZr(zufWEge%L1dZ^U1)+788WA&DH*Lx_>h|iWK3s-A!d!t%rJH2@#cnjaBL$ z{VTXtfh7mn1>k&13cllN`#y0_$Rf$aFW#Sh%Bt8CkI=PD* z5SzOF`^v7Ws9^-#L+_;mL(4k;Z$a3OGU_xaC!>=Y@uqWS8MZGC)`@vLr{4Y-8Gg+af_j(7$r_%Wdj3q?Wg}QH|`K&Z( zRICf5;UGxxUXrn39Q%Y#(tmNp<~T2o=p8|Z+R;AMg1zOp(rjWzQ}G9%j5Hz0cfVt( zx4y1oa_NZ`!%e-RVjoRuk3Rfyi2(@)Cp;jrno-^9h_{c()V{yP`~RHV``Gc(zJEP* z;@teye&1q(J)qkN!F5~3=$6Hp`idWWp^|NmemQgtu<{yrf2NPLExPA3VVV60Xp;^8!Zp+?(5bwUNmC*{rhp$>CVNAbZ(~Heg>5@C5V4rS=;<)QCggBUM5*!; z5_-Y_m$LpMf$s(uj_y1*aI6XzzeCl<%~DNwmCE)>-uC%sL+8x!25M`K#(!z)uEB6} zrzH&4f3SC~y>S!4?@0Uy6FzV`u7;L(M1(>cXrK_(q&!ri$i3SnrWgBU`v?&#|BC;| zJof3a@79+DC=?{fd3PQ=J3Bl3nxUDdZ7e2oGE;oU|J)4Q|k-7 zSszE`MR*0?iNjq-H)zvuvVXd%iCN>G7!z`DKg%**oX4_Y@?W@`Le>dCSz<-4Lcg_MEO_Cby z_&o%Z^xHEjGjG-~cedJ7BbQ?jw!gVu@BUI=Y88Bl6w>O)mZp8k^wj8NLyg=rwUeE# ziAQAOp7o3NY)_KGGEFs-^}dC4Qab0?z1hsElY2Zd(SJ*Q;_tFkxqutQe{-w!579LK zs$(H?14Se2r*DS8-+#V~SM6P+dsGMGr9eGk0EGFUTg|8B*%l@m9EEhK<$a1k(j_ldi z{{_KuQ*K0bjB2g$=&3S?#aX~-;L&O0D%o_hPsm0A$Gt4t>VH(#an=8?%MwUCiso#A zhmb_C4<ul3~@y%fGSk}ml za@>eL^xBf+cDmC_nE0m8uLw80>vc)z`(;%wVLvxfzoD*W*4?wHZGIex1cfp%nv!^wPn;5- z(9+p9DP7C>IIqVm*zV%Nr;Ls6rLK>svkr;AVLPoT3*}HuF#wSxbri71baf_ZdPUA0 zvQoMstB8*!ehv*Nq1-63K(#iyS3`8#SA!UXH~E`6P}I|PdDHs^YJ;79ws`oP_-*?&%6 zhyX8vBHdui1Ws&SEIGqwG3(sUWJK=w`hI^-{VotawG2QLdy80CRspw!HKcax?&b?C z8IQzTQ4fp#7LSH3@G(VyX7@flQ}lbZ4YqZ}78=FzZn8ZPYqHDGfG52h4@;8)0`ngO z0L|0zS#@Di zRdrFHCEGGK#umXOdBL4+VRk5#jsUdpVE&+c8qPL`Xt`2Kk9wYE)92(c$`BpwGHN0s zWQuE-FdxDuYB4ep2RU+30he*6$j9eyZ*-r<`IgZIk2I_ZHn2c8ZH4U#nSWu-J-m3V zASZpq-CxSC@XfYVu&wuk5~>+M;pIvPNIIUe38up~4CG#lhO; z0UGwob&ea9qK8H;ypv>EEPr5VyYJzPCqyX*d=hevV*hP{+ovPuWD=S%%@;c>H`0c` zlV?UDJC2{8^~|wSfpx_I?Cm7bWY_tcSAGOBvK*7K=CBgxBURx)!I+zvm_d+7M#&?D zD!t2iwO+$-M#&#+g@DsfdCu2tbH$K`90%NBzdQ+B9~Lox?XMSEbAO)l{ghEqLOaGI zZ!nJyhIf*C$@ZjGxw|UY4XbXqS$H>n_bz`C2HRR4?JN83a|`3}S8(S;YI^_$hCA3} zE7WfdsT%&07r)%iv6K;A_2OynDSW-t4h@{=d?@6 zsMvLJc%@$v#BY|141Yen5190PH5ne=mC0bx5!WzbMemJ5JNV3f;bbm5WjEuh?Cc-jHokU&x_C?nJ8UxI;(9K}9^(#7)GJg?91 z)JvGd;b0EXFgTxu#Dypzs&U~7IH42SISLH_tEzs@)um627d7=NI`>+1e&Fi>SyC=sbNrG?RrwOK5qRS&egno{2Fq?2n{(lL`O-(r2Bn-zTW;VclPUm@( zs0JgRgqNVqMK-hn7ixN*6?uJ;G^G_k9yZk~-~`yEiAg6NkWJuYIzVxHs@ydK1g}70 z>ZYR0Y(d6?bf7%nYspiC(1QT08OVrZf}4=KB$l>~=B~I_En=RNi>sO658N(?f5sup z-OVTJQGfU1p{!=+X!4-oQ$C1LGg*a%`}et8G>ELeDyAfAk`=H~&N1J4TjET@J#MyI z`@oH%f%1JnlrIVGgi4()a<@awZKhBqwUTiACWJ=>Bnhv&k+AnYRYP54z+BHaIo!Iy zY-X}Ej0FAql!p~QqMA=tO-97^O1wBe5aKYmS${s@$Wb+N|2!{d@PEUIedi=4SECV` zs^CHNI61*|t9VY%7<3BVX=$$shN_Y#dp4E4xdGwK0a!%U@Kv4VVn*LMYj2@gIQRq4 zJF;4(hJ&O1;}d|aQ1i{*zn$a=WUQK6Ga=ZdAyso%DAr&mXe!YQ#)5|Jv zu74~aPrf}kHqG1#e#sH;256e>!&MLa!M(iU^xE?)Gs1O95_RsWk59$&@#W*gC*N5{ z_~&hK5-2j0X|u9t5;j@o_?~A9{<;xYO_iUWfhNxke<526YRdsO)Kq`i8arQ5MwzsF9D0xvgDkJ-l&1SY0E-XplY7Dp7A9q-6U~QSrxqY@H z0kt#3_=B%#VngzI-q5ghcedo%HR;5xH3=_xp%dD2$IoS1JtyYb&f`JR8L&YHn9bx+HTk4NfY=!3)HzCgn~1!DDS1e4 z(lVAXtBl7)eB*C7*7(ALi-m&lZeA1fr0b0NGE1-r7ZjL=8|nFPMWTvnwx|&gzv%g@*F=kQFh#n|~Zx1M&{Iox+@OYaQTT!`F6c2-zf5Gr9+-ohv&k z#^WRBx#I`-?!pa5nNl}gcVf-pY3jt)HueIQTKi$A)C~-fwkGiAvUHaf`6dhH&RW*g zT)*u!mpW;1M`ne?>tdVu@yb%(Bq5=3XdEAB<|LYSLO&_m@J|E}5=WTujDO!r(-cRN z3TGvwY0x)Nj{vADy~rMq-{{0e!+1S1{iu}iVU{04!N3;1n;ICvtrt#tax<=oaGhDF z1!*7*qA_HTN_yi%^=vh#!+^2wq=_VatIxyM-Cg3Zeu8N|4$Q*B6I>wk zH`>GTz4V?xF$hQ5TLTqSLVs)DefV5ArK5;1j6psj*74Y;8w#3GYUv02{g>daHL7s$ zo82J*veG|JdHEGmHgs7sWXfOwP@Ol)I-|e&!rgy0_symy81cM-`pLYc+n#yBaU7xN z*or(vprAbb_op8dzmw;yfpLEJS%?X!3 z$-QmUBDAxiAh^Ia&zXIUJX|Nn$q08GU1v~(dRNE1v5de>vEOau_J@4Gx1Bism8{E2 ztfLu*c?u})D}UXhTrB5yAB|h%&v5#bg~^3OT2*FF&2`U^(z^W^MmCf0CqgWC7nFcp zQ(2l6JH@@uqqrp;k;T0g&5K|0-NG5P14eU2&Rp12+)Hh*9CoGjXnQ}o05RcGOP!Tf zuIkoA?-EmoOgd2q4@r};zSIs-w4+X&VBnME8b6zxUVoUCQ@Srj?P2dFHhy z-r$yf8v^`5iicuzuqkvmb_6Zva86)>qsv6o=RY!+#ZUI49jj;lq|d1>^|=*K2cp0E ztLtxnz<=!wozL2b2jlUKDMPD0l%L}g@d zb%1I+nptol_8f#~=4ziHS;)(>c&p);s-BT|7Jr!QqtJ?+rG1~f0@lii07{O}8d0L> z6J*G+VB(Phgg%;(P2jD`wx#*0Tw<@-(WDA!V1*a~7n4p6?G$@TvnC5!biC68GtKll zE-yvP2w1dAzai%3n0_EvuLh*I~C~ z)qg%h=ltv)ofLEtDIFLucw&WeLwkOuDx){7UQ)IAcso4bhW^_7?jX7UaPQkM_mhVQ zN5_Yce;SWNFJ@WHR5iaMCjy+oGlj`Btj_cH2x8&FIt6|d4x0*0n||7u!9ZJL*7?x2 z#X*qyL6O7wz{uTfMj8sHmJgONR0UX_ntw&|tenr#@1k9Jm0G|PzVtRb=>yCg@M5QJ zP*#2T=gv3Z+8H3+0Wxr=l1szwBA}hu%@!Jxk{_$I~NK=_@s;T z#b?Xik3ad~y$`p$AA7^EU`j|uFn?82f- zwjG_94gBr@gGWX4S<1895uY=i96dZdrba)^vHp61hX+)jLib<}``tD5kAL^R-aq`} z3xatBZHZy((cZTYxF_%`PqMof;Qr&iqlW~s|BKRZVOB%zf3<%f2M+-~2CJ;dP2XJ! z^mzY^C;N{MzWoxR&`*zQ&4c|tZq0Z3ylfb1CBSzFj}ARB)P?)m0#yef`@v9MPVVo0 zcl_k>K0%s2e!Atk3i6wSqkkii#R*K;kB@!GeeSRIko&sBj?417wjc=DuN8-fU!RZ> zJA4#&0bd7Q-vz+z;dd;bylP^UA z%IZ~|<%J@FE?2M#^7!)L+kF=3lka@c^JOzDFF`-ofj)e4{NV5hR)0|TZ1ypTDJ|i4 z`!wg#-cS3FPvB4ZFFJM}^dpu1s$!rY?eBfR--fZg_gvnR{4eW}TAEls;lEi-~tZ*eq-CyT7iX zWsUD`A_f!TCp<_ZtA8Cjw9KpV=H0BkmyFsj^)~tIJ5YpwggEPNwCPHG?4uJ#{xc5e zpBia66Y;XYE73$gqdv)J0GvY+UTtZwwtTn;(>jICOWJrKt#u385w`ptX7-(<`}^PS zKmKW(v2z`eIn1GL3@?(ha-WZAiNVr%)Bo`z?O;RKYY9)T-+$KgR#rA#o`vaNla*E9 zdTKjeB`M@e{|?yc5|I>7ylCF!7zrLZ^rcpl#9Fjp?PHR=Oo($m|9tV|l7NwQ3;x3B zRvzwfvf%p~5!nJ{ub^u57A31&0_f}7|K;lZg-Hn-zlRXLVmH;0Y!50b@0U1J zq4fMlOUn)6txB1?nBL!R!c67D`XYxFQ~G=6l8Vbn^*Ik zPVFmGtp+EqtBa>4ETwT;c+>us)?n_Co%`mC&yB4nq_=8#ht|jZ9pKg91lm4f9fR?1 zi3*KB%S&L1Fx9-xD94d0U?Y4jinx0CUB)))y#6uq`Yv!VR&!R9#wL#vf;OJrqb%q8Vaw0a*_-QP!5Lt~a$rrk`O# zDh0dV&O)X2c9x0Uwv7c=;%qFl6KP-pYm9*PmZ8*MT#jC4t_K)|>hEnphZ~N$HTO~;js~J7GyF1|zyjZ~fHGR&9 z`%+t`@L2suWj?m8gbH6w`iVX~7)JA9E=f9EF%@Ev7*n*bOYfg1{TW18)8e z6F%-MO41HpOrP70$6@Nm`G~jP(q*tOwEeH^l`To#-Rj3HHHjJPGRc)1AqOLD|DP0m`zzf6bQpyJKXxck^RB+UBFKk zV>X-l-x*ud9iv^cN1!M!eWj6uvN(QiInZ-Ut*5%~&nXs#0kRwj(_|3`k*VvX=@7Sl zK}d=bgh?mDA~L#O4*!5+c+=A<(-OaKc)fya(CvvZ#h~BMLRQcKC#H#qL!@l#lYf*C z6hsOt%Es&B+CusH_kd5E0RM;my{~mbiKg`50rZ67rqn_zD}uFn0?x#9&chf+`36`E zVPeE}v$q=^h1mvO!-mkScKcd^5_v73+58wzMyj6hn{K|W!WPj)9pt0&K*Dkh^jqE9?9D7Z-1eG>KbMli{#7$UC-sOK9_D}52e$cv#l@#A5(H& zMGW)ap^HYFYST;oteCpoTv+U~`v!OB(%~i~$~tfZM;?C@Yf^=Q@GA8hi*~M02NS6H zHHN{!{^UqpF}><89QW&mJwEsUuq4cqU)F?*vQmYiTZNyFdUn>;NsFlch8AMiDxLk;tf0y-z zji|&vQH;)Y=?|ZQ_VnT2d_MB4_4JjEvCgg6fz~m``uc9_hrLGMp|qS6>>hl%h=i^? zDF|V-`y?lu?r?<85iXL$0)O{&!>|pyL(fnpB6^OK*qe0=T#X0RotgQ$N|2SmKOa9@ zgCLNCUEeH=Jk+Sr)@*KO9HWOtz-otm5lU%5%F4)K6pCaLHow!}ge%t&K1KWM2emX) z0xFXGVHK$j4q_7u<+$c4)}cXa16Y=hZkV}QH97&`oRUWv9V-&E#eeXleeTP*DdBGu z=>-{2u(m!Kjj<-Tu5&j$-6d0fnvo_ygp8cy#ekxo*iSaJU+ZzHiE&4Cy7M)gJ{zFV zUt(wF(^0f0xWKITyR@@x^YqlUW@EtBPs6_44S5n(`{vwkMIElHx9z0gv=0BhKHG3r z3;p~-=0_`?1HGQc@qdEjQ8&BoWGuABB38{5EorS$`qd`o&4&s$JI|=P+Ev zvY(j3-|{Fa&1ddH48jKi!0dxis=~xI%l#q3+ORuk%72!QNRFF?8S_GzC5g|0dzmds z_t)i+K;kp-N=3k@1nq_6&)vkxqwb+ZWxb?2!e4hc!y>R-HzA%-YGi5fy9r;KL5!{g zJU36iDQmpi_FT=c04TS|42Xf>^yz$zJ^V7F^&C%Zgi}Zo$6X0`KC8BMf`60r87pFE9O38 zjB=*yoA2?>dhI$Y13kX!w4=kjytJLo?8Cj8Gk-kLse1ZaO!xnyehdC+`6v9OnmVWL zn8@%Dy8+NzuLKaRR}brzB<=RPH`gt~9TlCM;J&SQ6T-j9;1Cb<~jbCpnzvck`+s7fZzS&58Df@ZD9_AVFR_v`pW zR05O66R6ZQ-q$lXr0FrNc!|mTUnv!KL46Jb4}{&ug0G>eH6P&R)Vp1f`%u~scNgJ4 zK$Et5MS@#}@7Xb8cVqYIrKD_0@Kkcr@9Ikv(&F?*&!*#PS&3WkfvhIJ09sh>^?ze$ z$h-F=`yUcI*o4j*o@0jbOO>3JCi9)WJPfT%lW)sQ=$8OSK)JtiL4`+EcY=q>!$-eJT zyO5yFX^HRu<4NQC^Z-dn&nz-SqWS3np8ZvF&?{enuEF?Gb;J4_3OTRwTIht6lV0XE zo^NH<^xTe@nL5pu^Tw(@QrMKqG^8z;PX4d8`#IKn3aG%6Zr#u36d7J>7tLE+{%L3yF|K+C5q-8Q+gu~4Dm)86vYw)D=Sk=%06G)OiU*gRB+X4sCsH1-3PPVo? zirvA|rd`(YiZ_vzbc-j!u^Wj+R8{j@b$w3~lS7SjdWW5dN|_gEm+LZVsw*_Y@L@&@ zZZ%e)Y6fY&7_gNXHtmsoNHn-^`m}$0f@Xq0_o}f&mKB`tWz_nKHH4X-x1EGSjE=v>VHm_`r^j&X22Ch4>u!wYy7r1R(ysl3wry~?-G~ts)ybCil>OuW z#LasYx8PHB3hsJ-#dQYa^?ZMe=n)z<1_zA7ZaHo`7NbVv^?i*qQx}lDg>5#D{G7zd>u<7V z*t46v3h{Og%+aRW@=t%b4!7Yv+=}}U2=L}yi0h54>$wp(J>()?`94{0J{Tj1V-NZW zZ=)Bd8{{FJjag9M4cAXGa1R=tV1Y9QL2Gcuu!uSwU(c#Nz znHwamz@LF0AgNoC*dTTc!*2aDK%gM)rCsa^5P=HE;zNRI(gVw<$t#r(`qqMWHS*%e8}=NnW!LoP!&j&vYh~X^GzM zZ(za@YNj%@mc%SKkf~pAcv%olrRhw8qZ&9=U;rtP2NYbDOXEZ{SG8&g3qPI5C8N(&VRd`PO_+Gb>=v=SsI|S*w4fD65NXPLkqC+E`!|sGd+O z5g~p@5=;|*AXChcS#4yA%Id4+RH0l>sRifRuU0H91KaJ&PU2eZPfVY1Dq5;;gjTNPCY_xV0}6S zh;lJucHDnTrUt$IHLG&Erc1*US2g1?{9R)cNLRJuGGp98t6Y^LPM>8p>OLMCUY5x$ zKRs0yp!f8Q912!6UmvjFb{xhx-+VJUF12z2Zx_(#Om{pcxml%shL@sA7*LJI>3HlR zN|G@IPsj1{CKj6Pd@pvAZwPmtSkxwVNI6$#3?_f4pjc@qqWgz?j}DF_P}$_U-FRqM zq8|qp*WIA}#G)UT%j*>SC&xmrfU|WZs4bojA1~VojdKL4BfyuVLo2=|#Q{5Ae=Jq;WJpgM=uScO< zuK<5hXl_gw#Dv6C%QLjujE?&dEedFYNmei(^P_=#q@-B(ti}*54HOW7F`dq`Ijeb! z_UN*#o+qOktV&tD)u6p#+qdnF_Pg79s-|eOh6GwAr&^-`{$iUOw81~N@yh}lIllrk zNtApePxc#H`|aT|G?d;c0A<@ow1Ab-z&d|57;84BHJaxu*$gKvn!lj8mkZ8LMTy_c zxT`d&XMBSLk(=IVIW&zO)NI;4fu?u2LFHK8DEkBhO%m-#2AL@c18W@IzM``D7bU;zXx|Ml6CajG6-ZrDq=Gma4viQ-Zp;%d&F=xRt?UOZK zCY_n^m05Eldfm6LH_-K_85Xak&CT&Ter2OlEzzH}{IeOGd1t)aO-y0!^8)HL=jBY# z(QZjr0|~#f-gP2BlGjBwb+y}&g3o{C)J;_yxVU*ODol))Ab4Rs`@KhxT-Onydijig z_nA74wuScx|4k@_OHmC ztKZag*(kT@NoLCm#A*O_g^l#dFg-}G4A4uYUxwvS&!pXaPun(j6XUGgCI)}5bDHQtjSD^Cl(zFEDa{v3IP^anr!h zWrqJ?(t%0B)iepODP)Gw@(8aoB)~v{j&tWEhRZqFK0;u^Z)YFY%WIuw-z6jfL!oD_ zR;$%&wYyqLoubfB(;2C_Sq*>3=_4&XpusFFzv1Cn2+lh~pbRHAgbuURFkKFfx$OBE9GFexR_yC9j| zCn=4ugZh)4{fAYb8uCuUZmG&6Qv0bps&bc99T6O==H6g6S4Ygc^;~~{MQ37dPMmE_ zVYWzb3dI&pO=ZT!U9&bbvMrmwE`7$>!{m@*?}7lZByQNx< zY3--hxXxYDYfN#dV#Dp5$N8)(vLj+=`6zmz3-;!~oB}?5IL%H@D}u|X(WB@|T4pD+ z=oPqWC_jNX{29<>aK3*Bd*SnGN*mJl%P3j{)ejS}IGN8ZJY2-73Z_hbRWffSDMSWJ z!;}&Qc z=Wgi41WnHI51^a!iVEA_bUIW?%h`Xol<6puM-Ceh@n;4k{E3&?n2izIOu_uv!kGh?GgV$|KUc3&rDC2bo zCVXYFfSHn14SvUc7=D!J(-icxBPsjGbWh<(P?wc1`HDbAc2*MHKzc(*5?E`KyKWON zN7XIm(e%#|2YTTHB66%NoJwVtoSl;m!1+7p1!Z<}s+4~!s^IH{RBfK@c1H3I6s zod3E!=*<*f>uh68u6eRpu6+_lmC}Z;^}r4(Igq$I3lhOZQXj%N3~|tRE}jO?ETWIu zutUr$3}*AdolwSPgFkSMKY^&8=T`p25SW%373DIr;L;rKT6EJ$P3VH>*VM}A8tM5 zzr z(`5|q^uhcH0qm}~ndTcUjk@Sf%hErA#+v?zbGS?tK66mR`_^g(xQEdfTj*@hP($cu zv(tYKb@1i648m`hY?WoDBUsjMgbs0O)9#n_ym~2gqV|(#rnVlAa^1D%Tvl6*rrD0) z_n)xg-n{6Ru+eq4wr5zk*0|-lgNMwCdOZ7bwJ+1aTIk|cFpsdHoxfs6uvNcbrDp=4 z5^OPTEkWk8ZfS#8)iT2Tb7vkG+hdRruu zEZ4Ee3`T3w%Btgk$qZ)4Z}~5&xlfuij?IEsNE?q`^mCrgtjhHz71KQbrS^^3?_o)+&8PLJ z=ZFuzq74TrRxP3V@u{K(##z6MV03y`0`<7DjHuHZMU6^0Ed9MO-ld~qLlQTM$B|QfOY4fN-D4&BmRG_CpGySZhf?m4i5G{Vl8jr zM$y(A(Z-|097tZ@Fwi_ck3N4-OO#i;5vtLI-0p^iiNSxBeB&zku_bfQ2aYUgtzs0| zLKd=eV_b;C?!9Tn(SfoX67Ak((vDO8Z8=#KVurQMRSmKOedLg9APqdKB#aU#v!3xv zrZ2!x^%%w4$ig?W*@(Fh5x>}FEs7kGZnxI-)Oq3%#fQ*hL%Ft@z9VEn^jPD4m&#M63H&D36nyK;jO z(GT-NlWq^j|AA7L)4_kCQaKI$GsQPa{>1@P-N7DO*>W+vITp;RL19yO+PKGJ#^tX*BOR)~Vo zVG<DND3ck!szCUUV569XEZOqHD9KETJ*J!On)Yf;&On`IAd72cYZWSa5n{~914+6li zq^OMQJ;?FG%Hq;?skwUXa8IGeT&R8=pZMl?&?-5fc7Ptnj)%07ln2<2npW~?T zpd6s}am(xpV{kEzH?t>DUF1q$Ou#I*aD4!BSwqk*((3W!C^6TgHIU!(jRg7wx13_t zOLO#QZ^CngwHDXUseQu_gTQhYvl-hL^`W2<2_W%`%@TjQ_$fKAQsy|=fSTh+^An;m zpZ*4OGB{#S!BxK1YIKd^dv0MBk$IeL{etOKn+Y%tscNQ--3IFe91oz6?a}yWZp|ON zqw^2U3i&Nribc%z@AE9Rnhpx+ud-h^x)0D~9a3kM6^oSt>D~;G=f4CF5%BjC<8A<$ z!qsmE96W#i_=6{3tE*cn4V;Ud`-pXYJ+}6Y3f{G3BgU?Z8p@fR`{mv=LkT8*YAU)y zRc{c=A+vGGjYNaaGh_mX-0g@|w?-Bvjs1?1jbdQ4Jd*=jX277v_2}0>Mxe$(^*zKt z(Z&r6#`eEcFt-0O!Pve|!LW$)MY;@x2yfZdyKR3_RNamtN)(Ggl|iYUx~|2If1$lq z|MfbeQQezfBG4kbVy2jsWTw1p-{~G2g+-Cf=oZPUjs%rdc(PmN>m_Vz+u@zA*0Uiwd@$3RL3uT z*4}@qAMLm&qGHHl;-zmu;n) z26+))dTin~e33%qQye#h8El5TonavAqZI=3irT2XA-UsqFCZpZZy5D&zkNnhvw}Pp z8i$(Rqy7(W&2}C!58sz{uZOq_UC4T`4!3`Q&oyL+mHN_`M(|IyayRs^9K&!v+u9b#@?y zP2PsC+cs~D6BE;i1&P)4mZaP=n_iozA$I+>Z7kQ4=(__-E)Ok0-A+Wv&g>%hVrhRL zW>U@C+>9{5BMSQ77k%5i`~u8IM{$B2dXzT!{JUUhW~Bh72Cq*4MgiYTFxC=QK|^t zI~|fKLV)%|ezzxSB)&~qBQ!)RX+(c`F;ps?7rXH0ayfWJ{iz%b@P8)9sxmoaXDPk|&{0_+BAh_Wv98~>2O-<8mc>cyJI&|~N8-`~zTh;~<1w5lp_sQ9yilmCn&p{jWW}qxgLEC@wVxVjc zOJ!>ihCyvEo2o&0`fkYIm@sVr+k_z`L*p8RAuv5-31KkwdBVa5Kt_X2S$7b)k)Xjw zgYZi=LhX(QE?i`Z(%-HnlshavgJ_fiR{y%wc`g{=4##NtSvE@@+wdZ(-@2Xx?&Fz-pV8J46-8=bCU}lmz- zTOO(DWc<9&Ly({Hf{iPqZP-~~Z^l{H-9T7dsF#t!7Cp1R!*u2ocwWlx0 zdWPs+=bZz_9!LgC_4VXYXM8#I9CsvJbYn+$gRzFSDRm&2y~Jf%lY@T%O%qPVle^=@ zU6Epha)Pd;d)3s8))t;FGCTW$N1B@H3!w8y?%Km zIdf@SToo|VkVeY5;#Gh9MFVUb;H==OteSkZRwEFj;LU-7o>=;BNZy9%rW!SK1g!hi z{EZH$2w-a@-acsomnvfTST2?qH#Tkx^P++HuU%8fipAAPVtJsiV*S!fQfDo$!1N8+ zC~9Y%>U6;Q#DH*fBNV=z3VfhcprlUXfj3Gtv9gYQk71WyqL6=8%!Ie5J6EdLLW^Uv zd-e=9a7K;GpYn%a;UM-vW#f^dxVcq4H%hK_;>Z+2m5ymvP1qs*RQ_; zLq44J9>W|*Sl0$#G}hdY4GZ$A*|idbULm`7!~S;L>epte`%T2Ug+8Vt&qGanFC+5B z7nbo1hD|H-3x<0I1AKy>9zlpdAkF{lw8%p)Y(o{Yxru+4^yVh;_>PyewPiC{U zi1yEtlk~^+IR4?wA}ui+hcYF8K!SdFk|kU5CtrTF;dzslZ{SMcPg-K#j2}b1KvTW2 z-o#~-m3n`JSwA^EyP8z#BZDZ4HlxF|tWaE%nY#Ejvu`V>>d_HM+5|e6ma(q*WdTw$ zNiCrCH2Ez9X5sB$XDK&KWR}>yF(uzm>qHeUK#?JP(CJ)Fh?7D@R+w%}7gd}e(?+SC z>t7|mq>(df?Of0|+fFZ=JctD>tQ(bti`D@@oTh)WJe;e#L*<4*LMpwrl_wc+Z8pX& zcPgEwNkMgHcs2pBAwSM@_z5x@P=B0a#dg>@HUq#3OAJ<~?hJwP1-avH&JtLy*cLfY z$Juc33oTM^5J!n_(iWf3YaR2! zB&+hGy(3?Lv43b<;@?guN~;qI$RLsp7`~om)qSc=EiUc~+c$MH=0iw3me>ci^ySmf zzWeCu7rHI;sjam#{dJzAQ0K>@t>ltsL+O9#=!m91J&z4DXL@;(&%DoGM_U_GI_1Oa z`kCn~TZ3g~O+5SspBz6bF(tE#j7XCJPtqcT%rzysJexA!Ry|9TSyf*moy}k>qnf95 zP(vdS83UO(VR;-*6KIbl%vEndsOd#qn@3mc8;_!|_>ppC7S)sb!8EmPHr{kgEsIpV0N2g}TswYTR_Av% zqCK0*=S6Ly4_Ib`L>YJRd9F#&(+WQ5Bh&jNTzcb;l`9+CiVMeFc4Fe+aj!QXcw zedFQF(S}cy`~-fq1cB!;Ay!5qj{N7zGO)J9Bzj%T(HW)KlpumAJ!Qv?MWJubSO9`-*h5%Y%llLg=1YHGOtM*0 ziHW>u@HFlxYyl^A|0RBRnuyN5;Z71Z#*o3~uk)nnQcCaF&<6#IxkD^6W?kxW$)w+Uym2K7~$PC>+IL!+Wdq12eg~5cs0x`9%MxcA8 zIV091p=33RRoXpfeREa;Xdr*%cxE~=YXH4!&s!HRZQi+;U$ADR#X6~w0Gxs6X@TyP zJI34bmWMGWJ4_C?0gNHQio;_bkv79=+5qNrJ{-}NA1pxDFQdeUf($-iw0#ZrCm(r-{?I$&9*(``} zjO_F%WK{Sr(WL>F6uCLNpE&C#G4(! zs`vi9em1?aA${zDd|HJ&PT0otf?~YWG@0n=5bvTW#GdHUt!DL`8*M=bvO5MDO*R5o zKCd+{aSOP6gTah9=%$0R*AWufmykluswLses`(OYWcZM&#tVuVPju(`;;2H4T59 z7Ac!(R(CDJwjXZ2_2A+5gYCB;MYL1LSvs4WcEECdV{;Q{%M@^zHrVt1l4h3;`aF(8 zQ167J-U&d>!WKX`1NNnyYX#8GfPJa2=XL=3HDq7<>uP@i9gq#k9=NS+HCs{RESCss zFu_?6FN0?%5DyPVJBBF3UF%UDhg%lkb{M`lA3S{f!PXm%`Jj?JdR020D6k!(UXL0d zdQ;J;-;W?WEG=q^CGtJkxt~u{BAL%TP-?NZKj039cSruqRt``B1#MXLhSk2 z(6jm3QCfcpPVKcv<>NXikH1V@{@hdqDma&h$dA;Uj&uV zK7GIPa4dG?&60Hz#PEh5meau|z1RNx7PSFO9I)+oI~>10O^>T+0?YVDH=0Wu&E;S; zzi$(oQ!vQ{IR)8i^YZ{SmkyfCb~KvFhI=9itMY&GGz6#NnWA9%{6T^TYCd$T3`$Av~XvFOFHcVw-Mg%$@e3diaeV5 zWA?5OO>Dc$(Q>GByvPGrB^Q_^=!xBdY^Z;i$sKXxCArxFYERp4L23q}gP0mcMyd!q z%alDP27s|Llpzll^@jyVYut&;8LfCG)>I`ibk(ydQ-j(qk2`m1RE27xw(u`OgGnBM zqB3YaYuH`&m%NA`_8e=XZr5m&?OK} z9%1XK>9=jIX{DFl>^rk~yK9hW+@o30IhZ2*QO2>)S*WocXRIqCbiXAWkp)r zJqvQ#2rVcO>8aSQ_esv`*2!O2^?8jL|5n~V`26XoA3T2g+0(DMoyUlb*k0mKM&8bH zf+zCrs&-f00=HXBBzA`Ob%pVqmhK0|+AL;xO0|D2;yMBzn7FmT-CiOSwVQvV+@=bZ zt(cWE$|z=py|}gV%jU$A$*(J5lPNni=8DEMfF#bnj$1XPos+wgHvB`xfm}H_#-91g zMvq5|lj=0)HW@TKZos^|+d81;=$gFhM>%~M-{AOYc#tiqZZD>@?1_GerJjr2`0R)%9I19-UUWa0;tlok^C$Nm$uuuA zdfH@{p$3fWZ@YD&`pn)d)q_v)uQd^+fn-b+GKNDoNw6JMfM(cn1Ij62}&@d!t zsKDsXUM{cg;c-@sr_PX?SmD<*Hr)1))mdQpb6KSIt=mV|UG&4o)EICz)uV{cDi@b< z;9EB@-95VNIw(j`Gh?^@3r#2fD_R3PZ$7kf@6Ar8ss2f0nM`rxNvYxUY;zmS%`K(J zdBN4l7Dj}lXdV6=y~cmdm@CU%tN_l{Htl9!Lj(lOwPO?1h+bt9#(BA3R{_+Uy3;Ip z*lkn$QpYt^?J}DM)V9b~<56#1Jb$uxxJNr)kDq@1#o<@qJ^y0w^ADcsLHki6I0PwH z8+H88v$Zk9ufgGMyMa;U03}s=lGjjca5F%Khe!GR^V-OToIQU|ijy26IsEPvm#4{j z`WzK3qx$#(3i0#zpMU$Iiw74d26=x9FC#oZ1TY5(NB!B_e3n)F69VKhd=<iDOemJSGF|aQ$U@A5oT&HP*z8s-blwAS& zxX6PR00>InT!ViRvq!7G!Npu`PFGaYvFxXm-?eVfP$FtWT|1#CYyyAkzqj5az_%~d zy2E{Qk^k3jq%Z5wvC>(YN4HYV+f#A2x{jlo0Iv&qOEqbm4z*S2-BY0Mro+0P>>BL` zkDxm^f#ToegxC=A|M0WDuUP!KB_saF@bj9)zr~i^`y+oln}Zdk{%_E#PmG@b&h{nK zIB-tsb9n32ad%FQbffO%`qP3nFjs?TS`__1*H%8)Xo%L^Mk-*^!ITR+OSgEgG3It} z$>%0{Rz{M=R(A^J|tdP1s*|L%ff;Ks2 zc%V(LJc$UVEKscU_Ong)KsMjpKD5)Uo8%NSDvL7`{&YuXR6{YheYpvp%lECzOISK9 zFGM76G%t?{3eU{5W9taK$nXMsG>rCG>FfHsGHrhzFa-bD_-Px)t1i2=%PwIgp%DHP zJ&fOg7`-rGtOn}QW2Q)VIEt<%y)bZSZz92vNx6+FhB~hR5oEhaH zd|t7n?yOW&-SpC>Bz0lBsg_id)|Foo<67uIuRXF!0a)f$eg>suyek-ky_^lBg+*U* zT&5L{nn>>OWK_7@>+nOK-s5bFHTy80%%q?;TGJ=w91J)&)^;dLa?%kF^ckPN&^75b4E<(1-+K|m z&D`FkpPtqNe2r5EnEgTGKkJ+X*}oD&~m9Xq*kkEvLetVYRNrRAHIYb#&QhNvW(Y ziLZNN>A<2t8_$_d-SX5sYE8F!PojJ#8dK21E)czJU;H~_M6qO;KTsr@%^-h{-ZdX( zCZ>zQQP0{VGYwzKln+t#Lbz6jEF%H`9@Vj z?Kk%_vJOj*QLo69Yvme_zaG<@wdkmQVbbXmVSy=~TpfKKNQBc!*A9$#^c6mD6jvatau|fHL>?>hw{jMD)6~Ukvm&d&k<`I1&2{GyDhB4v-!pzyV)w zC^MxLD9@X=JPUKX=O5QeI z?49SH?J+R>css^t9Edk-JrH}`!zi~yvhbSbswiQ*x~e^8=4G{TJGmgx1xu=RH+Mca z?=VBf*v{RSL1;CNDs@C6IvOY|GXpSehZ6w<&=|aZW`@iJEGmC9)JKRk?gi&~2{*VA zCLNKitzOwB$k)fozK@J=>V^d`^Y5js%^~yZVW6aT$d!d$^|~qh{%l!2Rz+3c2sklJ zIjA$<0EgC|%!=#&inv9q6Hn&Nt@}K|_Hu%6o(vs(RX7af)Oy`>Cyob9_4>Td8xMV+ zH%y57R8I&ubydS;K28REiVL3oZ#S=BpZ^P zf9CiT-(-Jw4p>jsPH*$9a0@%ViBp;XZTSB-yuS@M53bm(3GUXXjl1ftn_Oon>VAme6^Gu_GK#ZR+=*5QBeyFXvEwSj+IR-w;esh@beLuK|$ z;$O$El}d(PF$PqOEe4fYYcvSDkKI7HG2v?%3(RO55CkI|qPP0-Ut18n!#jz)#{b75 z09i~S&;crzH|Dzc0&lk#X5(ZD|B72v{(}MwL*!nKuoN%xa*Ui~I((53H08Wl=y%YW z{WE_fzli=8iMw`3(v-l>%n8N>FxpP6+%0_O0K*PlHP+o_8<&l1yP(;WwX0OD$tg#q zOCIJ6yft?9<4WQfx!Q$+estR;IioYidGQ1cE!1mTkXx$-)q0wjixt^K5Y!`>PUjio zfE~8UB;4+OpQmfwtHUh)diT5@TVnnM{X>67ggyxRy-%p7B%PkJ_`oyVOhz=5Utb^7 zAFx$;3TgpX46p)#!mLJt)2(3)yNA!|x>q}vil?;AqlR6?dFl~gX@GvW@X=41 zTOB)Z;HEitwKf#4qQbnM7r>LJ9L8!JF~2cT%y0A%^CmZ#BVy(^Sn=D-Tlg{^y8VCG z2))tE;i+HV8mdrwzrNm_Ex!)Krsl8O@>gE@yB+24M#=|!zjw!GDr5#4OL|d4i5kIOMsPQIdmw_lj9|qatlBtOMG&k20hFi_++_s7 z!9WBx2WGY5T->7Am_e2urmz4HNs51>;<_UFd*jL3L$K(HoIM`&lR6IN>hriEr)GT) z%$lK1Ldo=a(eU@2ph1%cRgGJ+Ef3RTS8wQ>*rznDZm)MBZ8D)9(KQ=T>-L_^wHU`? zU`#1VoZBc6+Te?{`tht-F2MW_d5*B|cu%Qy-^D@D@xbF9isZ--Q0FBs8rHk9EtXhyR1+oR+}OYkrMA zB!P`|47=D;FYNYZ_9(;t?+0bPli8HQ^qeU6wZmhMAQL0RIY< zmE2%o$cu=&SDkzcG%rrhd-WymGAzCVXwm6gXg9<>f~JX0r1rN$h3xuT>zzB-v*KYo zyK|>j56}6c65|%Yw$N;!)khev{z*~($huNN=-t_BoIG4El2x&!)`fpnmNq07QcOab z5n_o_be4ACN*L1eGKfd_ItJ%;<#P~m3NorF@0Ip{DDNBQrY?~MU4`h^w?xx?#%IWk z8TiQ-kBg~`LTq!mJ)WeqA47Rp*@A-)V-uk&@m_7lAz3{kB4me*Y+xIar*S-F--Is=7GZU}H&LLU{_kJpm>fk3vVcRa&gln&{UCETWo zn931KsD})P5R3ztj|deF@hF)* zCB4WXj56QPVAzE0Iep#&ggZ|RQdoM`yW-i_W}LpK$@G67*EI3`;^^Y^SQB`t^S*iD zvI#uAX)?Er!r`!p_4881-LB7+?}ArTKTCh%IgcdKl$~Z%YS@qE6gN49G9orudZKvG zGB|LqQ|{L1-phZClUkA0=kg)0J!q6U9c@!{Oay8Il><4zBVGY~oXzs9;sz{c3-pI4 zpPU|le*fa+%)$SXJ^7*2voDS>zBoHE zkCMxbZ#9v#u*P_a<7+;{9R*tU(K`lyzwj`d6?2{n7D<1qhv_gsxni0*%vJa#oquAV zL9dV0Tis;jri35A(!!~6=ijkn_fEo|x2)1@?#FJUyjdGQ*q`u3_q})dlZI27?mLwmacoY&!kS=x(l|^&o0;iDXl|dM#F6C^222CPI*!<66(n52+(UW z;V^{{_s@T`#mO&V4(^wEQBs7G*Bjen9|Hfg41oaG$(PuVC-3Iv;&Hv2ctBa7&nb<{ z#>>5zrPD?+O!~Y$F4L;3Fu`<{u7&hI%~OKWwc@D|8^5)Lcr-o1X*V`-gJdH&Ip~4w zlMG(}#BgbDL-G*7{hH?RPQykAHj^#?(R_*+S|NYP;J0V-{g&1&=B+jBC@*o0tn=31 zmZWhwrH&F@>E{$2nmT)Tu&F@huvpOZ?MrN)tS;+5I%(@x$Qx#k2*f-Kpj0^kp;n{O z@lt@l*Lo{xV|(~$+Ex3+&QIdfuyp_eR0T9HK`rzlsL#6x^}Rdn@#`xs3{|GbfAVbz zBuRf1agVab>01n!iA*=k7MX~YEMOqLO;pSZm8n>{IvX6VxQT}<8o>Q5WRKH!qy>zO z_~oBg6IjOeobFNqLuH6UaRoUeY+Hs1S~uEm4BORm47GXNS!vkzvsDb+&>Ar=(Z*>f zqt=db!KfwU?0qKbSu;+E+B2y*|Ft%a)5U+P1#;l5hGp{$wCQy{5(F}l#2smNjg1rp~`C+)5;KrrB~15^fgCdXI%{drv8Sm~ zToIk2y^}yXypY^LW4N4E7<-VW>O$X9ZJ{zFMci_#6{ret1YI(Gs3;0;^`uh}+iQub ziO~_mz0nYUF|`NSnAv-KV@2q$8N`2Z9daSnBrY2$Qj&!8-w3YOxg;-VLjm$)ZAT+6 zBhzKkxJDm}(@Tttk9ozdTG}51L0YUa%e7s~>XxTTXWaT7!ZS5lFUfz9n+~Cx-rrCL zs-X-YGC_!RHyw|)s0m4qMl4+{D?Z^M7&T^kf;dhfiGZ#iXIDQaS7lLEID5-*@3-RP z%U@GqAZwkL0jYDM)11+aX;E(C`)HyhPu#xogblejvzXN2hjqCyIQCyx%MW6;TwA;R zQD+5BaOlnwwMbgM7VdxTwappe(Bv1uCF2ZTn<(o}UFiU-Cq#h+!$YWHLlNQKa452N zCqy?+0+Zug0oNzZ`ap~GaWly37j)A0B?f_iFTYy6yZSg=jR-R6bq#k%7iD^tT|gcA z$lA=^Z37zOUeot4g2aXu(H^AJDXELhC*7zxuXH{Mm{7?1LIQuXFly;_Mwt9*kn$yWo> zFeLP@{B+vHA?br~;j)GVgYO4JbacW#7#X(ows<0%Fbqe#k_^Vusz0JZYCbOa_4mts z?Ss(mb%6C}#oK>{>B70^s=GV#z63kT*G;xV>NUnb#Ic!nN?Y2!hv2CP>=B^bg?In~ zBzPa6Qh>&L+C%euf2!& zvmy|@wY29w9<|&CcM)5)JixvomRLJ%jIO;!wn5lvn?Br~z89k6;QU5p;gfaz{~&AI zZB6Xk^^=iOp!FJMM^<@3H#6%zvyQ<2-MwOyJUh>9ZaDP87Mr-*?X;fw?3B4>@2)pC z0oGlL5NCf6`6DKL6Dy7C@1iT(xNd|KpFR|8EW4uGudc2kkt%m2)jay{q#pKV{xVv! zo(pOIr@};yyORf0ny18q>Z5Ln$l-avrZMODhMDMjeSm9p(7z?NrCFo$NcP(e!i&S< zb<{BGQs@59@ckX{2B+FsC$tK;@W|f;y|Ac(;c9=p?*k2|wSvY=t?*IM8Qkzc7zd^C z8hzj5?|$;d3Hz$xnYs3>skZ|~OzP}BI5TDHA3Es$aO-lC9cKMT@#qa)dJ2LVIkQXiyrm`{Osa2f9A!)Mm-Tb+5ry|CX5f`~%DdMY&wSBtU2dI_qrSSYTo0>0-nq57%?*FFO1uUo8L^zg2dFMhGdE;8f= zV}=kYDN5xf8y^EyS>IE7dhAW4_UV5eAObS!Hbo9zP>vX`asA=Kyb?Bbe_w! zL<~!q%f?clFdrswD5NzA1})2(hj!mGbklj=(Xo@02%YF8O~L)yTFlJ2@{vcIH9Gs4 z!>R?pF@*^S{GxZJsvv)p+0%)xzH<;tM|`@eo7mhQMe;;le-6`lbg@Rr4AgZ=ijH zR8JaoxXl=5G3<6r$T05qg?lcW?6@>`NcuIYtLG&Vy_>9D=TJp<`^27`#3dU`tJ?(> zP$_QeoA=c88PMu|OJ4YKb$Xu?IP6;JT}lG@P^GddhP5R&%8a}~&l`S`=7G1Y$-p&y z?M`T9_!{HmETHsTrYUK8jlm8YdWy--$c&EAae;pQ^0`wZ&X-$Uujzl>o7(|zQt~gI za}!COs0W@;8P*$rOhp7{45PyhL~yD3^@<2L^p|{*lMr>#5w9n_eSr_hInj zc**sgtngLFsPjh7@U0rsj2HNPvC$;+1v;{|>oPK!%?aq^qX2WwTIVAfhH9xa8u;s)0Y&xIf z+3r(q_<9!pw8wt|mIVm6NFJw^ILY+RlbXsv3zOoJC&+({PCUV9wwtNNj>ZY!8R=i4 z9ksK`PG4l(Xb8D^Ff#;B6{o^d>K~&DGCFLk4OG4D^??s2pQHs>LnVZB5lB*^*ZNJt(~E^Q3GiO|8*1RG0J zX`bg(pxHRrx~wCCF40{{$oT;{5^+=q{iCJWHz|y4zeq&&_ul2)W>a1&ZBwEAk!y+x zpnAY1NGyLqV=gGdyCMjf&!=Ph5w>CrGQSOlD7Of}tZ$JXwYjXBfoiEf!k-yvWtQEb z3jjw46nzuSmoK3ryo3}4(*!LMy4F8ml++jq!I8ZH!(x_EfUlp5G9wzVWWS;pUF_GZ z$!082{!83=L;zYqrN5C9e5ViR=O-OhnJq`Y8>m+q>T|et7p!2B@+B_|qsJrS*q0S~m@tHEdJL^jaMr9O*rMk`rU)GXQ`!%qPi%NYu z-TU51pw&2kIS^}}kmL``3OYDP!>N{K=8$N!qZjE1h>I8+>u1>fO2{@mGZZ31ZhT+c zF#1^la+e*+B8T3QJod>Q$rbRh5=2_K{#J;#853GenU? zGPV>C{3B`;0X5CS!+em$d3Y%PuVzl3e!`_f(~bR@l&%+`LPT>_9^r}_L9a-G2@@)xl0 zQ?5-rUvZx?G5928dmIN0rfcf}tw(&B%FT)=U~DCoXL4&0sgaDr1eQ7&%RrXBTZ!jP zF*I9$YEV1Ue^RGJ9xaFeP`ioDhKz1LR5UU57`w2L7T9!h;^WwOb`%t!Hx_i97_8-b zF6CU!7)4~c*}By16SVx!9k?fe8|UCA>Ez-8dsuT(5g_}jfK3Wof>!`lkQTx>Z92eQ z4a5Hd)WapjF-irDsx~XGIm{GflZs<;F6+gAb9w&q-E=6 zgzP)u>bv*y^!3R{_dhs@#DNJoCt5-Y7x$4kqmutMRjB$N)`5}8aUqXVp5i3w-fPsJ~pq)8Yk4gocXrb%bWE(Mi(nAKN* zg6ilKHBJbsgB9YSI+Xu8%tdZJe2%yGR-h2Il$ST460)5%&z^_~IL1?%QD#vF$`^gank*e+`0bgNIsRWw~w@s24;Z00&4LhzF3YCEs6+!0@m)Mko z(8RF9t0Zcb_c64hG*4$(MGi9x2((3mNUz+US4F8C$1MFi-zZyPrjL*j2`X2){dUp` z{>VhM6v21TDXlIV(PL}{5!n#euzA8S_cdRBZ`yiL`i+qu{ z6cinKFKv!x7mDrfk}Z18;k@qTp*3Fj`*~(AI%cauCCRqbXVOl7<q3YPNk^HWg+9Xm4@YZl?2ac1uSLos<)a#zIwS|vUQNL4xzLl{pi2PV_u<%wE$Ln~UB%|{T`qo2` z)&b-6;>`&wob(7Wi<>}y9&$|vn+TiwNnZKMeDBj;;n{Z=cqkU1OJ5)74!MiQxx-A2 zbI06z;pei2`yk%*>vTTNehuQk*_dUB{2vmtOjt255IL()%rb=g$HXjSW^Bx|FvB?s zO?Dc+4A8Ka`Ta0(A?WBHIu^W>yl+sqrK#w=23+Q;7!v@rUD=7-;B{{VWQYH@` z&4R7MGN4B42pGA`*3! z%QGS<+*wz~X0j}Q?|>EXVZVCDJBfZqIdTlQga>GCAMDt6W;d>vYAIhF_l1>mwMdCO zD;8};&26?J19h}AP7^?_yaKIFeKZXkTJBZ{Hw)sLK)pA4kQ_=e^*O8E8OALCAwrlj zc>uR=5zT^gApu5$UmzibYb(p8{P#|;=(g~}h3=mh)2vy49CNsQ9IxKA_5sAwXo|ZO zuE4fOKnbXtK=At!Sm9;mV&oa8aUf}g+>MfY&lon-DdE9zfW=fKN;O8Nn9o*9#@42jl4PoZ zBxWs}MtXe==_|?W45}}GYTF2YVbRXzzH<=D3f}&Ix`o-x{5Q zK7>`#kFn=y%wx>pYo&w1Bn%bskF_3AiyoPDJteDh@kWbTG1pZWt)kVwy@^yiWj91R z?;{r@Uo0&%YF^lT`Unx%6^2j{U{r9S(6oRP8MEx?M5H!L{{ce#B;7=2`}*6H-Y4lW z;W4~_m7SN-+LucZO7YX*F1j;fBQ8A7KZU(vUmTtke@YjRCnaO?Bzo{Y2r3knkLxyE z2zyy1D}U;Qn?b+STjJ?YX!*lqgFNrZeydV(9i4A3sLV{y| z5JjI?v6BcyuN&AQ-zDc0aEhEJH1>R%`y+!jwHFh4k zmQcf6PlIHb3)1U>i#@nlTwbo?>el(<=I>B>)_9~o@()73m`61vIWSOGA3A}5sC9?E zO>}kPdj|Ow@WH_}N{XipX_ZQ?^fMMjeL4e-IG#t!zQ2yQ z={o82k+}^ZcQ2nAdN0T5xK|l}XLI>>zbzcNAMDZpl~=a)R{F{-8+!GB<&`0R{a<-yplAPAUK!+n+n>O#+c*{= z$ypyO0>z=|5IQ63Isc$!|G@Y8(APyNCFXMJ~C4!N89W9@U$KEP=mmhR<) z^^L&}Hd#OHjMWQ8d^(r;v`ra%@v1sK}u|Ysuoy-RQAZ2#*pe?G1lJQmy%%(ttiHO(7 zg6m*DIxyD7{S)%ZU%}NNZ~TutLk^}c9ujX+5K;n>IA)Bo>-6J)yUxLChksS4f^DZV zJzN7hpQ{eh({#LwGA9vlGPeV!q@y|L4 z^br4#xxe4;+!bqMY2mNd6;FI^YR85ojM8PjZEBuzw%H~)9TlL*u-{KbwS{9?uLtQy zz*ZOm-*CUP_N3x}e>b%MT{pDroyP(ud#(MR{AzU_YtOJ+lAKFfhpOALU}VGyM~8VI zf1)^fZgC_Swf?Zf}@ooqsiEUiqpB*a(&#<@jG5NPC3iI~&sY<6C(p@QkiN9l}IO1BeGfm-RKjVCo zQU^Jo{I}@{J(1symUKFy+?AFvp{mP>=rx@yd<%_&L$T3IXx=vP)(<_G0k}e!A_M33 zvCWEbx*k3y2nPS~t=Mc?J(joP%d!N4I8yXTktD?0fH!Ke4ft-^6z-N?(^E{Cc~!-{ z>fT;rCfo&o;G=|pxCguZ9#br-zDKu0Aht(Al_Pr$IRDz)>wj$`SWSd@g0IQM`@}EU z;ooyJqu@M%;8==)J-j?o+55$QuD?8X{w>sBz}*8)H4X#9+l=1hX+Hf*rsTySEBVFz zl4pxrjIoMOfknY@a&ZleEyNC28V_=>vJxM)`d%G>?s#WLF2%jnRTx-VcnN&pMpQ%a z%Bx-0ntI9Yo|@mCydFpc2!gg>LEl$)_|-Arh4f%q)BJbiDu4+*%ak|be#L-G3wJMg z*KA2J%gXUx_p+aNP!a+jRR?rhuf<(41~?ZV2lUj5#*q@st49~xkQ0fvR0lMr>#YWe z*$Ci&aG`LM(FWseHSxTRsGE@VN0cd2p4C;Lo(%P(aiuKN6{?KppguYN0nD)YS?vq5?dC3t;7&RFIxAh|MwzA^{RX;;yglyW<NRQ1jjcgY?~!tR#twcj=5F>#%$QhyG;b@-;I zf>q2^9Y@`{qn!)4c;}$Yrph&$X$D=txWUaWQvFdy4OeCOMMveUY@sfH4tmt}+hX2- zzZsbgx;cgA_P_o7vyU55p0)$W7TB^r+L0fU~x$o^sv5WId&dsjnYpx8Zch zxWc8+zVh$i$mo^Ib;*N_37LB=bbuq>|Wqa1C;9J&K=Zi!?&@celfTO!wF9 zO|`KAJd`VH<}#WCnFoQlZG`O_@YdARXN0_*LIPE6Qp2n!;BXHDk$k4a)RU?O{_y0J z)8o(YU!0r?I9aLr)PiF3eD)qWG<2}&gVjQwe|UP|f$;idS!OM87iV7_Uwm;Utlqlz zxOE#6v9(6ri4vRHzsideF=JPM|C-mwj}ifH=t#+nw{>p(B01#7F;bYbwLhf5&yu=j zc9F6=y!qe)QI~~_!W$6HHI85{7kzgv3qjs~IFfZ+$BM0{=5g67vc@WN6jBQ=f`nN| zMDs8ip|06-&NpmCV*1PuYvfvas0Q0tgEIV!^NH70?gkWQq5M3Q> zt1!2&f0!0;=+-TO&0AYMs1Psv48s(jUgO){gHb@!ssQIkwZN9PieO+^7dSPh4xB3* z;XbWWa88F_FpvSBxL-ZB0R9bKc=50hI$Yo+#M*6g!;bIR@msT1QFxKC6i@BVEm&20 z${s1^pmjOfcZT`ErLZAKCQ{Bd&wTq!(Cydh<|H>dy~j`81Gn(U8LY9K8ifNv(C^H z1<`8&5di0=jzsU`hlFI3KeXp5!Vro7DF{vUEa-9i(fYc8J6N25VK2-M+=JJGj-u^f z-TJh|FP#8IbV>n8r+BJ4_GXgfdYU+l#3$OsYZPjiG|OrG0~=@*(|yhuD4-b zA-NqON7~cI#^O*7lidWGN-z=Nm_5!bUo^X9-gwh*Q_T{8aw8!e*DHUs!|IlWiR%{w z#MR43ARkt_IO9+DuD!W&8i;=t1OKEDGBo8i3}vR!18#33%zUa#b}V%f3N6v_a1kyg9X?n;)W-Jj97_;2c3+QxX6?d5a+3pyA7Ey}m*?i!j+ z-P$|~UqJeQ)3@M?{tetgIfR&mbti2?@r+js{*;#h-cUxu=mqAE?eP)025%5(9p6dL zE~#unClos$-;GbB&QGxas9cR8X})jtS;P*$i z%+uZWaCp6K@8Uh%xX#lVY)DOxi{Q8E9g={Z~g$-~_2I5#1GYUp8Nnu!To*|k}TR*syR8>Hls8oKA? zQD^Qd;i~)W3C|y_wKJ$gV%~J4l&d}y^V&JgP?>r6z*C}f^I~14MRwk1uF@_$FY@78 zx8R;E7I{Vmtsg)p7f*S4&lp?50TNnT@JSdhLe5K@@AIpCN+RH-%k`T3cR$|66KL*# z<1JiYNrG8z+6#mODXT_%g+(=xwDu;Sj=!osyLBIK@oaDgx1c^e40qmtRt8j!Mhkwo zrOwQ@jJm9)bukU>6wUYU#wnQS#`THtHM#W&D=q91!o@m-)YSTey>2JVXs=?t!7?eG zA)eUyf>awLPNok<6xKTmIZxr?)mI8>uB8yKF9< zr`o(-J~s6YWT1L&Hnx(me5C4{i;ZmRV!Np#G7}p~Sxc%T$IpAr!)9OBxT8|W23gqH zJR%93M&eCIJVDc3T+8^?nS!zRPQ_A#U3l{r?nsKA60#D@PAm+Q=q4NgIiK&(TJvyP2YmJq!D# zWZdG@B_cnYmI_VJwvr<9djBWc+4nhpIq_B*ouH-fZMw#Ud=OOD=!ximgOcucyCVh3oCqM!qiFn}Dul?)t!9pYH_ z9&iLe8BxdrDD=MwEP&&R#T7u>I9LIsj6xMa!U#|SB-L^{15xpdT(LMrfYn@+DaHkDrL!gvZ=uW$-l za_fI6e^euDPr(+bim(=xO3$pNv>9nZsK%r|7iU3gyTUBgp6Z1_7PvNen~eQ=qDJt{TW2}J5cClFyAasoc9hXhW*acvhjVcoj< zfSNEQY6AMw_COQRo_C6w5aVbMhzZ>h6B-sQc|VXVi;$y#ah>8N@b75UgmrGl@4V_^ z%D+8YLWDPwv=Ipn`w-QtwM|{vbD%ctG-Xr#n{^c`1vjBT)kTCBW(1>t~2LO#e05ob>l>mGORtlp)!9 z+zjkwSJ;eykU!B)B_E6})AMu*<>VtcWaCo-`jowjn)KySoaz1)MZluVF2xd2O#8D4 zR^gXvPAo^tS>8Q8O*^%Rp$hp%p!$bYhCRgN`;Y!KUZPdtDEdQvMax3oq6E*&zoNU) zkBA3ZjmLmGkB(tX>hcqMu1fyiFabU1fdl(pLHICuj*2V7~2+Xdybr=9fKkgJT zqny{(TX5`8hB&7HZV~?QxF+T)Iz`Tp2558V-}qb@EGLfSRKh?S6XN_28n)g7Y3RkS z;lyBn|2B>N7&?-r(MxtP!ToN%?7x5xqgNyNx90SAq_WxVRD4f?VfvVxgT-Y%Ov<*C z@?PUj3^5yb5Nd+1`>7m42vdTCkPCzs;YHB$<6>Vqe&h1`;zhRnBsmg>=zYqRFMZhy zf6s2vU*)!0;s+&woiC+?BE5iycs5{})i@%52E7Q+eB^nTcZYm(N{4Xh0Vi3GflfoNs-~3m^q?Q8SK8A16RmWg| z(dTcRoW8a1h~}@)qU*ele^aKVJe?oPQznT&O(ZN8Y>X2FS911z>*{(jo^$Ka9>k4vhxw2q?lgPD2`#i1|fZL!<scMPr~HC$TAKCB zDD8Qr0DLHdh7QuBSx)K)SyS4MWggR4rtH$={JF2)Up)2dQfp_F5#Y_F&nR6$_Ujkv zU$g6r0dqp4DlVAJ~HktOdxHgU5S~01~T!q z(I<9H?li0&v0qSUSUr%n4E(HptyOM;=iiJi%#SfjEnLA4JhS(8qsoQdUgJ{BHOFW9 z1di`Ko#X%Xo=I<({3V*Vp2?}ZTjb7Ynn|V!^G@IDoU!H#&wowv%hf%pn6BT^FWWBb z6{kdcsJP4*%hN1x<(M!4ZkUUI+i8zI?@~fw@5}p0>f|Xtp z;a#~SP=D5zI;FJC9h`3s{UKY>;9{txG!f#b0llCz+yPx!AqTcsp{^qboEGWB z`wwE*uX6&!IJX3yNrT4i1`-{uV4M5mdPN&hDa5`UXZhJ^Z<3bv*xu)VQ7FP`=;=oO zsoq=_G|oG`aPnV_Ts7+7quy)S*wmY)mA@q*dF_DwIdik1~-{XJA@na2J@gD7P0l zTEnPL+0h`hG5U@`oi%A1M&}{CS*%mIS^cF-H-b8Y&HA??B28gtsUQMnwt-KbL1Lk0 zW9-4atT}A{K*$(>RPWj%GI1dwBV-360W&BsU#--ch(k+<0U`#l63dYZH?<2t22bgmi3stA_c|Y^QWE^@Iw-P<{!nfA zV|rq>&hpszdYfa7n%o!wYDZSL{*aN#j98g-+b+Yx<^gPfWTLmQ$XKMuVo8VokG^^GRPcp761{xi;P%k<-L`j!ZrBsFvwIUJ_VPUZ zSQ?YpQCok1=t&Yv)e^zUcr=aa8BSxo1NUs@yEqw_-`y1m{M|h*?h6W>nF2gA1XB2e(qV-%iIZKseJYn2@qi@l?ci@X6i-_7LL4CI&=2UY-JpHwuI$Z!=lCGDM6H*Og5NhdkoO#@qBZ(zXOHPU5@4i&N7! z0OJwUWQ!o_Y@8Uy!;KSp|A6Dfc1Iz{xo>N|)xDsI0Ul?I z3-ow@v+ojqu2#h%=n`oNLszO9MVC6heH>j9`+%f-zmas=kHT2G?Ce`Z)8+2ia15=C zLewS7u9&*y*A`D#85=}hQ#A~tE=h>R)YTV&)k6ChLKBtxwV<-3m>3XIVigM`TIj9% zLNQW_7DiO-EQ+XYX+cDlLNP?O%tDB29plG;Dxsc!s@Mn&S*07ZwhWFeQFKO<^P%LW`rL1?Mm1kO2=feA(qf6v%lZsBOD*Z|T}X(S{qJ@N*B z1*N4?ZW)%=lWBGS08Kk6G%fkm7Qt!BrgsZZ8|!cn5Vd_n)an8z+iorz5~h}Hx)q?> zNWXdjtBrMy0pV)NBHIM4jdYF&(AqvgYeVZy0JxSb2Z637<8A<6OFfH%uZ?uD77(`n zIhs0!CE9%$Tk2+KAltS;pAn};jfQ%EfcxA8?vqs6J2E114PYZ`t+i=4*w1F1!~Z$> z<*peS4hQbo%8%>r)#B5MH1UiY8dyszZ2@da^jm?pEF@KLyE-NkwOz0y6N!3(HA`AT z=}{j$fay`Y_E4A9Y;#;aVskH$^>)Ye?k~iie-ulF z@DI~-H>c;l2EiP5hVCXDW~|rO>*$1kcJLaTjmxZjr;t+r?uiQnS-DcHdi7gz9FP2( z$QDx^FD|jy=UJcJ+jn}efAi*WO%C<#!^@Wa9B!YP`ZR-m4J^f_LiPT#A$QnF>nCw| z=+t4;?aDMutm)W|Y^sp{RTV{ldU{l(C7tUqUmsh(I%?~B#*iB#S^_p7l?u>FS=E>uf~zk>fmUma|cg@k^g#BeyJgs8>o!SEnqR$M_^(l7!vS zq)cy|G#yBrCTUTL(2%P!@M>;&)@}H|jr}7H)=UeMkv5obt>+25 z+%<~2ltWSHQB<$V=H74XS5~MxSA5EOWe=!AHS63fs`^7~cGmJP$tH$p4r+J)-O=pa zIFJyj>A%XrCID-drT}Yyb|ge~`HV#a4yE>3lpPS7mI;m0RgibYHts)n<4bl~Sr?UFR?vp>%cPzY%!-b;%`m&Sd0=3K^W_4SAw&1F!H%Ck zIq|c>uF`W$%h_Om-y9u#`CXQdQ@q-xZHf7Ud0S>hw250hmqY>fT3Ljc_!?UqlanR% znv|u14&P?YX<4i_>8IQB(B*G)v$Sr=Fy;W9j9Ox znU5pNGaIClk?Nh1`;|6HORK|KT1uj6T3Tq6aI_L%u=SUJ$<&gH=2R_*a4eehlC_kk zYqplRx!uekPf8_eE9fYu-ujBA2j zJT8|jW#S=!levn)Za14tgoY>MLq6A#`CNrxZ7-p#(aYj9x@3EcF2=jpGLLIBS9{3h z>Ym9JANAg5TV7|a!2{o;Bcbng=zF2fzQdvmwt={4sjj!|L-_j;;qSX>=-mr}FM1Xo z17FZr0w<+7KK8w6u#Mn%5oM3#8lxNwIvq*J=d5>skhp6h@G<~MtHU$jb8w;A%Nw!m zWtJ|pd-Ud7o8HFTn`UFReL@A_XJ^yosE)l{ zbWsQXM1vc!=d<}DukZFG`dw)qkMR8dniVFmJJ7{)G$S3DYi(PuFIhgf;x)^a!%J~k zjCw+Ug;(_*EZSrtm7Np?ou-J1>J)CCqWogjl9UDlJEhu2cDgUOhviQNf$tdHS@79v zbY~$mHoUVSSB*vob{6#aF0#}1+Xht>H2ueR8pb+s>%FD~$0}t##&;GRw-?}92#kyH zZ0DgxL&rhyQ*fv0a?myV4)3h6-M}wxh^PF2;Ya@%F77kRuj7XlZ(H7c6ZQ(2)PsMe z&A`vN8-M}|&B=1U4aZIa0o|kKwEg?$G0?0QP`SI@JH>v>8O zGrvmDGUuXpf6s0~4sLCr(Wm$<)F`9F*8j-$c2Jy*Fi+BQ43z;ameO<5*y9U?olk*( z401@ak6^qfi@f|eqCALmW-`mcMEqp_Gh1eK7In#ctdqyzo{o!<9DwlnJv&E*K6!!{ zf4Ei7S?c4K^w zM1ko^Jai%*>&@J`gFngLM?6(2_IjAjpr@%uDvMjzB zaxTFwWmp%e$yF~rd42@Fj&1R?`r@CU*pD6K4h1EATQA{TmSBrn!WkTWykaYlcEmW;%D{6*kSAgy+CsiV1E4qrcrtZec_I< zldiOrW>`8FTC#L00F}t)vh-M<87@EVQyF9-nBwSFvnyHVg@%sBUuV3d5V%)&6U1kJnhBe z_iUWJoP#KQ!d=Z5=kOOeY`MOmIq39orRxN+&27tEzO7m|$ATA&ix;ALn4_;=WlKp6U}%(BZh9A06)aB!`KkDbrK zE7n?z2!uQOP&aEK8`idRiq|%^ewLyCtzmFO1nYQ+wv|O2Z4(E7)wXi5+BP!-mzPI0 zY1eA|k<3n!z!Tk(!Os}gIuzladUaD{VG3k@EK_`~;F1bte+uh>$k+8nyP%_^zknCn z<3O_)xBI8ATk^)8`PA;rr@@^$vG^^Uz4~qCY-p0v>?IvNXXkrzqD>9wuxbkVTkglp z_;yXI@cB7=ITMe6W<7cP*{Rvjz8(IjZmT=pWUD(Zx4NpEF}_?-+~Xwg#<{2UN8g|W2 zZ-&}DJ0iO5p{KfsHpRfYzT#QCUG&uKqNO+>gSOWj@1wteN>?LN%^qq=|NhnDa`cLS zxZCV>o-f)e4n(w69SE-~uirO-slEZ2;@V!(tHEx)155{f2benV0MqI_z_U>@edis0 z378g&kq41`N&_cU$!A|4ef`Cw~A!z%04i4leS7781>j{Xi^X%NumcWkVbLh=C zalr;jzy|jaU`?Qssn=f8#;&Q>YJS2;~p@R!*#dvQaf(&1{y zKW7vXCGz3|E|=Dk5?>sTIJ^rLHXt!di{rX=*b0J%wZn0HSfHX|DtXq&tbLLtG! zmqTz+$7^!Nkk4dUEW5Jw``Ksl#V5H2Q+8`19*k4ZKw)CEdj=Yn$u-bx(ek#}^7hJ> zw{P9@F=$wfYI-gie?b3xftoQpeV;d7;Y=8RGU@#xN!|g>k7+SXc9VO2DK>c;cY}+E zu*JalhgFlGOXufv8U+EscSglvK6GNmXUn3gqP;`A2IXZ*BFtH+jwi-*Y+Fo|ORj$D z*)hR}V_lU6S6Qr6R8l_+56DJRjK7Q}u=>E~MY)Kr@^7OiY z3h&?FKb8u-Dvm4o>m}Z+VQTIVCB8$Hvbt(muVtluISr^L)ZA3#!w+$MGDx+z)GS*r zsXZVwsqap+C?)Ql-SK*N|M-Z2(BD%1Dy&i|f0|eU{$qm%Zh}M<<4cvE;n8 zR#%sqchOKimW%2_+!K%O>&0Vx!!FYeiUg1iiqgfnkvLJQS1P^h28;-mh*S;WR#2-T zLn(`-&MO+qLMRD!=!n>@L`aHx?L_h!OXr$sB?q>t0M^UY5C$iRcjH6HFw3rgIvKT> zURjXy6sda){Fir^{F7penDDEiyGf%h^v@>0q|-s!0QRW1%jFk&A1sz%kMQ-V*|WTjT=1e$>`Wt4c{6Dt zC=80I&Oey6w<-{ro~$DkzdX7nBd;tf;FX zF;dLfOCRH|q%EpGrrRO~lzdxmvT)xCJ9ikAvUBHd*}2nUpw#0g+Ugga zbmU)gCvVur?OS)z#(2vvZnx>8b}Qyx!|Y?twC{?pJ9tKGgZ-BQ>Vk9=^%s8tl8ZJ- zeib9RXhQPQAAsbeHb{OQBl#%2(Ur~ahS!qUypRo)m=B{K_Y;x=0Ep-1SnpU@?nWXw zue!j#Rad_10KjHwRJ7@T%B|&w^QsH~TXp5@4jEXXMYJlI#H{#pWK8zcsku~JwY_pK zc%xpU3$ZNfkLQxhmfiouCv1n{T-)+e9p0M{K$Hr9G!Y4569zW$y?BWu6E5PXb9}pg&7ko z+-$CJXB+3G<$mz?;aH$`d_1~-I~4=;*XDv(!O{c*A~Bt|vGF@fu`r(G`b!wn*|fq0 zA{~|}9u!EPi!0<8%hGQpFPi_lrgD>8`n7ZpueSAIj)Uk4V%1FrXwVfj7kt0D=XcxM zj9^hvlA!2TNJ~(EK+$|IhVQ$19P1!u;K7;RS4GX3N0YF`Th`9 z5HQB@33fOb+WIO9;8$q+oqs7~>$facYx;=CqxY*wt^2jQ0xt$( zJy8YWp{T2B+A|0^((TK}21M_U4*+6oBeP=*62* zVF}&vNw%VY>9(%qS5{KKFy87*er+Y?tFnWKM2YsRuC(oA+f>WLtE7Ol`kn4r2(KK(+&6dUA2I^LC)RPX-L zthj%_W0kG2P~dD*z>mnv-$(hQ4&XqizR0jVmW!5uO`!?4JAU=vBk;!B=soHNxtC$? zWt)*_M3aFRa>@AsrY+=rtJRRan=utjhk`NT5J>CDMioS-f}624Zf(zJnPn@NEI}E= z!AfH=F=Vm6SIKUE5!ZY(ST(e3%UkquG}Xy`MpR__u{T|DK~Rfi`&pFexND*m;WeN3 z$)PNN3WpW7QZs+6%k)5IKl2%&Ft@W`vW!c_`kE&5_4Uf#PY%mjTYoTwxHrwRw|!5m z#&bb~a;lcA(^DtKeA>^Nl$mm`kUvD4zaS;_&lo==W{S+htyt=60sy)S;OzRpi6!Raebt*KSd z!p87k?;auGVqCEq>n1jux)5wWg=TyW~M)5H5GKY53t?OO^W=X1LYG*hn>caJ7^?>?)~CfM4?I|#0w&(bqOJ*l z?Rqj_camqGdSPeqOt;dh1a9=t@cqekgt!_d?f&|A>6TI;FT}5X%QADv|h3_V`b5VP~~@ThT7TDn(>v zR+QSB0_iTB-E5c@j6XAU<5p`0jeP8X1FTobkx;E3VA2T0HJ!1{27@JBUAAbtv_P1C{1D27=&R_AJRtp+5t?cjBPCD4vl)Td1w96Q6Ia1NP2Wgn<}f!{;OX{<5orf zh^}uAU5IGA^!G4FP)?Z^mha&7?XD>t=x#D_TbQo;5j;g@W^5xgmQ|8i4QZ+~+JKFh zvhk!CrMW-W!-3be2A*7Vd&#$dfxiq6p8TAz!xJdWF%3ZA*gSge1zZ1G!BYaRjiZ2_ zwwW>W98mCTd>z%0bGER?*TG>+;bN!7H z{rfbSt&!4O4MQqQ?Ets70Nhmy`6~jFa&oh{o=h^x8UINUP;ix0#Qdj!(epp_>a?Pi zy>c)P^E-$hdx>gqksP$;oZIAfgef@Y@aaBJYDsd4FVycnFoM88s zovUtibZeVwpivyiOlZ|kh1GR83Mdftu&yV0wMN*X=uBR&C6`e+ExLBxnu{%OJ=gV+ z^E+O#h>4cfz`T-w3dD@FdLhFkqqd@H;V6!6Aaq3#+uQRxsP4jpjUgSsIy zLDN>jBLp|YK1WAAt~L`*;+3TQUd9_HfOcr#qcRjYErlb&FUn72z04ftW@e+pq(52&DSz(cyXhl^!K5xjNJy3MybjT5f~fIONzB2ki=R1 z$52Sny$y*3!df(HGiUvMNW|FQhC&QrEdt$a{?sU;x4{+FV@&0*IBLbVx2M+-o3WuA z+bws0|5nj|5&R$qEue?@-c4YAA=LPg`Ni^8F%565Pa8A^&{R|}yWyS1Z(~piX7n9}l-RyeNQu>K zzF|m-c5HSbC2kyXMJfcBt~3h8LVqJh!P-*uSF^Zn6ou^;Y`sAgh3z|yqHseb7j2OI zswP0eO6Qu6%t@QT)aI#lb|+X9EN!U?Z*jQsF^>eXIo?M7%`xky7lrp)rXZSjwwrV& zDcx^>-dv_*>}=kw=dFYa$gLq(960zkeR*`lzO<4(!tO4@W3-X9$qmC})LT`5Sa^)} zyV5>9MnhNP@EDKUhR0ZIq^vta?w(^n_l7)k`sgnBwXdLJWtSZC8|XjKqNX#>u_Vb$ zaq3}D)FAY9Sd|Kv*=&81kQz0Vf(R3qTuj%0RIjTEx}IWMS0UZ~2m!u-P~4UECFs^e z;m?StvVOO2%_fVJ5(f%dBTkA9Fk91m?H(}z6zdCibtYnX$izJ_?A ziM-2ImpLQ)w_U`?*rH5_q5iMhle_Lw=VOIR#BXe)%~hS#2bMi7XlGONGCtUPCV8 zU6)8ORyT7?(ePoeDI6jf*NMbB(h!vGUDnG$RBmzSoDUW%pH~jjhUcf%ire zI9SL>1GQ^zZ`dV^XKw1Ky`9izcQJ;4f72~JwcGUiZ|kYOeXXbVc0EgO@2UNjA8q8% z^3?vSm8bSs&0%rWQyZY-GoI*a;s@`Yoa}$_p2TS9Cv@q36CE`uNzoIwX89;13j^4&-yZ+w-IODn9F9=+yH2lv_wA?C ztb}zUz`u1^eS0rYU+jJK=?6`3(L5oq9X}8po^aJxKX%N2xLV1{qMT(T;7|IOx_}(( z)4?zYUI6AjXJ3##Htcy&glcl1Pv7xXXcLUuA?YPH07u1K9MsCJUjR88xpEA|rW(~s zCzC9lhT!SYM;_b~rwM)j8n5zy_4$+&4+s-)^ob-bpp0~Eik}fy3D9#r3&b9EFL*^Q zCOf~I*7Ke~`bAAoS3tMM^HL#Eya+{&l1q+psP^b-K?wsbPUDt(bPbO`8a(F>~xdjgmK>S9HcGG`n!-1$i zvZ3kMzkQ;W`DKg8f`=`CTo#_(M~<}Xzvcfz*OCwKxdbTJ$p4h5?N9;uIznDK3-e_Z zjtf==sz$RxtzMNA@zK1TsX{Pq075TEBy=`?8l5$T#V?tOs!?=IT~y!To8s7gLJ$Kp zCo-bcaui5x60&^#5Zo!&>|V`^U-RzGr>Tl(nz+1ttkVZU!lXlg7n>jYx|XJ*Iqoi; zUpFcBno%}hn{R`lAjR|nG@WlYbi&!F_Kl@fb9tgOq|#D2hHFqWCJgn=rYn8iP2T@Y zla1YE053q$zoTL!24X&^I{ec=pDl4>$U)s%6qUCE$5aQzKrVdB>;6k6G7AQOm*?^A zmxI|G^Lkjgvk`f7(X1jpO(3HMGHxQGOYc`DyPJ0LStt>&SxdiVQfB?s*FZN^azy$C<|y6XPB2=ZRtl+ zqi~8$Qg@MFdn@Fvg}%KWbm@%OfDeDu7IFbhUyXLFim@AMEP#1zO&^BGWFrK7m20-8 z*PNCSK*mK>#x`Sre}Mun#?Q=H{Ut=`l1P!yhFP!IdklEw7g2SLfGF*^J=}BR1q13N zNnC3e@0fPBUfkr8-$FhuY=mBjkLL7hO0UNnmugAqi1q3-3KUFk3;R3*j1XZU5;sDj zHp7(LTvFO`saN5NHf$+0v%g#^eVVgbLkrm{?M>5nXHyG#e>^8}_JsnKGB8R}M(*!d zve<%e$XnVSmX8vR2V88er8)?F4ViE&6%$Gld1+LNW|arN-C8ZzWti<9l{65`3~yx# z*bTlqCyHq!veQDje`O*KDW%{7f+>#)wNRZA=6LLN`pY!e#dKrg7X`R{DEFmRh}gRevZYBO zTE0`Ecdev#J`9!hu3EnxAH_dJiQfPLxu&sBvv<(x_Kn?XAOC1h|7jep>CPHb)>Jf} z_M?))ByCADW6C#Al=72yY`qo^?`hm5s^DycAV1k_f38VYX{8qI0kXypnJF2fRNTy|#EI$;mGcZ6HF86lpa9$RHS!-){}m)W1L8j=kYJ#&+;PVROGasGcAH zf7A3{BzwVObi^I&uPvt{Nwme36$hr?*PevevTbRB)GYTcRv^vHvje=9+_~|*5VrHD zoJ2(@f24@`)KBy$+6_#YzXb|^AxSC-7<$nd&>WL+C(>>0rWPfs2hBH7+llikU9_&S z*AoJ2z+m5CaJRNL+Z0u@*{M*Kc#)Iie<^!1zJKxnUmg5-_SqbBIHjFD`|K>`U&w=i zL3M7*Su=NOkWE3@fmHtX4AnU=D@BWN{E>`8^T3~C2H)2)s*%G2E8+_{OY**ChnzFE zP>~e$W-^%;{fvN!=U*}X=>k>Cb^IfN%}U?M{RE}RABuemXky97YRja_g-}5Je@Q5* zBsz$C6oQR}9PC>tFsQbaqieb;AEvzlCTn6olfs-kUWia~DL%nZd0G>%QoW2q6~QCd z?BPt@9DjgMvpB(9lj6Tsp!!rC3#kJ+GQ>Az44`Lc`IwlH4$sc$IP2^zyVP&pOk>Uf zt=Y5BcEx$p!z~4n8F>w}xGmAze<$EX%zQK%W+P&QiD@d-uRZbR2hWVuWgJNDxNU&@Tn#bV|Ux z>=)zGg}w$lnZnnsR0Pv;6?k*SA5dYKO{uO`l2f#z^h=twv#@a&WZ0GSf61f(j?9c7 z@@$$;A%|d41q%`5_eG3P7?B4ev1ptD%VA$$cEJo8mSkZONg?wCI56crAZy4cLW~hm zLVPG+iA_b9IAw0I6QgXjbD3$jg>?k+9TE$w{45b>C_Nt&e`y$y7-vJ`_jDnnBz>6X zV64cuC>B&?P7bq6QyhV+fB3>F5X6K`sa&(V*bdcf&jekQN5^dY7Qc1s}2<6|O3 zpJo#UWkin%MkHW{Q8Z8+Sr6y#?UE1YqjU@c{E|+2GW#0Cy6dch0ptZl6$k7LCT_7v zF5Nj)DH7Q4lhd@i;?0NZe0Rj!Ame_shZnNb!2*mMIFWKbaJ$@LfAi>+5V)z_s1Wo1 z5osEt<5+ynejt>!0uY;#=dxlY8fX8I&_kOfuz(_UO0A@L6LGX>*}#J#<#j68YHkn_ z^n82)SE=bjNP~!<3sH)I2N_PMKMCqTWW&5)Oh{IV4f&M2MZbT}z=vUG9Uo>hhxsH0 zK10`WUnY1mJUTjge-CZpV1(u;h$O_h6o2{>TAkc!b<{?aB~O()QOZ!%m9^7$4>6+? zx1^bzhh<3;MG=igY`LlYtMDVjDbrDN&nYr928WK!cNaDUf!&>t90Qtco&7Bon0+=NDU0}rVtIck%{4ynIb-tyt#717~& zcI5r+lf%<1e|9!4Y3!H;I)1w?yC=}l*}>5#r^iS4@9)2RUoVUF>M=guKlykaoU_ZU zKWCg%G)A?rBu(rTIkF>7rK4UkrlQy4Oa-pTb^qYB5!I9V`Bsc>H=r>q=@J0-f)9(K zUbi@B*EKRCt!v$+H~;|2T&wUMx$V8_BPCuK>Hra^OO_Io{Q)Jb0Q)4xU?nT8+SAJ`?2t{|9lHM#VVo>Rcse?^GJm_$Y7Thu-Y@@NR9UNfkB(E`iv zo{6lkym01BHBaFllZnkp#adX>-(x%RR2BwhvsJfaR$VM->Ni31B`KgT^;u@=>Ri~v z63lupRY!E=O!oy+rsb?~%N{~h^;@kiUYc0eng@4dlW`$bl4WGu6^S2;$wc2S# z9=P&$A=1gO`DZX;zzB#sA)+%XQd^K@e_+!oa`dXlG|fv`OKxIxa5^H;EbktFtdjZomMpTh>o8?8R7o&JN+;!Gx zh!Y_IXyLRFONt^56Qyv7FPrl&pprTv*<0Gmv+4xuk!ZgZlY{y$3+Jw^hL@Wbpx}Mv zrc+ieK3=9QKJ=!)x?;kybMQ$df0_t-DK^*$vul#FMw@0o$Wp9f!eWMs*%R6;w4u(M zKk&0d+qBunD@W-W(SqCdcXdVuSlOk^;gpL#w!&MI-?_%rd&$%c+(j9z?wy(Q*PQG26eEY9Mi9R$)r(CfrC}7qW7e^fezI$BJ?9?VdthF-*0ka`DJg({Lzo<)_7Nzg>NV_co! zx{Sr0x=$c&8=;Xj5Dh}5WS33qL}O2SBADg2 zA;_>jh>1N{`hGduIe`YpoUuox+*K?RF=XA#MupWtf)w5LyGA!Fe~vCL_*gG48L&f2 z(&?b&9^qUNN#mQ;eUJ~J%II5uwS_S@5Dae}us0B=$V2Hk5RYw_L+ z6hW00IC2RCE#(Cj~Jqw9m!V!|`x&zM?Tt3fkOXu2X3O=k=A5+;C_Z zTZG7R{L?;$?z&t+wfv0bf`(}z)%Ua}nr{|Hh@ujgmr$4gK>BRR~}DcTwHIWYq$*bIw2-B>50 zD7hP!6Ef4tf7Hnbq|%U0Zx)@A6dqZK^vRw{~JULP9-_XMj z-8Qt!TJq2xQwudp9Uevv77A}H6nZEG6(*z0qqb7HD~lRyj;DHbPh3`y#`iPY;3%f} z`5s}wdvvHU4*goWg=CC1X|Emy#`ueO{;Jt~`h$WV zYf%Y=VPBHrt&^?xi(XbB|1TQ`NiC!ZgXbb(4wS?^iTmTc^TvGOr@ZO9Wt@?Rt%A;G z-P9SHULuI_g3Z1%A&zn$s8pjQyE#zHk@EjbkFt4@EV zY(Isek`y5gIa7<7qDP0V6FzTc#>xnj%>!~qc{uXgtxN$XQ`?Pc!ZK$IBfJgA$I;%T zQMa2r#(<>~(pYV7Lva;yz%nJxelveV{#O%e4*u`{3~O!_VH`O}-%yq8DFyA=wIAGgpV&ll%9F z6l(oITx7N$u;b$M+|cvq!{Yq;kxMCxGJ9(Kg;O++zaB{Q<@0D0pIi8!e@{lK2(JRD zj2wfY2&3hS8EW|OkZW12hYfGf0y?x!D!yGM_geUnY)0b8w0{?|D@Hj>IY0e~Z1J5m zNg=CdsJk(guaiM4uTpZoOr`_6mn+{kT=mqL2SmutaY1q?ahvczvifWvC@Lr;vmUUw zDau)4@rJ4GRi9_#RVG+`f5`J?puQ*mvPv5L0;D>#S~FxW5Fu9VS)^R&-il_AFQHpyyl+gH@ge~&i5728%j-;@yT zdoymfd2A)4tz#}}JIC}39c@(=<${V~t7;P1>euW7V~BX*$~cQgtB%TI>JLYr*ad9v zO{HVlCM@%ze@bp{jwT^LxE(HAF*qAV`qIc$cED)n=&LbD%~D*FF=#3_7pdH5q~jP+ zWG*(BzY1&kzw-;Xf5hKYCb8FmUnEgD?pfIC3$_MZW4+0D+=9rD!Eez5YAF23>Wx2z z8ZdB`gfANrXq?#UN5w)4GV{d`8&PEVhKLE9a6E1-8U`)frI4j-G`tk!Ksr287NtL7 z4Ii0|p-EbvgaLPpNxk3Wu}e;b=Rit9n^MeJ}7jQ`&8bh%lv&fqVTXmll;o_lmL4h~(cy6#tr ziELrYGc`?XH%fFW?WZozFbRe_X!#x~=%n3eIX~ae4*fc{_r6wIZT#iF=lB{ zQVuHHhD64Gf8S?cB_;IQThnE6F>|QYxtykzBVaF= zRq4i>+?z(mkfkxcZA)@3H!Mhf$?YJ$^TQ&d3W(d4b5xX!T_lestAn@;n{ssQ9ZTKI zpw_9ow1%hpY)$EP@zTM~*ds&l8Yp&pMq!8TsPDui@SoNT)2rO`+(8ID;z-f!Zinl; zf4U`6SwUVde1y*p0RwUnIQVe?6U0&Y@bKjH==du>HMWN3NN2bJj(S)EJByug?NS9n zk<7A(fEQWn#7#}iX~x@!y~?qO8rEuYhL`Pt9lA->$PUiV0C5gHg=bc39|9-a=7WK_IoY*?*R z;Eq9&$entPpuc4omncEsvY}M@e{O!sCZR&|jtxzg!BaNK+2~UGmBtQ=U#PL$9z8B# zQB#n^OCm|Om??skt>@I5qTZd_3yNIHy*=PoxQcPo{(XWZu?jtTkflUL{RQU#dKH)G zAtDxvMQL#bHDfAe)&Cg9pBZCHdB&^aTnqLBKm*eFlQ>B@ zZ1~wWeMhaHIenkSIhd;$WSqme#L3*(6Y}t!51UXuzyz#CrYLf9@Zo#+KD+{g2 zXkcIEXBhWKBidNLd+WNiJ@&}XyiQuWw4T8h%va_aea#*8l>Cdeh7-DHDsB z<}`Fy%!%9dIDEUa;(FAwf4d(9-QA4%6?Ip}Q`jYa>ys5sbDWN zpEVRcEvOv+YT|LY0E>4Lg^jjuw!$|4y~LjE2Qi!|Po3%b?f6fpd=ifHq*b;-y;|Fa};*m>Ri3OIDP30l#r^pz$fl7kC*F`pO zW$h^9pxR5ldT1F3;8I3#raKMYS@did;nvDVEUT@uMf$|&v z>pQb#qm@ov#E^;&T|=y_HAS`IW?|A2u`tDSNJ^}6f?KEhj621&!zNJ62`X4pB&e>Zy#=ujK_+-k~iifSMqWE&c? z(P?gyeI)AC&#lje7ty<{(n9bWtJ)0)UT6?Q5~leijpdNws}OdrKklb0NPDlaso+&C z!JJ{TS(hpT)L5x!^xd;2R}|NxZI->wa%vOvt>l$8iioTHK2e#~4QLgyYfU17ARlW~ z{(rRme-Wdl))H$!f?Cz8vBsoX-C(daW(2 z*t(LH){@g^S=CN-++6c4C)q-hby|jjv7%iRh+B=fO)HH?pzasxfVKhOg%c@+K!2Vx zI-#}3E2%EKRFTW6T53@(?(EW1Qzm_b+AK9%e?Ks=uCXQkT>#wxkj+hfTEOr$LD$7W zSW@i4uq1A!=tAP`%WJDXUZ3=)LuISG$3tX)GN?uV~fj#-_N=p)eZ%Vh&q@INdIvC@k{LARkm}da&xa2|llg@DN zT9*##Ed8mc#mM^{d`da1)7(Ti`4tSK3kD>XKW$j&R^UxPf&A(YazR;MQz81*sz$K# zrc6s{RX<#tQ|TZ{XiJomONp7JT0~Ecf6!iVgfs7Av0V_9N_>4Mr|3dsSE*~}h21Tb zXhE$|_k^ugd60CHdPh{NRPh;U#xob6tz&`O*g8?AXAeJmx{g+*dTniQ3A97Y)lvB{ zRFB#C=N^JI7tkAA4{F@beU^21S!ZZ{TXBmICtm2Loex`1hmfUEj~zHk)9ZPlf2Z$N zlx^yAjd`(K@nV1U^++q;D}Te1mInErQU z$%?F%o!xEPyYc}8&Dydo%d#xnf3hsB-DIj2b$k%Im|nPM`<~07`L0Dn-BFvm{ZyAU zKdmZ9A|qIx2*%I}y*2uFawq#08+~vLGmtU_&fG?@E$7-5a+(Xvk(kgK7KVzX7*~%Q zB(}H!Fq=SYA#B(nsF@n&W*-qlLKf~NQd>1kpoJh8 zw}BR77eO2i#EO!#HbMx@(FHY#_HbGA?(INnf$~(!P+(@;W71pTeO&NvF0gHA>$?gle@_fd04ru*9Ysb_ z8v+RLvmSzKiuVCJD4aGzwr>PaHAQ}sGvB?{2!!F^dx?>h{xVaZGN2iv6#PwcDcG;Q z_rkY_i(ePHi=d$b-@K3=@Er|w{S@1zeuB3&rtZ=t*YbkaA*hYOd~`^ex*HR$8xXBm zUSV$DL1}ybrX&vAe<+5Doy?%~MNGu&gJ(5;ENsm?(NoeWjH-kk0Qlh-{9p8nFkPlg zXOyRn;OPE{X)EL6l58>Wy0S+;R)ZML(l9rPAy5IzQ|1#}f!Nsa=A3)T^)(rXsv5Iq ziUPfty@n8OupYo*r2#58{SF@P>;*$AQ>CHybBJ_4%3*6ze`gS}QYZ9p>$0dhJTqyd zbsl`cznH^>eYuAHtGP(I(w*Q;wAY2qt_wG!NJ=S*7PSXkuvA{MSm<=QXVX?B#F8P$ z%}(A;s3mWO`Fm8Xdx@zu3bSNaVhb{`O@7CF& z<+=lthT$kcJqpcovD2Bo0wOFGX9h%?<|9HmA>|1xe{}fPs3cFaOfAAhA&X~2sYXv3 z!d!qbrJ6Jgw3&p7D&xFmPeTl#v|zQUg+gW=zGS{jJK0G4JTj~BbnW+c$d;_;w9)IW z;X*<{lRz?(+{OvVjj+(&qkPO)Fq zOacTnf3Gc%Ea+=onSsWub_a;JoM_!HrFq>Rpf*UO>=FK_T9tP860dV%u(Al-_P+OP z_F+on0R9ooDq6~VfI_hvP2GY9_ecqc9YS(UR{UUuA*@NWPrR}#?h9F)kItc=q^v(> zlB^eBdhrLz@*LlKvN`q&lmX#PxQq-V z`;j2SttU$pPz#vOq}yNE#-Spuu_bIt(zk7_9or}ii*#}DZvmHEH3qwu^y8|6 z;{}MC5p36E_}J#=K9!Xozh2o~`kyec|i1>OUv;H>JjKr~Gz$6;c1+ zt6h6F>2wY`*O_#>chqvq>2KrSZV&bDpI*JwqiI!kEwxR^0(=HTaOKm_2 zgjFCaUyo@?r;QcW71(ZKfAY99A~ zRdsfGUd=8bvWIuzsrX&w@=x4-HhgD>BduYMqJY$txW-DI7(xb}PWg;Xis?{TRK6K6 zs?h@1B{~!-pFK*Vi`pPxf04iqlBq&B2wi&nycwBjXu=VxlyMcvxFvoWHR6V%O42#&qrIKjUotl%ug z3K@@5bkp`L=NTxbvO#BfaT{7J)Y5%yM=Jh^(dp8YM7m5%p#&|^f7s<}vPxLxr$`vh z_6&w6#Td9x$$X;<2R(J>vm7>o%nS84Po{5VaTgm;_CS0Dt445vuKdUB#CqU5eFQYQ zqJyYqJHo^*%`%J!~5@#4-dY2G-^f&#rMq4fpM_Y z%dGt1FGuecUpV-9RxK_#PhQPPb2!SaFQ|?|MnAkNm)qo=f4s%N#Fq4)-8*bSTFwcS zqnrrdvgWxfiJ8(>-UZNkn9rP2P8Aafdh_5w7`*_N04j|{KCsK~WdmF?NwWL8w@Gg< z+(T!K(=fNJ(W!`>(0?h4i>#buioDF>VpnI!GgxjE7_>Qbfp-RSswtcwvJD=sa#FP= zg^B79Xr;%gf4T`oJ9APxkdR>m$z7lG01Ud3MPXb~UvTbFI?wfd5KK}FEt&t}py$Ae zPB^cS^4z`p0>;jDRD(=5Bd;E0vWf4uyLva=c;o5PC1_1!t4rw>UfzVbQtL2W=7xY` zOr%_D6y6Y{nG}_Ah?3+>^7sl6$;fKm`&qI3<8K)ee*=n%BGv2!5!Ait?9Dvf?6T+N zYyBuM&)VuFm_(f}vsaBrixXGV>MA`@qE4S1J$yoIpS{{R+KUi`$}1$R*YIdP3JDvv z;t()>pqM%gOmbCSyowB;p?#EUcX57xX@*r;G*xIw;QRI1ZNN3H`0`X|>kG?Y0JYm6 zdndhne;;sls4COT1iA)qA{b(G$wH9ehe+oe+2(_BwGF#zX4RxxOUt%KOgFkG2LBVU zS++><`ihD!HY?ogB0lD2mTO^?2T~v)tHi~m9-$ipb50EHI*LdpPjf6X$K-j?Om2S34r)|+?^iC^1>Chbs3 zm!V!3zNx&FTYcJdm=+NR9>cgi#+5jB;p|RlE)FoUV(0ADp1yt7k%_4t zVN&zDS*CHKc*(ARe3NpvmFi_=f8V%y*}@G6kLec^ zeIZCvKrD3Exe(cu2C&8bn0e37+zeTtXTR5vr=An|lWbcQe|A0G4g8Gv>=K1YLjI zjM>XAeI7bZ>{WWca|;>zlA_C!=nIK&}X8$WL@a{_?G+D=f2h z{eSqOwM3;9Z1#7W`hC*8@=WKaZ^;H_-Bmx}C#u||SVxNs_tdJhc0*8jvaKF5f6U$# z@SRYMQ3l`#=^P}5{2*hvfy9~0OFUnocP2vJ!>Rrr@6kyi1SUq0fYsayU>jgS$ZGZg zGhbQx4>L{mp^wE|Q18k!b7Jw&E2${Uxo`<7uK6L`n!Pas&3gqqq<;Rgg~MjO!Oh~p zo7AKZ%@Lw~NxqW5sA)X~&4WmWf2WrjB&$vjAB2n1587mZ*R?=}YTw`G4pPWsPshoN zXADdO%=QDMlD)ynE+PHanHVCxphonhmjE|i>18sRKE%xChc-Sai);^q=Ny-I#bj?g zp`?7FSkgkm%E?biiLmP=(83@Ct{CHG2|)vgXyNyaLgX@2APi3wlD>OVe~+L5Tm9Uf z_@~Jt`tJkwe1jXi|ERG*&_RXXgbx{$s!30r0o&~mb6X`f5M(NN?24|DyqY- zZLfq#u4%P|C=#}d?mc6>SQOTRQ82e_$CO%NtTkg>^l^bBUE4F-RM1_SMzvpWgSyeE zN{azx-|MB7RE@!gh*Ac|#kI)8gJr1LiGo3T!a3JLx&RC2(xRmF{s=)epBQZXh=+^E z!tvf$qHZxf!!oR4f6cJcMySqIrfA$;h*+em-l$z#>c)gsMs3s(04-Hjg|S!ta|Amu zd>>b{OP~K2PEg;Y{{v@@w)YPoeZKt=?(5+{fMvU!U7Y3903s8-1hSi1nl-)-UY-VB>cwUOllb^7& z%(R-m!Y(osU*2U@z2t)QwN}rz%WqRMylJAAD9>CnXvoH?NQi`FiadzVE@Gk?jUC6t zSHL#ZK5Up;IEh$^;nb-wd&@^x#J40Q&Qk0nC|UM&e?*1pifEC?O{yg-TpUG0-3W-B zU_5={I`P)VO~}=X4J9#aPEB7FM;#eHvHdFIYEKpO5{l6wj~SeyK8cVL?xt(GObKm z1V*9^#M70h%*<=L3nwx)1=AGTrjU05INSxAfA}1D4H0bJ%@{c%oU|p#yk*&Rwcjnl zbQHywrc((~r%rDJwhEfVl_yW27(h;-!V1zJQz4WzwwZG? z-cv%O9O&4JWG-U(E(bbFg2E5O2iw#3Fh{cOVGifXVGh^O^DsvwB#p?STAtcOdX$s; zoZ8R@Y~Y>SwX2uRx_^~j_@CKth10GzbmpW4`_$h?g8b4yWiTmc0HQ&&`@1n!e;&Dc z6?O88>VUNQYv_0V3M80D#Au3|y&9yW$;(C9L}6;aE>7;pOkd7Vn!XIs)%0cfsOcMK z@^3&I6l3$3zhMvQLa)mV61&uof&|8JhqZY_D1m)%T=^c1OCd45br&y>`{ZL<3bwzKl~ zAC7)f=$YLQxr zwJ>Xm?fq3^`&8%snAqN@dH*hm?H!x&9Yu`LSSH=1)s+`c-;lK4?;x%Bf7_+CDX%lI zORMvS5pkc52$n{KgGeyXUYMIk#T^jjLtr6y?_oYE7j<^0BpRiok2ba_q>0|n5HOI7 zvw~mNC24}|FfY;fMfuVj?;>;p9or_BSjc&qkepQYz*hr^O-01=)wNtEYq?xm?$2bo zKbg9^oOY(pED=nlcAQ(Fe{KVP^)lgpYMB5di8B7XUt8DpUunp zVp7C<=SIb1x1>GZY}~EZTabxuU#pgjrzQZcDjc#g{+$_4?KZ>ca&^~dasOq7%yE_D z2<68R3&2?ni|OzA<+_5gsMu0>ClYRda}SJUiVGiicaAe+VL3|4G=S#q2ac zK_^3iJAB{ilSay=IGHkmYilyE7Zg%1Tom`-S;bde%;MU4r>uF%+eLF!#9a7yc{$! zbZ-pN=#SB#!&J^6f8j$4(F)$nUQ?uGaWbN*FK2Iv$*IC{^~Lm3_WC=oWv^;nBG<7p z=A{A)BQHC&PqSLwS?$fO7UT2cymSsJI;{TC<-3?HvvLCGYXC}dX5BFaMxb4Lj5PJK z5OZ5PcnWv8`sm&WZ?hI%@>>A|pqyWNyK`M8MUC5LCAY&Ze>WviJ0=u4t8ax8@&bAGO*jZcoef5G=5#2#OsrvFJ<>fZ$mlY{O=isZD3*0 zqAEqSXmWBte^Hb`;BNg*&I26yxd0gg4L`{SG)c?~3O8PCj=FmVuy+NAigv=rRnEa* zBZSo}GjO#)IpZH#biyBQi6*Eupb>BG(8n0r8f+KS z)u-jGo?~1b6crGuu)6=p0F8l^i2KH3G~%?7>xtqo3zuEp)If01-3A_oP;QSxlaOGM z-~X=oe}223_*}`~Xn;7IfnAHG2y>b&2z)Z$U>1 zf9iD$8u}q)ES-ZIbAgti#thaT)R-ZoL5)8_YDu~@B!3jM4i~CbJvIWea8F;VZogB_ z{jo%`#+7PDu`>QK1I4dVOK$QSwSvJXl=((-V-uEL^(Bsfc5HEKqW7WET)i?^CJ0sV8GSDrvLIO%0nrUjCWA|b(a1(78(3{Ig2 z01hLynZiTRQ$d*_7J?YK!;B);X7q{EBBgjv?!ik@hCRTY0C==f0kJ=WvBS7udMOWi_tHzuy$4b_rfZxSZ_nrOS`pcO53&J> z-)2T>S+4bK2Q**g7i0xAP%VwP{DRjRgX2Yc=B&G+MB9e>b~GQIY<8&%e}XVKYmo=G zSC;>GvYP0LjVc!L1qiW`lJ)>4cdaCe!#CrMSYTQSO}|=d)iz za=)m4vjYOP7x{^z!!QV9Uh>Q39CnZ`SRAhfB8J?P&V5X@jH@x+o2bEnK>m}S+RP}E z=vV@vBP!Gk49%AVv!#;yf25j8&(bGQT#>pjXUElST4<_QOZZ3IJ3m<|2cHureau78 z>6+T`_ElVqW&Q&w8-3bhmpv4R=!yd%Dm=@=kUTPG&P3RAl_;y}=RL+WR^cq*J zcF9>?p$`JuaQXQ;(CF|Hr`_dClHL~lXuvFaO`jlZhTT1c+W~iJw-7YC9rB8c4hc0K4k@)kQnM+4j%|rD7Je*}uC@4Mp zD^>8$eR~Dl^Y6eFh^q0p4Vl=rfWbj-e0T70@2A7<-TkkQTD0ZC?6{ool(UmF!H;R{ zF%793A5;$fDq2+dVR5=B&O&{= zOp!T%T7cD11N$J>m|Mm_tnjfva#3r+?~Dbjf)3d@cCQ=*>1=+|5(Co7?wz^POMQNP zNy@%UmE+2B+gAJqn^$Tfc8+sQ#r1a4B~r`%+pooq0b2`Ze;P>*Yxon&wN!u|0Y^J| z%{8naTqsvRjykf{kkao+K!i&s==bhYZg!(wwdZ`R&Tc1m@Q_a zrxR_jZ?<=i#O#8BJj+k#etXcZcx%TJghJ!vbXFFy+P_3SQfC7Mq(wB6b54V_oC5H< zH%^YBGHencf2=n*f9kYycv}tZXnEdD)5bXMwP*o9 zIYzWVbVMu7c^?7;;(iio1gkyuUd2f<{X7z@Mro7I z6HbKre*kI4J`w%rcMV!Gd*BeYq-v_^3m8B@g|0|vzX`VA@jTbp)ydYOX)CyBRQTiE2GcdH}pG+@QiN5Gxv=5Ch`7|8A)%tE!M*Y ze?UQbnt9G)UDv{7qUi8o?;G5j`e;@ZR~?`aAlkRvhPY}6MS<=Ly!Tr^DF{{+y_@BV z6WrsaNo$$`XjTz3c?X-cnrz62BX#IP!uIFHBicFc#SveoOJk8UeG4&%q>L4WH&_sy zPK9%%Nyny-AA)CQj&npiCF4h+`alqOe~VLCW^^EZjHGuHgz?ufrb@SQLs53@q49U|`8Kfq~oaQU-B#n*nXrNt{x2 z02F?6z<$+_a++@f4|7=)csQ~1$IVNI9%cXuJ#4A~D9Yh^<|951#wbjX6@LO!e^9H4 z!HnNT3}*N)5rfkVwj7Eb+S{nXwsvtr;XDcU%gB004Hof9BT_Cb7C^E`wx;S_IAJeeDBba!oDf#AjFo7ycns;;bIiLYoLUY)=BoTxl8vq9|~fO z8}c*NQ$GP609`<$zXCOAxCSM7colYKP=8~$s2L0$y=WX}3SEG-QSiZIOSfF=O`y?N zd=o&=x4P1~zTVe*FhP=GgYYowyGKiMU*9iKF6Lz$oqcR!6p`{6O%Uv-uPEz)r4r zZ|V%z2b`b1w*{8oYrTX-;ut8rj1jD-1&AUY_{`Wr)42sbE;enf5QV45D>_Y~`@B4j zJ}Vhh>%Ao|%R0&&bQV$qh+Z?IC4bnp^a0)t4*@Drr2Br`Mh>hG6h)bp6p2u#^mJv(KTh2x1~ z+ha1gf7wZEX?UF#IUSbIT{488LQRTmd-$n#mUL$*GPW43H}GZbjrA#xlwcbWee)x|ZrkGuyTN5^}I zf<23VT@;JrnRkG9zQifl{TRXmshp2XQ08~3HxM3`9u#hF@g6{`GVz|uC&~-A{t$6xDhq}K*Ex2Z(=4)SM7}(*qI{7bMP&Sk{rl?d9%4f49UH9=6D19otk1eMj z@UKCDdKkKVb2URSI=P~&KxXVr*h=Jb9=X=YLha4l*@*H>99O_Z>VHkjx_cuJi0d@) zLPlT9zFIj7`;J4shLZyS57E{kI^qdD99z-R3Kn`}#M+_6$OM6mymbaR;O#QLuQgtA z#9s5vv(NsTqjZCq2mg!R{ems#*+*yj;~-C>FmmSCu-J-~7Q$E7O)hR4h}UGw^Qnbg!`#L$X4lxQ0JfAEEFCH`p6SlGg5SMeiWMJfz)c)BgeykpP1c z^P@QpiMXdS?|G>x@H`gsG4iud^d`a<5$F^1#oP(mX%6OHQlxUOIcTOAt6@r2Sjvq| zSP&%}d*q-DCOy07ctUPV4tlMzJc6+68+|SrH^02^Qr3ITWrL- zhq%O!vH9bQb2|=W2efd(2kwsZI*|LnRL)SG-%r+mox?2j|?urBmR z_@p>1DL}^-W#S>yhnE;1HoFJe{%#ONb;SZqklZo|E)ZqM=tf<6m)}DO41em9-+s-n zZmCvW8h<;wvAmpHONfApLs1fR^IRMH^KbT!u)B>K_E+we4`gr+T{mFB8@$kFkO!=z z4eSGt*LQ2K+d-4-yGsX!xBreTogyo?b55GH8w>Dg&X#Riwq;3{<+SlO;kn+Ceh`{6 z+nTv@Jp49!EKpy19qu~GewsXz8U);4K2jq?=6{BX{wv@{PyAw!NOdo;A_Ewxsg%mZ zaTF2YOmlZu`CNsKINuN>U3FTFQoOE-z&Wg7@%TzD~ZE5QayE&-u2P zj?uBPj{n$0h*vXa=U;JrTI1s-U=AQ{4>ePMKMN~j0snZJ481a z7^pYE8QCQ)`(XKlJyU&HNFSQ^$Hl}P+<(I*gz=Tx7!j5OB*FN?QmE;Ebe=&z(Wb2n zIo-VQqQoat76E@Hk_78#^j0$jl&kb%~y3@G*JiXRYi;7zCU}}xCzl(8p0hVs? zm@lTNQ8C{5@K=GiK|XPjgI?e*7m9*GWz2|7Wvl z`(ITs&+NAhCZ&=48r}9KyNJ&+#L09>Oth0EzLB z2yjJ`Nb$kBO2Ft{WtqUFhWUX%UllK3H5`h$Kxnc^=g%(S|Fz)BgE|U#Mz9em!HQ>p zfbhIZ)d<$vxz$zQUM}3@N5dlK1D~B6Q|d@_L+D5`ffTq<0? z1llBL#Fc>4F<)ZbnLVMQW5?Q;c93uENEDGBvX?kbqC)IzQ_ zET&nxAEulqvYLP=&~5dLOPHZ2m+-f9Rl+ro2DoqoSEd^n`&;;_ExvsrcJ+`XHR`qx%RFAFjdn4gj z6H(0zm#d;Ph6J}nBY%!H-^M1q%8Q&Ls9;naWWPM9wfE{DgrTjI{QMk-7K3!rgp#P3 z5*eeMb2v+JF=KKKy}OXLw`sxN3|J?T->JO~Eh}38TGR#h#-)9%kk9|z21+0eM96Kn zp;nLz3U9cZq3kBWj_CGMI)o~Me3ccSnzG@SIsjlzR~V#4(0@yCnZh~jPLxnb+fQ{R z)!$gYbE{k+>LJjBy$FHNtu{)gbq(eHId8lL)wV!R4$^H4A> ztw3h5|L&YflQr9uZaEU|it+}za13qn;#GNpTO%SH+JELmh8tQZR`JD84CYuC`v3~# zHFO(oSXcvm=t@@fuk%I=?ohWaoq_O) zd(?*XZto_YRX32iVw<=&>ko&7i(cxZ-OzQ{4u5Q$ZdFcK;vQXtdAO+u7?zrL>SaDO zeqW7cX%`drj^>%Twn=0^MzKt&B!FBrP90-TOYZLhXhUux_|0F^i6ZSPCM}IfQM1Pq zke$pUBlgL9kx&21^NAGZBQ&XiRB)pf<3nE|mER^W(WXZ}T}3s5 z`I`?$@0H-B$kie?@sP69+xsa&t@gxcTqMVJa)240%UK=)8|k8FeNkS>V`4S~qbH!$ z=S;pe58cgPs-tBN%m)2m|iSpH@|t34%Mkus|08GEMZu8Ec%)%fy+Oe8OVAcrG7bCwp?%;>=&} z30CTCGv32khIM;`zOO3VJ$_6%_YDG4&nVjFZD2@VxrvK}H^>(w6X{E{%1hQ!%krQE zUOB5EF~7{}!WVwu;uUG|>>#$OjDLS}40+|)3{>>}+He()s|P01f>2;ydUw~-WP$1)SS#cEKJU%=9y?CmjKh<~!qqg-ch zXcy|Ca%^)q&<6?r@0mIx=8h?%yNm;jEihkR=j~%-*77+tZ_1nlH!x?ArFn*yp3QEQ zUnt#PRd>B(<6}oZX7yADcLK{(CXv(@;C5tsR^ZW4CDcKCId}PzTDh=qGk62evPheb1_xIe}G`v3IdRk zT)Q(tuF&wwb!Sf;Z5zXZ$KDmZ_|<%s86o6K^HJywleV z7;GvX27t^v!_s#}2(bs{9TGnPFg#}NEJbia#KZ@ya3Fd$!L3wS`wg!+;s4YPr*mpQA_m}bHh(IvYAjvhPuj@IKty-3 zFE7e#OyXL-hw5<7djK1z3heQ-9GlzyhFaldBtsX1aUlqM2!ze&uw~ubpbiFY_oirR zVc#mEO3J;8H#hl<>ws)ld!Be~R&Gl?w$Pm_9!OzpZX7ms7U#=#qoO7AG0m1Z>2Nyb zvLClQx-UdiN`Keg0C(`c)ZjC^8jr6js4#;${gL?n?o$uNxr~@=`0f(MU8`jQUkvGu zuC^lcQG5n37m&@>qi~GN*RVLESjz^MmBDTK^Ed2~d-P_K7oTV^fBc4ZI5z_gQ3R1j))UiWbWh{2JN>gcXgJAXRXC#XMU5cB?kUPP-vWkoPd znwAW0JAriaNj|>zO`Ln=?Q?}=YAL>df|yV4S(g{tbzbet17SvnF5u5W?_`&qJ7%JH z2aHWlDUskUf%e**x&R zK`jg>&1qctSBo?$Qy|_2Xt`P~4mgLPhZ)X6`1xX_p5=4%k=&6WE3Q7y+_DPrG!VIA zb^dI+d5e)nbzgP&oX+vUrEAzO%=in_D*5~{v*y8zi~J?BILU3yZyDQyq#BE<1I`(Ch3{#Y}Y@%@8NxTN3bVjpS?$}a|%?=d;$>Vum zsIuEQA-Hp!mLXLTSkmGn@G=RQao#`{Ro(D$x^M^DjUEW1F&0vK03*R<3+TF4vStr_Bb3>LCQ&os94JPPU zUws-rscl)+?`&PQ!w|$>$`##q@`$WN}rG3{xjhB__W`=HJ*0UXh9j|8u*@DfL8J*6IaGi;^qaNI)Ht_r(mjrH#a> zBN6&Y10A7{EK)V1^@Kpo8W%9EQLsv}$~jErQ*Ht*VtH5uHT%o`?OSg*l7I78eB~`Z zBhX57Y}|D?8!6uZ`VK$5zQ4wk_vi; zk}}pkmQ?G;1~cg^r5cBgTz|i5(3Fl)J9iAe6VRm7f4*B~qpZ3&&kp*}kN=m<0Q$AU z1cFkY*#oKTo;pzFtMPyq@LWei1S=eg8k(=tg;ahp4-PtF}{4^It!& zZDFkLrTIm??nbQ6K4{vw6Gg6-=iXFA@B_Y1ul#o#Mn3?K~q1bv1=)=Hq#AN zJIt)sDKAPYSLx3D}8(Nja3bYUNP#?xLqtp8gM+DC&xqmFJ>r&RMTF$a$-P1Sn zMaZfOVz`ZPk1i%s4RNVB1I_xDb}(Q~&f|<%Nm!179BgDm=Y_I1hvjTIc#RUS(J{JI zp}-1*^B^DU;r+%z?gnenb46zz^E)8)9ustyjOmd|91;||?6iCgGUs%e{pEuxadN1Q zpTF!Sn8tzPntuq8s^Pfl6PzZ}SVy(2rUntbj$o}kx=l48+sJU*^{2qtRvs4^6Bz_k zA&Jr>coNL^>QV8Uz$Tna~@dKH`hN z2xneLH4Ma!hhuJu{A8SDrt>$f#>DT<8`1EG#|Y6`#(%lb4Ft-}n!Jt*QkJP+BU>R1 znUSL2ur``p1**@*s^Q{EnD%5|d~ zrmCwZ2CIRty+GF*Xi650ogq*MCOYNpXc*G++Mv{%_MWU$=+>X&9jpN03#wnxd@F>L^DOqz;_vP-@`PTcu zupX?5VPO}-{OZB#{K}Me*p(0F9}NSZF+Qkk2Y>36m*Ka)p zI}lq&c~^{*nI&^a$I#>o-K!`*-<7VAjW{+a-iWz%qLsmP z=YLa!NyjRkDio;@)`v>ZiHRkD1z=zDFJ0EHI|cmh8UgS7T&5m!x+fMZtV)-l>L|azFKk zgQKU(6Q%}&3vIySWpwFQ6?#}&FLX(_8i^&9`V|`>`1P{@lNqDV*&19}CW_SJBK5d9 zvBoFZ2ocd08tTs())8;^_mWTGU4_qh@A66yl8)nmc?6EMmB}fLH9^R>chC6cvwv_2 z1}Pw_(}f)6vKVG=E1wkQ|Wr|IWZ-&ToVM_Rz?^&4;|r(MZr2QxuCI zewykGv*s{o$2?WIGnY%tMDn4-4hSe6R0*pc^ANKEKV=I)!Op{pih%i?>GZ}`9dxEv zB6O~+PPi3^vt1QKa^GOsdc5m$KGzxD&Hk{5#XsHuy!+_>-lvZq-T(aahkp;|$vS(- zn>x8amw!ztJbZ8;s@ebI^9S(n9LV1Yvis@7z0bP)kM>sRC_Yf691mv8URqEz-f!0ELe1EwH1?fUDX2FTVl<*K*NXRGG0OMBh5XvTZErj`@f6XC{ zTwS;TgdOJ8cSv~Ca3R6X+xJ)@j+i_XSaW`%v`^L|pn$j~`C*BRdB4u$&I{w$`NE)F zbjf+s?D-8)GB~uQn2uY?OncT=uD$ijN>t170>xiTP6XO6IwioL#(zMj*^QgSGC4V` zic3&-DJNdMX#@+Xf@;uG2d-DFF(hv^*<8FctH{ySIKz;_dfIY_Qg=eGZQLbD;u`d2 zMfY7}K|x4pr)!s4O9FMA0~!yJzgBhCzj>?wox!0Y zqm_qe+5griGg@1}V*$X^XIdWR?RSq=4 zs<8mqi7?PPHjwR_1c878I{#Hx6KZ>Hra1nU$@``ajww38p(M4)7wx$Ls#Gob)uqV-L3QG&Ylt<}i&Ol`Pfo9du-3=R-iyP6^#fZG-PcE~+V2LTQL<&30 z<}n)#L0LO{)qk0ZY$g+KVkA4=k3QHT?22=@xEM;@nw_LC>#G-Vwh4mlej=~!he~Tq z0#9x^1?Q^I+j6cy+dx)bx zI0OKy^bv`5(=(0|{L@BhBwM5eXsM#fucq7%qxQI0IDZy*@rvPwavLL3qKH7e+=q4y;Wv{aWk>jT9 z8<5LgzU7_Qy}60aLvWNU=&=|P7r-6?%vmfjOr5NX105Wn4C5e=pC88o9{xCZ`hx;> zCB4IDay0J;ED-AEAUle7sisb9_dm6Im`Wc~g@5G|g5pwUlc>Y%L!N}x8K_J54juJX z!eg}Y07{r;o$}7A>i#-7`K9+`QdYP+eXSv}RCAcZ?MX^pgGbMXgM-B_(tMQm@S9qb z@0hlZdxyQ_MJ?fUmWIqH)+V1Z%^=)@R$v-gjlh?wO1@&60I)?Z(Cm~p@S9qZ@0fNF zP=B=~|7Sk#_fz=tWoYrqlueykWu?d}l(Dh1c`ZtZ+jkj1n;6uDAfpR-@?yM;6>g6x zAvUNPwRD!!gvR0o^Ah&37|*_cfX6_@S8EgX`0;ZmVw zDuT!Y#-pG@+(H3`mU$ZxPN%ktp0`$m6Mv6kltav&j$Ml(@d!89nH}*UBbiG{AFs*_ z)EA1Xxffr56JsQ38stqqwB`td;0lUKzhBuHr{HZoPERY@KmQ$?71ckx+c(36?=D~pa)eRPq?(Ynh~iuaWBjen{h zF@gWG&ZpGPjtO!>Kf6$(Ta3EU^K>p1uG5?3?(=@{+0oO}?~i^wOf1(HYE-7qlI>C< zZraI+Z{5t&CEI?QLG9ACP7k!qvwcOE5FZ2LkTO)nECraA7={Ah{@(~QBK>pAj@%I< z${5NoXPIA~#ZXIICSx<1RJ76-ct#6FUSS@ds$uyCD#NMlX!kZ)ief90Z+U{{(O_FZ22L)n7EpeSh5G`5%wBD98Wm zRi^O%@8tQvX&}D+DNc4@jUMiQb#S~ldbEP^ctr0Q{1CzFrJqeH-Zwvc0OvxCku73{ z5aiz)*Jo)2sT$c~8yYk(dOxaj=N$$3xks-#cRtCk`B6`UhaT(FI{^YgXct6q3KRAu zEKV1g>ke4o3SvF@F@HY=uT>Cj$sX|pAg8a6FZne8LAvYo@?lASz*&>=RbY*PM@I*$sT;k_Y#-rr8%tJ)__x4|MfHIZ zp$bhIZzU%wY_HGY6fi-t6! z4Kz*-(-4_|H_xZ1{0xafShg$}-ZsLP1yYSerISVLDh`2>#voEUjPJ9mpw^l+><-pR zIx$c_Sso3&{todyU;7PC_vUKhXuzfgZ0RwGv>g|p%YWa#NGTpMKe430*DVx8N{{BB zo7P{5X+*ntD{jD536K!6pb`Fe#U@pb>D`h39#!Y_%N#n|T@K4ZMWWo>Py8BH9%t*9 z&({}!ECfb-?kW%ohM?3Ena6iY|l&pyX^$DYu*1G@sjbuyB>kX9Ho+p5AZ4jbs z$nQT`Eq`I4LSXrUPYu)>!XqyNv#}jh3q5*A4%HvIJub#cZ}`gggh;I>p%aE*LkpX>`k&In~6d4SD{!F6UrFX*I^L zi)G=dOKPZ<=`vR!g;t%0BAe?B;7^8&11b!_V= zh^u0T2T)8a0uorOLlQjy6sDJ~Xd>&ej8SWw_1Tm|-J%F5`9%(ECt(v*zQ2WP&Zc7I7pry}(Z0wkdD5b=0Uo)5Uk*P6trRH__I z0orNKyC5zXLqruxpZNs9g1}|x0?K<#5zm)gMGs6CwLZ+I**Vh<5tcAS6xbsRIbD#y zxjFvu(c#g_=;6sug7F)V-#h#WoLwIte0*?}9FHDCT*S`~uyrk>J$(E9gT0gF2!C!1 zj_|(V_^D)Y$+20b3Udim=`62stz6?)Wh33(T;SbKK_jTL){?h`RN+DRA1ZqXMiyMI zKKA4SB7kwI8Ck0Nl$ZaK_90`OB5Y|kD5m`IU}IsXPw|r22AKTnt)DfZ0JmhOOD?hr zZX=q#%-66NW8~$TF*XC9VDt;yq&9<0Hv?CKp%}MEa>=Ltf9_Bv`HX0!elPaSCoW)Gi6xRu_!=y@WqIf`M zPwa$QiF0~U*$;R)skDx!C6r}LJi?ya3Yr)}~T7MP@{UmFp zHrN#3wN8OLmIW}Q;F*B4djWkoNcCt-Ue|_U3DcoI?9-78Ma_pBvoLMC&*ub&2xecie+cTMIINqh>@Cb%w(WnH^N4o-_48DZ!fNS0}j(2L~;|>%UE%3ASfQ2 z)D%_Z7kC(#;9rtV+t}oQ8h5Z4W<`jmM*Y^;!8$!J)(LllA{5n7 zF64>B&RoBw$#G7))Gjcfz^)V57a8MfT59V#rm5`^$JC`SZX}0a)4=r>GUwDMiK$cT z9Q>{=kf9HM!k2ueU>s^{=uQb#zyhJBHTDk~F1Sh#OOk0@yOv@iNPlTLLuFD>tBi;C zjuJ(ZjnDn56ZGeooxA5kQVG8x5^i=wD-!Z4L+dVQ+n`x8D48z`nI*Ma5tR(AJCR&J zM&nCDBZV=BtCwPuwTacVsH_@%v@4bQdkg&IDWTbEl&$91#Kjpc_c)tBGf8y5%6%F`C>~L_qTp*7 zc6WjgTiPh_DSS3y`(mO$B+NGplTSpa*HTqh8abuO<53Ak5-I#ET1TOI8S?T{Bt&?x z%8TpEvbuU)oN{Vg#sodcYt)u<+E&7sMF~e^Pw!-uQ1l}$2Y<-2M@I}$LMOW4XF8Sp zjD@Y$XnZ(5JUgS==Y;qQtrhzr1*V1yX|#2`X{=2gpNna+Q*xLCYkXXz?7cU7`0hdS z-uU?B@aR)simMpsQ;^feH4dCp*s7f8wAh%Gr*xLZ2oVYw!mRMFE!#9~KY0E{ZLG>SNPn8Y7_6OI5BjzMY~d!pqJ4Do z-r>>LkE=FeT`bcb~H`0CC1?)LWfi?3{N43P%BVt)y$q&s{-L;ttbwpQ%+7*av&A!MV* zaxFSgaC+JZ{lbZ8XFP?)N6}m_4ejwIY>Z7?bC(i?n(DV*Eyq&#h>pg-WUd}0FGBnH z0o+mhm_!oU@&-s}1bdJr8=}xYJiVK6M8sA$X+SQj*UpW(x!Vy~_GZcDqSV+qm*{nL zsDEqdB8aW#?@$acCr}+>q#`RiWxcjj0VtpKY>3bW4>%BH7w(2frG;}FhVu5f)xW=p zF-orPC-_8EG*p(KeYB4;-k^S#Q$8E47n}B7^hgF~3i>4MvO`y|8?=$=7}Cv;-;Ls94Kp4-W6i1RXmh*RiW4RA`u0;3HvyI}3f^5g*4f*4!OXw5WN)Cb6_ z0mm(q&m#T-T%Y{9OENJcH{h(O-G8E`PR1u*w|ffOKq_ zU=)L!Bm#_IrAfV6DlSr!Yk%Q$t5PZ4B|Q3I^zeY3(4=Q;!&vqA4n7#~L1?~%BWj>* zi8tYU3aak#D_;Njz40TejSQ7)zpP&6jM5o?eQxT0@nomBFh&c@?1B~%cQOTg0!3^B z3x9n9J*|rgZ1s?s73wF{YMYS zC-$s|PdVAmj||O2`m6dR*mHhaxLLOZc6>9daU~{AIvr|wB#^M1ujN^ce0Hv5Y# zM|MP*>(urn2qdI0EPo`29M2cps?N}@`b$4WTB1q>Sq@&1dOiM9mGY=fj7kB;3dQJ? ze($SHq6_~j6%y=m#ZgOT^oJUqI1pl|NB2hD@SDTGK#arX@aaN$dUuHmlBi_IT;cB#upsy4EG1EKYXx8G zTHHnWaf@HyZULyt$Q05|RkKqSvz9Ck-Qd9#LnkVP0OyD z348SO^So+uN`Jy1+?whQLfo>Kihg;kBTz^RLT(fGez?1GXg=pS7++ORpz4ZG3ZCpT zLIrPpX)iUx!&FMG0%>8#~q;gW0Z+{wis%+9J3;pTfz6`g)qSPVU?Tc zPVy4kY9*AxW|~z!bC1_18v(#ec>079uqFZiHm7K}%N*@XvLS3`FVFQ*qb+gdu5fU)<=}c zP+!woNq;_|Y52a+l1CJAFRfFtb0zNkq7&Cf+0~Z70PkExV(buZpd6(uG-D;zk3>W7=+op-FeI{s!8>7Mvpd{Y;Klr})DQIK z{?F=$k#Bap@~0S;};tJMj`Kn)3oEBu$l!oD7>5em3}tWX#N z%@YC^{Fg+4?lV0F5Z}JK4@IXFoDsp0EM91hy{1JSYdhppVgJh4B0`778eNM({ln>B zKK>jmvJPq1f2(kT1kBQEr_C>t`9n? z?>fy3Qeu-H9Z}_wX4nEz4SC&0yB}Pn=4>Wr78mHJlrxKL1pvT^853XQqJ2PpHR)s9M(Vs-3d!<4UiTn9#el^|EgMNL0XlQGL2vC_ns@7>zJTE`hV%C z)gd>kGkuk%zc6Lsn+~{=mQ>q`*#P>~-bS~3lY4fyoLz^~lF zp7-b20+N%*g@h!c(TWm$_$cXO4{`} z$Cu748X^W}aDdPkh&=!!BcaGe0N@To#3GCj5UBVb)$xYMaz z=W-G8YN9a$OpL%39TT__hMQW*W?xNO@M87Xn#seec@;x7Y>tR z#>A6yVh!ySOk&pt@@ZLC@E0hvThYaU#%LE9fTP*#%}PTpe-xTE@Z<^5CUl5%o@q#= zwmLKdl+vcsVaK&tfmqET>VtMkWopbu;DvrH--3)Yq&hs1Tf>M2g4Jb$&D&)4$#CtjhN`ZPb9uh;r@Vf79M$@-!Ki*REF_dUd_?w39d zDcTHRONfOH*=K2~zLE8}Tw06Ss=t-Dkp}NI1HrbD&)UrL>vLw)7io4ebDQ!?Ye}0Q zy%s+%X>skf_-RRt$I>mYr`%B4|FeiZ0xI@hE(-mNH->Frwts50hhuM4#MUX+AZutv zHy-Ms9cOW)+v0&oz7E>(koE(D=!k8(3?9USS7^_n5mgZkriI}GY!z!0${P$1#?+lt zxP?rZ*DcnEoXYGeEIzfZ9q>cmlCp2Keoi}a?O3^{NL0i_7qzu9SJwu^=)W_1U}CSyn}>4 zF6wlW=U00WzHFdICl#zU1F1i^0KZ7%hS)NLu-%ap7Jm{a2Ag24W6As#Va*ZL@8+NV z7ceFzYEvdL$|dEFM4^Rlxe>B)HS~2>=j%d26REPx5R|>{+Zf#&I4Rh!yo3xm;-I6n zh~^02Db)wewhE`-cA}^1%ovx^Z5#)C2`PT!?Bk_P8pw(|PzJD}|WRLjSX<<9BOTyiohG}4g$^oxH z(Edo$4raO8IM5e9=+#B6HUQzc)#I;7%IX}jcq>j_l}H)q!7#5$DMFt4hz8YFANcw!qJN|LJZal#H|a^fG|U+KUj zk<&TBl#^CC_8dL`F8svvvILG&^9wPJ{h|;pK%Wq(4-gVS=0U6@6pm1B1s)Q5a)6z= z)!6}q?S6Qmtqd^=29Y_%13gh_HG0GEm4DIiP@nAwRgRFw^8uLcp;vmN7qdR{n41S4 z9Ex2IQi0_?&cY%tJpxS8nWdjW7Ywwag!w@>;CDQz-gvrNuT?1bGbtK{7(SMv4 z2;`}b0mt*N`Cy!KE+8Yg>heo=$Bmv^tV154hbK+*R%_{FD+>02lLcfK8>o6q@?1*T zwo^EduB}Hv*y$v2+utEDcOxm0IF;@f^%XA8&;tYn#4XB-#O*EEEWjZZHy=e|JVyiH z2LcRgKs5OZMYD`oq3Gis*u$aLV}IP~$&Qv1gM;pMUa2b--NancM|wD1FXfE4zh%ov zn;HgG59vWcRb}X^VW6A)PKBuU)54pU0y4l|pqzU{v9t!ByOUF>w*j__yjwT(G(%c? zFTibOM!(Jb51-Jco$VUa!`4{q^1Yw_!~m6RYj%xlSzvyZ6>PS&qDlJdR(~A2C^nq6 zp>WcAP|4h7U|4rPx5Nxu_{)vC?vQceRCmPFdrfjD_tAp9S8_WPvB_zSWxXQxqs%kH*Wv(Ulm8F>@U@}^aH4@wAWtqc|eRIFLa`WL!4E>d00m&Mc^~kwNIB!U~$u(jb zHYz+9`zJCr#+s}FW$)p+tS-KHp22>2cnAlCEk&T!(tnxSPz6S5<0^D4 zDW`Nd&f3`6Ioc&~fb=q%@J@AJ)Q#EvO1>umVnY3gI%iF%p(VK5ba zZuE+6cYIlX3uL^5{$)hO@+7K}Ve1;)8lj^7 zI3u|1pu%EsES*qCG`xK=NBV~L>$??51wWgwhZRKr3e-NzC$W!a?k3|!G^%eS^UvxR z{JJQsR6~BnWx8kL)>cgC z`BNS@QIyIz^H~^VKYsGKnC1TGPjj@u@STXZh99&ZFUs(yj3un+NHny&uu_`RG835i z0O8e-OU_b33IoIQbk;oU2A*7FaW%tvt(9nv(;a?Lp5k{+O)%v1T}PwusMn=t&a`oR z$|^2&0q%~*MSsW{!}rG13BEC#eRQzGx!_)c6J;9{IRr#;@_9I3j0{|BV|OvtGXu3V+3mPNHDc!EYS5`j*q`stJ`d zTu2WS{whbLJaZ68L-Wf_GmUl7FmQYZSNXmsSGJNusl=w>yIUCrE`}sK#|AUbg@{G8 ze3dn-&0&UQ;_l}&tjqWrzNFeDJi-T_%1P4@_~zyir+ccR%x&^X4oE3&k!G7z)~B$( zzIHQ2YJc`dm_Fy!Q7RU1?4`*f{SH3Aq4S;U5ijdS(6)n|s-N$YdF<)9lm>q14-p`p zy-fLzO8c4m>E5v7P1)Xzzl-XHP5Qe{|%27#|&^K(@c#(U{5tX*5*}DnrWKq6B2oz7y35*#g>LI4LisT(iU3TH$18SYqYu zhtf9JfOdZ)806>7QN66ihr6gV^&Wop;v4T_+gOOeJDxsBF;#^_&I%H~d3ZU;Lx@-Hv_fU`?qlKXF=uvM3*P{0bXD}0}M zzYk;3^!|h2#Z<~p`1=Ex!*jf(G`(3qYQ4yi>?MCje*<(2BE*TWq;kT_6CW}un+09x z`fVHtv>J^gDY0*QoLcSICt9MfcBBD61c}zWHuZio7fte}C(w))vD-bK zHV=P!>MVcfv$)Xf_`0Xl`<`38@VWIHAD8jBdGFJqecAKs{P7e-jjV6|@xW z@*2r6=DsxS&Z62WKmfVyKPs^1`YpQao52jMk8H#8`+|Jph zZEwhGAAQqDXO{mkL+A~Opy7+x4;i|6?T}%M*Y04*L>GkDJ;n8FZ0OtJKZRA?V(@n| z!!D*tPN$(9pQ@ANu@i+SVb`dn1h=k|;1CktZ|iEc2H2;tmM8cH;M#`2z)Fyw=qG=# z@5a{*WJI0Cjc(2*^|>A5vqQ4XA&$wcv9Z zt+X_6RC`3vc|qePu>=m1VOfc6;skcJdjBmgV!j7{91Jol~{+%W()kIF@_t$HoYkwH0)jIV8c~?@*`QcLFKdYZ^!u-yDG2=iib)Q~sE_t?1SBRD zCBDe`t?JTg9CP^R9P%lf;5lrSTjxD^5^(x0Qdwn_jD|U%1#?_6x#r1dr)fw9uHgQs z_)(`1<5x2>#pF@~8ZeWJ^!4i;&L?sxd1n2Y2RJjbL$&F|)Lr6tyexIxBAepk7mHSWILqwH+Pwh;+Rs7px~ zOQdU}Haq_UO@Bm!K`nh^1)BauMA4s6J!gd8Lu!L_@s8Si7yX31>~djo2{Xj`zWg;; zWMP|KUd}nxY@{ICVn9#oE=!u3HFxrNJvGPIYII#BsQHlw9B6BEnsa+mzd99v zPeq%guv@fxo>k|o)owwj%5BxFiF4Utw(A^h+(Xr)=SIf|qkRzZiWJQOxN5loSZjAy zDhm9FC`L1wg28`ZFK^kK{k%Q}U-WEI>_2C0h_u1?0i_T6^EEOQ;OX~pfBUO<4v)SX z9eud=1&)OtwRiax7x*SS;w6or?}h4lAC=jDYk#RMxc!zo{WNs;L&+ifTkrGUp_dC( zB5PQ7bfq{H8I(!BHMKLea39ngymn6o)Nu}L)QP~V-DiJR+@2c(fMNbh|UVFU?LjdC%=hb^YE+CYL z)1m%g0LDacfwv%uw~h{qVQgeTor{c)sIyBr!6d1j&GU<7KvytZ=@w3)+v(PZcl=b$ z8lg_1PqTk)`fZ)kn>t?g;D3`z!LbYoB-hbw8FXg#HJm+>|7yhx0>IQsqxBrAdk%Ul&D!%@GasVOT9Zz#4I{NRbtTnThIlP(3cs(A5!A%t zR-ldMoTJLf&3LVoqmTAZJ~}$!s^SbH^?zw=oiq&Yw?tvAiMH)piH|IcKXPB1J~WTxw`tw7g{KB`V6G7XOjCb;UycX+b)HY19S-?wyEu}q9m3B6va{+^ zuI>Dq+gcNjUNQvH&@+8gd3tPi4=J-uyzPLIvL7P`YYJkiaVscYc=@SZ; zGw@Ls4p0=r^n4VP80uB^X*(1{&rC^X9{Jq)0U@xR?T?+bV7VTjv7nHqtJ_Xi$mzUt zzl=T^?H!vcRW_|Dk{xXXcprZN1qycbu`^4&UE=OmKj4}j7tF3;nX!e$gz3G3u{AS{4w(R}GOKQ(Q-Scsmp(Sp#k1&Z!~<8#m3uu{6nY5xWg z`x5+W46cacF^i%vy>WxD(*GKyPhfk{8#V8wX5Hkr+?cy?L76)N?P7m@9k@D*mb18* zxuoIRjo@C!5e>ub`Rkg(6`4Uwxi5CmT0uTRNE){Y;7L)PR^S^3d-tj;xEEjt;UFXX z{yHHWnAFe&7Pr3)xyfENFX~P;o19>s>b_GI=b-%^YVMWQ_xY?-RlkUvjNHme^AlJB z=fr2|Vh10&EtHg1PH}$<9IzjtnOX*R?O{1J&879oYlkw?a+rD|HHKlL`tHC8vO8`0 z{n0{Yw=;d{Us-OkQqh%Qp{Pf!*s5mF$;vkFYfIykl@Q%!y!V<^h*Mpl_B8%1pQRIE zZzIiW(Ft%bW7^imo`So(G1Wtr=LZJ5K3OqXhYkv8ZG4=^wR(Rw-<0HG-VPtdQK^3E z5XOZfrz@3!;NPOs7@(TkEd zP*%Cgot}v5tk&0W((sp_SB}dc83dC*YaJ#=E9!4sn_7S1QfDw2=rjA|0oT_r8(%&T zFQ2u_Pf|s{K$VRzx6+r;1A@D~p@i$JhBZ_I*evj8M=|IFk1X2&2bb4^KGGNa4jam& zFMRRIX?7ujUpZ*5MmOpl_lv)N1jk;`F0WJkTfP3y2cx5dy~7U$w(YZ;Xc zoC?+s(vN=`EUwP;D$S@}S`*PtLo4o~3uu^Z>GN{i-5)T(?j1U9`=Bv<2X`Z0>Ygn+ zkrLROx^hiHfmhoX4m7;_&M@4YdUK9Zl2_Xq3cS4fz7W`(x&nL0)pi6zMYp=qA@hB4 z#${r6ZtOQz4fYmrb63T#XpcEydEXvUqXD&L6hnW$>9xaOy1+&8J}@xpJ!f1b9thB( zgGsY(b^%6Uy!N_=jdLO)73sr|uBsZOP-;=JQPPc@hy=;@ArY#tl0X1=GkIkH`ViRF z4tFMz0NzX_MZfPwCAC;7nFMhOoeOv)CHygLPU;^?NWhatKRubeH6}VO5S{)l+}>2Mq$8 zz59aL@jN3>ma4$}D&O~vftVb^wn-}8875)RJ^AkY=;>C`rHJ}`MEn491~GK-7AJx* z!BFLW8Y)FhkL|G`$ZT!hl72p*f3kP%&&_|+u%F?M{~?S!=tc-dGXi>dT)6-jlFw@aMj_JvLg*C2PWpDS|!yQa7*{a#9lL>zxr z?{eLK!XUtdNdB~6q}Occ{?QVmEx7`spWCHG%VVGBkW2`mkqSe>UWfrUo~)v36#^|@ zgBYOtq0{{i-9s>cq?W;ZwdHgS*7%2N81y1<7bEW0DvAYhwrLba>5CE7wq#J%uNzhSJNIOLOy?cDtlO!71w0t7s zKRib?EmAgLuLgECW4z`B(KrBqeSYZGM&({UJvccua%LU5q3_MPyZ_M<^s7DV?*4U- zJtvU1?7NG{oGWG9r8?XMzgK}(ufi-^h_-_3r%86v4Dj^0&cAv%$!8?EDZYO`u5*}H z-@%GmWizRWx&F@1xP`Mb&|2_|WA&Y#aaT3(+POo=@yS?2?Ewy=hqkYGi}Go9o>f&^ zLhe4+h597N@@@6R!4K%2iD^I!MAg~^v6eB{uRovxB#RLtQf?sm!}1q%{54Hrtf?*} z4(7K7$|_%ZamLn+Sxzq`F~5Ime%{D@45E&sbD0s38Beuz;$u%hzsYd*n^zoVlkb=x zAB{#wC&$0)kn)o(X_ca2lywp$tOF}hH9tq`$%G_LtxO`bTyo|6ax9bh0L|_Ydt)0% zDYyIg%&}~9<64Ck1v4Vwmk+tlhWwZ2LZ)7?k3R?U^NFPa z#RMi9`A&}CIT@ZFjE)Wt>n~3nLnrb5UyMIKI(!#FAJLD~qxas&Upw^co#Fn6=tNCF z-aS1boG-(VUt>x2Cvks&xycRu&b{FR?6H0$Cm;#Tq@UHr+bepf%yB8dgomC#PTk_O z$Junw!6oSDIIX_ZpO1NIqYn|%t62y&OC57FoTtuAhk(Nlp$Ml_b69a~<7Ki9huKxr zs@sZ7Ldcav5xN|b;skVT&sV&h2!LHpSk0xf)PYi=$TS7PFzSECe%BSgIkK1jD9IE# zqZC)CvM6pVn1C<5`dl16 zcLGwL@*WO^ZH+eGQ>QXqtng|;`IPMs}% z*#*MigYz?pUIKqlN{YMD@Kq)jKQgQb&#W1+)R}}L(8?#kn-^YxJpOcN>;04Q3yf75 z@CcgUU33?H;8sR{I(+BhpL=6j@c zB)Im>h1vzh<($lzs(L!(eBFK5uPd8X7tVX*K{f_=NfCc%_ zStS62W(6NSsmr4 z@>b?)W!=Z@$aX|e(+PwM_c40%2u`bUe^&xzSP4K2y@3Tvq}^uXA3tTdwJ20w z^9szTJh}q%C9i@d`o{{FwjW^uD=)()LEBR037)Gl97&Px=nyNlA_0Eiq-W0T#Q2?+ zv1@+{HKN!EuxGZZm=;Nuyw|0jY4| ztv5$Qlb*z0yZF&8Ih4^B#tT%_J)!L%A+VtDcAf<&`uiy z6F6FH=^vA%t(pnX5v;foeO!X-jJ~7;rQv@^Ro^MsYr{s@UHx`yPQs;|c~##8rura{>fp(#Y_fm+ zp}-D!*4z^{+vSgmbKKbQ3x2oxq?eY|%I>}Dn0gr6(s@p8FGY55hg)W&>)9L*zi?;#Ea5T-hbiI`%p-w{6h;re&Llz z??@s4z%qWp-|wv`6Npq1@#+x61(JUd7M6DWC~%s{F3`g-E#9x4c18AWX#Ku#gGmzD zeI%`K&-qrC{VVXIhci{W`A*=Uls2&WbY6hSK{BYk>Nl-a5CG{r5S2z`Q}*ZD4BKA3 z*;nru-#+1M_3L7m^fRw`=sW`AW*QG3l!gT$wW2)_K?Cw*IYUD61gr3#g`j_(Z$9O1 z_V6HD{E;NihNk_+mc~JQK(`EG6CrM6MAt)Vjd;(|z;y;_0>>SxoUnL{3s%K9%36(7p8nj;t3$jX7hMnV@_yJu$0p`3XL8ic zv0R7y>|mzPC=6V#x9eOWgK0Y^`QG7w9sL5cpspxR)K$%uUwGrp2fcsQX@=)V=K_RS z>ym-9k+2Jf(t3nRjeOc|o3;wJ=U2k7rkdyr z1=B)M4)TLEh?bByhQvwRxYVhNj3 zlT|C&Xka@di8ktGhP0)6-kGe(Zmr906v27iQbg>PLO)7Mw1_S?J~=qqN&~Fp<&iJ^~m-+kZ48UYE_y(+MxDMk$u`ip9EHAyM=#en@}7b;GW?opJp_D4GLwK zUs(^blr5UoSXs0Rf9mtCFh^9qt-=#)AX|J7;0ad0KhITh(f_2B8}XeJyO@H2M5ReD zY4i$oW*JMpm0_B6N>rJClue3$@eED7h9Zb}O^hE~D8jlDP*AE1Au=-hnU!&HRBG~8 z85lE%5lMg7zyNUj*hJCFgTq^}75E=T8kW(5TIVTS*6!(a$nQL})+5_leGS-m=9{Bh zi=p+TR<9$KuYpOr0QD|8s`{P9@aSwGuSlQSAD+H<@@sqkcW%1A^^kQv1xn>Th@4Zj zVa)j^cFN9Q^1OrVJ@fc*G#b7K4;&_W#UVWDiNb$fHOp=QY2Sl5>=89;S)y8i3LjT` z-Nk!e{!RyP{6}X8O5~3gThIDz2=+h>2?Oy_k%FiH(Uf@YPV^_VIc+&f_|FObR}BQ5 zPP=5JxaIhj%RkF7psDyvCpg%MP%QXLlQ>qP+kTV7SJA zCB}d4{Rx z;k zRsRjCqYj9|7QCMdlekD7mfN&+vYyFc45%MDgzw+Hk7P=G0Lom@re2GV9fX8eDM zN@$eUd__hVB05^$1M_gtjt&+?Okk?u0dLvp6(biuv5H=h+#>XgIV^3&&7q2$e2tr& zi5>bJx7doqrcy_(`;W>MINsLtm-q4VPW-8rykCoCD~K;6~g72*k9h($wYto6a7J% zihr$@YT6T-jpn_<5JqEo4Y}VQ3<1r@{QMaPX$gj4!moUMGCCTA1J>}Jj}BJ~j?fw` zfl1)E=v!O-E9xCBp%L=HU`wxWifYyt_28R1eZIq2+|P*!ukFD-QyG46&*g!~@Lag; zV|ZrbL!QHPyW!{X%KrY(;h8G_l+IzyN{E+^2PFHfQpNw&d0U{Z*e8GU^11!Vd~iK_ z>PfDK_J8xGJC|(4txw9iu;+70?&lxzQj*CC9uaWEftQk8xYAq6MFtXlJV-By_>cO$ zFu%~NN#jx|G&}oV{$L()DdDj;VqR`BMElDvE>kS_h9Gf1?>R7fOl^?sLA3K#`~npd z?~e85l?$y-){I_zB-?+qqO>1%FKu6CF{|2MWtq-)$WNJ&MZ>{(U4rLkjMt58? zh&YU_N0q0MlEjj3nC7r=MTe7T>N~`Z zR!PNWE$GIO1{#0j^=6IDJ-}j@mcu5y4okPq{wUemM9QQF>Cv#_<8k-ZD;=>=*g#&9 zsvOqFJ5f}RPfmc5E%I`e!d09qPlJ+caC*E$+f%KJML}NC7jh(PGzykePbsh=H`_+I6ZlMSU;VE@(HMl zjIn41n@{57AzWT@1xylun@&7<6SW(G37&I83oxe>{*~Dk@phn&je-TtM0s3>;a`Mn zq|Q)Er8Top6rjNV)Ln#Oh^$v$stA2Ivxb$c#(L)9tUp|=!>L9&S2g6>Tm43e=ADl6}vse%6VeK_H$iKwS6 z+g@_iSJeBs^j5E}JhGSCxz}}j-CQwf_th1{h4=RYvFznlZAnP=ZcBnB!3?^wBINth zR)pYdJAmdQJ%QFKR2S(gCmo?9Q~AMDYxRGFJVj}iJoo#a3#AaI{XI)hU}5w-XZ3?t zYiT2hLW}N1%bPvlrN-Z+C0!^9(PQUyLZAfcKdaBP@PG^{uVp1f23| zVE7st_9uLpB7V5Ajma~9byUS9ksKsIEUf*}r?iVEcS5LY&`?kT-Ve41Nq z)%WvsQeqgw>>G-DmuzjR%s>6*JLz-^tsmWhx4_qfB>4&>xd5`1?C!5d`zNPI$M1c0 zkf)E54?cd6_YmGmqv(ofYIso+>7v)wD&4Mn_8V$&qMp7yP`Yb^BbeyL4Rjj!Yj?P7 zJD<~YGj^mTap3^*VvLFcy<)F*^s|2i<#5N2uG~545ajYbzmj_!&I|Etyl@C0|0C72 zaunwh$;#pf?svwCwOMsvmT>YR@f)E2%^h}ln$2e=`n#myuFH^0U&1(#v&+=OiIs1& zX$nG}Q8m71V)UA`t418<-2I}o*ky(M2FD1{z|he{g~=TlM0s^XdRRv>M)ZGWCQMtn z7SHfR;v9&8ADC+HI>)1`6eU%bsuI;QQ6s8c16#)06Bu{`yvkAtNK|_51O9AU%}aLu z5JK3e10xsR-blFYD|S@@m5HjYHNXD6M~Vz2Dk0@@+b@wMEhy24mg}*+ZuhZXQQ5Jc~q-COMq_ zF{4r-?ivnV=vs0O6(L1#ZQ zZ&@%E8tr60S(6@I6=>=5+YX+d3Xilfra6avkt5>s3>8eu{7YCV;6FEL(ShP3Wz9JF zJRR!5(Jt^Bb3UW(mQH2L1N#6P1X*stRp-Rfb^aY4{ZO7b)M7N%?>Mz;wIa74z0_d$ z2_9_|3xPv+epN!$)>eN7Qy`mcZILj`Z{l5=*+Ahi@?y_D z5$D0GFzd7s#mi7S6LfZ&wpVf5eH1@5a4zQ8z$l6wLkZGnEPK55kvXM1I)K%p#N@j$7y5rn65#9|amV)w1O!fbjgeTJ8d`y(ZoPAan)VutZs*@z!vTLAh4wWZ zE%vy!+$DjQhbH@$`--;567#_O8&549H8r$4v(4+Usp+})9R${&!0CACR!>Ey;# zXwf!D0H>s;H^m%rO3I`Q*+ocwzQ;J9SCx-aEnUFo>ZyM+LoJM&DuG}07>nJHZ~|iU z)+7e=MP{P2Fz`!hsL&QbOd_9A6fqu@{h^cZ^%Fjk0rfMLf$#gJ9sKb_wG*RXKMFZevU5Fk!e)B{EkM|VCR59ZaTq~Eb@M95%YL^wSFV5!C-h`roJ;m z(&vA)VaU|cA7$Z|oqq-ET@Q-*aNvHL80Mi=F&3n&$4sPGQS_e&v`F=-!S&8VcOVB8 zxWZg+Y+zyZ%=Y#ps2xW;+pQDS@_x|biziR6b*h3nGH8Fk;h! zLK<*e=aGU!#RUnl{|rmLzGuNbdD&RIU_F1F^7>bjJTV@bUNHS)B1+s3)Z9*^%K}GQ z5AWzz6WBpFc5by(Tr`URqg8|cLUyVu%!1MRu~AYn_d##l&RLFD($8Qpo(19{$EG0Ry3M0}WEP$G}(2{YQ@R(M#>g%Ff7 zq3W40!1L*hQtif(INK=y85H^fw9tpRo?Un3)aMPH*_E~Km~`bN=RozSNjc(yocEaR zSsK~xSu{xD{aAjD$AX)UnHgoA!nc2#m!K=BayC{ICB6K1j^0Fw4D2ilCXf;|cR+AA zSL>HIF>OIDbeOe9Cj9)iz|DO&C&b5FjHN@ixW`UaedhS@_rV9roE6G`w+v;Ag z-xczN0d!VD6&Ocj=SKF|ci>%#NBL3nNFAzqJ(i#g0wmN!C-Gb|2c%okj>OZjeQR>| z)y?Q*x7-p}pFmJ+8U)p4csGAEFql?6J)N`^^IZT4gzih@(lB5>FKM##VRectL@rkqZ^F=&Z+(CD)rda72b5J` zeFb;IUw!paaS10E*xDp3NyC$VN_k3GGgw6=gBtb#=aZh6%xgMES!NxOW%*I_#5Yvm zMXyfHbY_iKw@{2$55tIJl!Q=dsp4p}G$+OR9QY>Nt{uVdI(x`NfVho#WLhgpNmHWU za8;m&>#;MDCBAt_D7$~WSn4rd701}qQ&!m*vFj9_3Q3ENv%t^r$koS2>luzFFB(Y$ zKAlf;bXF5hP}%r6+F$N)^2q733tEL66J26ON;+n`RNK}CBAX~jjb4EH5a5~e!m26> zM(}<UJ6~`k?pMmj-GE4 z&x!0_~1{E4O$EQxZcP<3p=MDa_oviAIu@x)eG;W zWijnn;Y(P5D)0gPdT=$H-R{2lBIu3zO_gLRxR@p7{KcCLW1A(nSGRA^_g;E^=Z#H8 zh#j*iqsV{N6GL)X^txmm7=b`!06x`$qUd!1Oub+DGVzbxnYrMht>;+QlWdKY{G{p;^wTrl;~xb$XyCLPI9yI z{K9%pa@j__D51#9+w_}>;~Y=oTFLg=SzT|TNTPo|sKEH62;vMP?$b=4SnSXjOy9tt z+HlDMkU@oqSmx!&#~%%k4+$HPH$`*`XkUEnpL{$%JpEc;e4H1zu;K*Z-#b0|e22W$yeXzAtG96cVgY_ZQFikWZ80Yk1Jz}gLbwz zxbHzJ7``ww_~u!rmio(@9f1SB;by-zVA}UZMD3{d@U0UjWc7&D-+DhwLv%=b>T}#9bRG&@lxQEX;0{nvXpOr zM2_^u;mkR#(g8SuA%m|*^ZDuFqR4-S(avV}YF*R|U$HxW1meqJoCt=pHS%0v+q~!a zUQe&yrP-U5{2jB(`0XmRx3osAX4tXRVkzw{3&z7iY2(w}##31=V8crRci+=zvH>gT zOR4vDU9nSk_#mKKi~Rf*1Jr-bcJ5&t=hx42d~n)xva%0IA9ge3iW8PAuV>0Kt{#(? z0hgS%T*;9O{$K*IE+-pnp1jtxNGWWcz&1Xb0{4+9hFp0XuS2r_xkmy7<09i^F;Uc4tw&L}TBnL~Owm)n)1{Mo6$EEus!nL` zG?WJ>dZT2uy*A-%?0ZXz12K1PoZG9=VI4MR4Od^O)BfTmuw^DUG zC9=S&*s@4gSz5wS=NB|@)SZxpTIT}kI5uTas=0DWP3yGMcszg7=>Jka?Jv7Lk}cx9 zcDe1f_O9T)0R9pE25Au@`DA)>aY4}-%egM5ft&Rt>dVUJ=`lCs^2RBS_PG3>Sq2oY zl?#nLc`ZFSx^O78aXGvW5Ty?owk2)VKXLHnY(F%B3bO7&?9G#9hElo{8cqdS+mMpB z7OyVPdhUCW_ve3&IBB%Ncq_mkHrfwl*D}ID9SMkn0z6a@uGp?m)z{za6^p33#(n{B;?5r>IlYNJB$F*ty>{lqcxNZMU zpPF=P`FcmLjsv)T;s^{B!>Y|o0Y2V=7L^!P?5(8HvhMX)SZaY#ss=8FuJk*f_Z*me zwmtv9o6&bOOUX!kf2_P%IT2%FsX-68lmwbL!Vm!23)Bq=i5^O_FPn@A1`y}NKsX@n z-v0&e@2G$7K{`uYdVdCOvMb2DaLU4I^#$DVAbHn(m6SU22{L>SF_DJk?rcBT6=-{` zD}YQy3#b;D3JjA~=N6nk`GD#Wx~P}PD`5{-M$Tf^?>>6WLEb{Td~T_r(J^EFKou+w zKaQqm=f`A7${og|f6|=7rc<#JY%(a}fU-z4%IbehMQxJ$l8+;3+Uq(ONM6a5r!#1d zG^me0IXYr=onK^R{mQW$>mH~@GL9f~yevqPgsF+zh|v?$E+F)v>IYbFjr#%PTi2=| zs66;$U;zi_q283iftwN=t6ncl8m`QAW1?8@?f939p1IYhUd@O5>VmTB>^3ydKYOxC zHr{{RoshK(T?Td`^~+THEG;Pjl2p;8UXf&23!*SnjiyUytG>$7-&9*2d6|N~s32>1 zJ30N>5bbq?JRiNX-5=wEk{+lP_Icj%wdCgAs8!5!l!{G};IED6YIA0yrU_ppAh7@F z;LCnY{hDxtH5EeRK`ZT1v@sBxu=Wx>;6{J*o2JRQnZN+Zdv1wb!U;S!Vz=cT{js?# z+g3AhyEGBewbQIA8yoQN{>kto3R8Xd@!|3Cqw(kP5tFIC@XB_4zcdn()wvyeFFNk8 zDNs-`2q(**;m?BB&LM3f$+jG@0N9ukb)tHuQ#YtxL4WK~BdAUK)U}3^{OnOvZ5My~ zV;@@4HdSjU>Hv2vA!$dy^s4KSs2_TmKMQ^LmbU}kinfziICp#>4c%B`-i#hm)s+<7 zZuHsk^cV#3X*giPD@_U?n@{I>)F3gH-#s0|3%&iLgF`%Ulnl@HH0FJ!gy5xcyVR2H zBsUjR3*vCFfAY!cIC?xh9Ul!pIy`?M+y_Ua$48?P{HiZ(^F^%0r=zc?pW~e?hjUgR z;@y6l(9G4BwmX$sAKrJbK?12OkeRy=6C7vQRbx0eIZKN}J>qyaqJxfS3il3LUfnxx z?ke&~_^wsMt?@y2?Xp@FQqbI2F#m8QXTjBA?anHbkF(p#^o}dN-7DHHv zi*iA;|vP%LF4XlW&k{Pg% zRsSAX^=Gt{@U%$gs6hrY?i6;h9`?8)S7Oq(D}Bk2Q*mYY;sy_wG1d=1v|pq|$jfsC?>Z=k%S|K>s14pNIvq%-sT_MEf*gEEJT|v-u4f%!Ot&`jb zh`Z&6gkEq%8 zcp3lLzo%ZdI@#01QS?y7>T64dGO{1(I|(BeI+yh5-&CY?f3B;TwHCL?O0<{CL+}-B zkKXfsp~jX2Uo?NU%FcHU^WDsNxuTLuuRyQrw5I{>cYaz=hGk}cqo=3h)16`kJVT)ZFbQcyzgyBCuj7;iX=p9)K8h7tG(2pv$ant0|kGv#TYaG7=T}aLCQERzHuBBsilr|hS zCCXF3#B$XZTE6;4p^8D?DumAnTdZvGON9x3iRFKB5TpaW&u6O@Ad)kJ7;{i1+JjR7 z9tH(4r8*QAg}t^^ako(PtpTFQESSY6V`X9WtM<^aRzdCMC}_Iz$-xO+trg{Wb)^4& z&aegTNAJup1*|cTgay0K@DDb70JFbZ!x_zmH^h2SJkkn*ziq$$sq0^H8}58!Q035}lTnh~1V4tv}f+Sm?XZ1@u^A7a0|`bpspiN87veq*wXFJ~>2#i%O} zQb1I1DTtO^?Pbx}DPwe*g`;mCkcZHlHde`5Xm8^93QvJoojRV9PhSqQ#JwFqMXF}N9Ue{!_#qQ_&f?+7n-!6+8;)vye+e|y8mkM>IBf}dfA{~+99>I6rGGB6Mb zV46S!ZNnsi4zKB`ww!3{SV6K0feF8zeQ3Q}oi3IVCloM`*1Fr>+uPgQ+q-|;yAwPo z*^hYyQJ#nNlFD{nsuz!)jYC@1XDX?-FD!pK4#l@i(x*{BuNr#80EFXk$}YPYy8lP=W# z_D8JQG?iZ{(JUUt86HJs(^P*@b1jA#Kf^Yg3OZOVcqXn*D{lL*3Dft;$Ih`tDt(O( zk{gtak?>R47H`K5VRvinbZ!k&FGa4kvk8qb{e2wq?cjQw>O}w8C{oSPe`+>VNbK&W zN;0+QD+OE`w+NIcMY{jEej?!oT}D(tlatpdxn8as4j(QmwNs#N1si|$^oUp(NJJOL zr*4%XLr&kQC{@p2;samST3rTjChd)Q)316z3yrdpVGo^q$;~?p61DT@7G=zl+>-b_ z%Iztg9_tk!a-~`S8_m*j$a6SF)y6la?L68$(t|2=PUYRro>_0Y#zIlg`uaDR4NIl{ zoyls*w)rd%D$PCO#YlfX7Z*|gor4$NCEs-9x?KZ9vTSQ!2x+U9)XK74!?N7&m^C4F zyQ>jvrBJVcLM>~k!gb(X9;n`Zg@-Aru68Gy-N}pF?%b|HKWo>=Dn-!|*T%{R)wwmL zy9aIqX+gQ)4oE@QhRG?ddjWovLSZS{$-j zd^o4s37k&nzkd9tEM$dTcw7Kr8XXq^xMs%%0I6+Dlu>dE!f5E~h4j~f2D9fN}W}bHN-jZ z3fDPKCIq}^##BU}&8;STUGl|xY?_JYw#(tTYNrceJG zF=n?|LT(AJ3xl|W!}pg`m7<&%FnL#?=$m*S-=zFypWDcaduQSy?!>vP?RNOpHPu#Y zb%SG2 z-t^%$0>03HF&!BbT`T{hpjLbWx|`SY?Rmi z7cO{TZ;_l^s?>=XMO_EY@gh>2Ie3z>pgdLz)sC_ucn4O^arMhjLYw3?nx2G%I2m_? zu3H}<<(9b?tjp7-(O5J}#8vKjGUm$i(yNnyrkmEQk)4y&tCf_S7F-IeYN^_7 zY?vxA@`6ra({DhkVV7|9pt?uY=!}bQN7|hjkR4JD@wV>3K=d<-j)I`d53SMW&d6+!>PGR z(wU8aISkm~L6Dlwf}P#Nql5h)%;umS9Bv^HaVc8`-2MJjjuN%nb={;oKZyv|dP!}3 zCZh6BdQ5M;-h9`$#4@9`pQN-S(rCs4&HnH7gxVa$xsw5k#M*v%lHF;C;H~UX|35~i z+w^~mV2A&PR;~1@kv>g^x9{iZHg(y^zp6fejve~kcUcA5TrpmUVy=oWE(qP{!wx?= zq0BNuF&2$M?IN${1Lt+eU;MkZZ8-xkPL1o^up`bFZVJ4Q)^I!2k@3DMdL+Rc|^YA1dywrg92>$wKCKkh%>ef~xNaMw@IL(4rduTbz<_V@AN!QKQvx)tk-IjF94gLz|MiL6So{juJ zSV`ATEVUqKe02x%^Hz*N+E6c8VXret-1;i}1KNM|_d2Y52Ql~I=d;@kk!wuPGe0bp+b8m{ za%M!~j#&*WXB0j2TFKB*2#VEd{W76>oNHO3sT!C{Y;yr>Z;c2%v8iq2JGBy_0ftJp z3-mOEOw6Z009H{n2-Y83YoRq}yG|KUZ3=}Dhe|lw+v&}JBN6qeoJy&GL#2&lam7el zeV`7m<>}Lu&LtPp`(Rj3a${s_8hzn$Zp}ae)a8lV`?Cz9$WF%${8jNo{q=SnQsG&A zD52&$fm#XuY2Z1ngraqmUu6V0q{&oR0X5Y#zPZXq6y(L-5qA42H11pZ)>}hxnyj|T zTW}ltc(kJ!4sivkQF1qbDGaM=)nHZY6MH;bYbXU+Wve2!b0M}&4H@-I&E^;x()q=; zULf1o&S1zr(k<{WGzsP2=!_r;#unGXR{Hi{A|B%mc&{wko|RndF}iRvUhQ$Z@Of5a z^=hncJ60E}v+VKOj>ttJO-AJc^tMLkg8cPHXM=pbF}g+)A~$z`(MW0O5UGnrB52L} z3m?{=3-&q#e^8N<`Lvjtjs&jn2n3FFZGyqKIag1K_0y~MHI73NEXj3{A{5Ni@9LB7 z5U8TQb7ulyf;tqau=w1i+JL6y8-dlB zwO|9RS{MEw5bSWR)2rdHcNNd57!577L&PzS%__3cRGLrRo=|RuN?}DC6}aqqTQj?Q z4BWihQ?{>w!?ReOICiwF0kdMqRUsoR!$F{CsOry$}&m+|$3I}XJ` zb$*^~kfN8f)2#dj#O(TU6L#H8nixwW?gUdm?Ha69xYfQ?xzb9G22#Tz2Lpg z-hyyza8n@Gm^=~34|4Z+@GrkVC%x<+bLfPDC3|#2cIDEoT)LG@cLOJ8<R$=Qwj#lwL z&_Cg+!kNEiFFf|gf{}}l>Re&3>+y@Pv0wRvD}Qk15B?+m;K~zh?mMkK!IdZYpIG7x zUO~61#)&zk7liRn0Z^Bh-Msi-Q@3S*!b#YrB$oq2N;wjCD&ZQut&ERVeauNkLT7Vx zi~j3Sx(3-#9;LG^cg`Yo-r9T+jygTQd3H2T)2u6{zVqG(o11HEMFEp1$)qLz2b-V) zT`qb310W@|5TYF|AXLx+rjRVNLsYE<7%U7sTb(dODEUo=);;yMe-;C&sCZU?1MX}H zMqm?zX$tK_@lDqX@+|IR0dh8o$;F$YO484Q8Q^6SpI^a=L`fZ^wtfZW1mA;~9$$pP zV|@F=#!@Mr7coR^!R-pulez9661@&r&0G%{Y>NsP7n_vIfxh7)Y$5A(iq4FIgJkCUYCFr^^9&2bQf&rSDvDfSo#j)1x)&vZr|rUy8HtpxdQ%;kWJ_ez;UG)Srf6-)vxsS)L^Gl0x=*4m`ZoTnE0(JwX!(Tj*10< zc6POC(5S@{<@4fB3E(OcqO62#9$2C(`Ef{r2q`*EXA_LC6*~@p7v&^yyUoy#+-H;{ zDTW)r7T$IPLYcuwQxPe;26`TqgL^FvqU|MQJ1x^GKH8HpLT`$0`mwLQo1lB7aScLs z(r8b{k%oir^*7vcxbZ!KbM5byl)6{e(OyLXdvzMstI-ZgyQPZ*H#TUj0t*{W!3re< z81=~Gy?myR&qvm~9 zH!00vLfsJ9ElA$5wT(jN+$Q0~{r-J&9=v<#_!n0BiwoKTuTYTED&;9j^;g{1H&EDG zE(kDCA0+NRI{QoYJaV&WbI)V6zZgHrR~7FIZVb^hbY6IWDBV5Ruzb{YZ_yeeuVql8 z#4>0Jj(bvRX4DhSa-=KS{;F%f<)$XlK~NrS zf&-`mun7X#V188Nz)O38;h4{B#G@Bo3PZ`h-^0Hwj&*<+;@l53`d$ze2eN(Tluc}~ zxExA!%w!XP9QE^>ms6u|ZEy%Kdg2Ju;)p!fK^Eoo9CnHieUHb<5I>?M19y6Vg3q4p;f8OX24`7}@2BUQ7mTv> z6r3e=M{yAe$k4mOR6^l&(ku~J!Q#F<k% z7{ADpT!mQ7>H_2}AlB?0Kq}_UiKlp2FVG6@;S8G+p(wm{m?u4QHMNwjXA562b9g;< z(8qR4zE1~H=< z%%k0%?;h_SkOWzx4E($b-3$IiC9(n(@%dNT=6j40ht!b4<^`(cbT*ErX~yS<2Y7*f zj;1`H;s}&b-^!p1|9#+Mh0kSkcT@D4=cewR5<;~I|I~<*+BC8p}7fv+F9!m zr6&rqc*9j9ixY-58veYfJ#W~ROYgb#*2)^Y0G9NYRHzIn2eom?E~jrL`7TNjx`^l) z)am#bgcA|N;V>pk2crkGT0%y)n6D$`t5eF-8>c%x!v}XO^#>eP`20_9AdPy*KQ8ZH zIp$@HjN$inRl_XneK%j^yjnGX5UyLM&@<#5#qfh#y)gBWRwrX>w5ha=!YyAy15$D| z`Tov6pe0~npgE3lzu)q8~5?qCt*KPJLeb>fQsRc;USfau$`YZh;0oSz%w!hlEQU|pe*li@mYqU+iRfl;r zslr$T?HJ?+vZ1LAb%%R@})wCA?$5AguYG2DXhnTM?)c}gGC!MH>W@d zHzRR)l3J-?0urb=ZBu-f6OC-d3pGKEz(G0~%rcpuVmgdIGa8YPQ=D3-057^JHyLN~ zX$rH3X6p#XG82PTa-Bg|35eCPMwrvY_@YaL{i^_^#I+2ZeS}4P{Dp~A0 zC%=aRXe6FT_4<~2D_WZdofTE_h;9=j)}^BObQAXiw|Y{LF2O(*WMVMOGNAq#>|yaH z-QEsgi1k`+7UV(uf;$OB_Ht|)ei1J3R+~(0X=wq8{k))CU#j|b7-9J`y69b5!TOr@ zq@5_6;kh+`L#F)vaJRox(9}LmGrRiLA1R{Zb+NMIbi)4_m6vl$(4O}K&82C=N(0VcK|lKYgj>C!DpIk*ldDkgQ zA=)jOo$&o;4wdpjkH*@{g8b7Vrs}G*V4bPjW;{Bcwr)niSw=Go8QYAS>1jm;Xwr%T zW?NA+m(YqpWqGX##2U6@X{-bnAG!9fG)_~@u6n5QUAtmuW(~_^XFv~Kz@KOKq3I_kfr&CTb}fP6sfrj z@Cih0N#z@sS8_%ib(I^g1usBwLVRRb7LAH=guPxR_0$epy5JcU@ zEw+jqi>`S!V1UVH6S%v-j{Tc)FU;#N{V@-LY9l;dSE_zG;ZH zBPhBYA(HbMVvnhUB#88LZJ^|Tbk`Q)9;H(Z*5ae$(TluW0~7wf7QB5m#Kl60Ki1SN zc=`B5<01rB1}!^b5g->zCq_7Af4CWZ;>?e(*^zjEg|=K^ONhdKCl{w_7T4(UF?Wf#)K9g@h+9QcsJg^N>L zTkGpT#QFMq@J{dqLUt23xxZKXcr-hWCh+|ZnBAn$yAoqQ_Zl%u;3 zcw=yQ0YP8M0G~#|N?oLXvn)6*u1g8m*8x{3y!q1?Alo<#_RzTg(hb9(zs=%2o`6S( z&_5r3+kf_y{|vwW_A83LWz_BMZT+|huSdc%*F6Hfya#zaMRN^*&=7nN`A;e2~|nECY!N4l7lfk~$^ zoPrqUp(@5RMK@(*3U*UmM&c>$gaYS>@$bAN%||lks&KfYEf6SyS#E?QbqKn7TzFrwOqKv)hy_Cl!_+%}8AekUG1h``A19~STf5Q; zLQ1$?t7}-&Pc(uV>Ll=~Y@)IxIhO(2r)+caqJP9W(&dUk1%&M$`d5@=g(~>)g%onp z;CH31_yU6{8&*_-SP*fs1d*}lq=R5zM#=Bb=fopWkYfZKNr%%4FyqoFdm}Vu&{`7; ziG^MqQ>j*ewV4UMjR6WkC|f!K^)R3E<}CpG0heX%9w86_mC6-oo8@7QOXcMm1|Owp7zvzzg2WLN|Kbv7Sw*^(nJO^ba2ptC|5u*%4{-Hq!0JQh8?uY8ypN|5?0MG|xG#i}s_y|sUe43yZvQoQ+P*5s@ z0f6>@bsb>&1X?(+%pQfSCZ~9sr|3~qgD-Z!+&|dG&c^aJLvMuR1#DzhhFfE_ATI}^ z12Wb_mY_^`SLww_1kpk`)@p zXs0MA`yjRfI3rVfiEaZpg5()Z)zISqb-iH*V_=p~k?0BAUgn)$Rnm`KMocgRbR^Gz z)=vGt@mMY}Dq#c>yC3OD^cic+(CTYqttf+y&KPJ8FN~{-1)JWen#jc1|0O@LT4J6S zg_0-1sp#$G>gvLNgt-_5hzJ+ZG_XM+o}>5`A;mOG*C%@o_5ulzNkCTuCnAMK2HHRe zT#V#w9Fx&Au9=FCJssMRi22H-$q=)DM#=Fki`c4gG@+FR=>>DB-ke%*sV9ktzw~$~ z*WlM#GI$A~NGBeRk^vq?L))<4Fp7L`{WoD5C)s!vUe)PH*PCMzLJCwTJR;Sms%0JVIIV~)_oD3IXIH{Yxm2sz~_2=UjadS8|8 zxuP@BI?$NWl$~wzMiahZ#(?R6+}3tymxTjBO;3|Q;sefx+m;d zM@c5E(kXTxhOulQAj`yyif6Oya-bHw0C4Pzy7Y-!7D&&CNClf<;xY7&c*w4w##L$& zqJN=Bk-wWf*8z%dJ0E)1a5fy+tqo7Z3wYZUt6vZk|q(9!96j76aR7o&}XD+?V7lx04Q!M_1O zcCL9;lns9ftpmr3Lbt_=5&JwTcoD%lecZknMLKtOJJjAjtHKd~teP^b{k>p+Vtoiq zN2{R{4c?fsCR)ZRU_^4slgLEDhx34z zJPdwFXDB5c&^@$&=@=K#M^Sk}(ldmZrtCZsXby=e6k&rrkFyvpdpy4I)#ytwIJm>C z6*A)=*`p{x2yk9gTsw=VV4u6_#OtzMO~XfQ!o<|Th`zRfhX)IJcyJXDwtN~`WIy@J zlK*D!SeqLsVxRdJrUzV79MkrAb|}!h7U%#i)0W4g_$82qGd(81U9)t0c zbKmmGg`u4VrKcz!`g6R@9HcW`iI?A_X@rX8SUp}~<^w%+{G41aa4?MdAzje3=526d ze8n6=y$Z=2h-@kZDIz{5OQE@hkjz5mAP58QRBl&)3K7!SG=*j{F$_@p>M75(05d%* zKHP^-#Df>s`*^O|$BCi&BmVt@jK?5>_2g5XJ0Z4e~T-uEl|~Dm#92p3}W~RhLv>6 zV^DLXhJvzH={lqH3xQ_;t2x{4Ln0eNOQBkP!{lOkvrKn#J_2XCqiMm>91T5GZm(N^ z&zIT%=vV|)v&RK?4nf{-wgT#ElVg|~e2a9-YvwwGrsX9-L5{UBPGiunUTd8I>lu#& za7iZu0&^~GznfHk@I4b5pIiQdzY(uOyCW;KIJ>pV0Sdci`!UO zO;Ih^lx(KRn|OB6C11%Y?xIExLF`F?0K03>6Spx1w%9;nVAwDwM%3$D7%?$&qBbcW zX4Cz-9B{CQ#XJKeINR)&15fD5tBzCbA-Ik@C9 zyM6*7bfNJ)lUp`c@o^l^sVH@1uCI%l*N4F)oEdAU;IkX?G^@5awkPO7A!mMnHjApe zf%-n!16;}Dp*jE3A`*p7udeN>3fKt0sb#ml4A;`#>+tfSBurBZ#ev-BiSeE@ zJjTnukf&oM43Fi8cV=-Rm}bI%jzTnAcYea@CZ+vAF+!1@z%gZ^HvBX^4Wmg4Q0+ell_7=tXqr%1d>=0sDWQ_N6GBv-i#~fE+K0Mm(Uk2UFc+m< zSOIqzdIp4#h<7xrk#UwY-g4l|_vuma=)?Wv4-SJ5kIv3dP9JY>n$r@0-#<>tZH?a` zp|_64+2!JTc^!&SxUj%{#z|bzmW4A&Qwr+ILhdGY`JwQPW!@Ksi(|DX_U`uAZ>?xaXwWB(UJEN^- zU-gR!WS{D9;+8z2oUVnh&Cuy$d$ePRBbLfRQ2s^n>)3eEv%zHIYw`MM>&?;jYo>*4 zRGXXSqA7n%4o{Z~5>j^IYtW%nYa}lL(cgm=xEoffE`CKGMCC(&*dyOB1wn|;#|=ZE z%2MfKbz?ss)-1)@VZ-3!VmUfO?&2b3_;m0v$TT#zHyaf`ud#V}Q32WoNwIzo$inGG z$*sCRQoCJ|+M%9yx*%0n{iBgWm?c}_Ut2M&)&IMp$L89y1^>7Oioq%zb%87BLD01; zUH-f6oosI6#lH}L;*UANML#%Jt^sok`rae{l8C&(1%8JUKn%5Ydz4^V6e;pPe6_ z9G`(Ysuke`Nf6T~3p!fu29CxU=je{K8-VhZl-}gyB&K62@weW=$UPpbpz*xAL-BPc z9D_7(gsomAcs!V^y^W#UTB?zLy}5aalz4Wtx%tiD>3sgI*nQ;{Kx%PaL`e)hALWZz z*xxsL_Vn3*yNkW;?d@0J*dB&BC_G_Z#Wb!*=*R;d$wi5rSx_0LQHlySj4a{y>6wQH zlJUb2ie|z9GTX()S_co`GI<(1#)T>#AoVxNMRppvy0x zgs6Pf=k{D)^;RRVPq&V|e}ICIg>zFWh{DwsbbnZX)tnf@w%3h~xQv&Y`3WPZN|Keq zJd!~rlyjkp7#vNerAh-W`c>b5epn2ch&=9Iv zkHu>6lbb$x3fd-mAhdi>Og0WaEgbh<>aOesdSD9zcg~dsL=*&vHsZq#6yOVad0M3j z1^cvr1rMR&0pa8Q^AotghVy6kjIJG%*;P!@0*ooTV$Fdqh-C;ScXsjc@ZzI=cz9xu zC#`&8;^ATN(f;VQt@lp%Klya@0bAP-l1VZv5`1P(5zu$zW{Cx|LEkp`(Fp4%&24^+ z^AtHl9S6%~mc8-4`SiEV42xM*I^4PUi|$RMn^Wj`;ompo_xVT+F5@Jd`u zHnHBM#*v83$n2nomoO<>`c=<~mOZP;Z0`Aycn|6tv*uhG$VfeqP8yU5x1m~V1_ zY6C7xL$4;6s&#XkOs3VGPcjtT8_68ylO9(Y)ROqhWhc;RmQ_Y+8UqUS@d7UF(8kK@DXWv5vuH2M_r-LYmu}aBThROuVEOPyUO@`+c5m5I z`NlbS)mMq!1;;<9*Nf{euH8`9z-5ldx6<1l^caD4Q4m*g3tYXiJ=1xXu*ukeD9Rjo zED@VFWN)4^pjt)Xhv-)VozR5Wb zg4O>ZUD;tXg-(HdOK!1#n{tEdaAMO!sn>Cg&{EMw<^*nL@L4<)N})*6M$DKxmQty z!(iiKhUdqgYB(}mn zkJap-d+vX|z7q=nRlOc3{C~~Nk!w2?%XtEt-lPVRX-~gmP%k-?IFH9Wz@g?(1z*#CHUQh#i0avxl z1OsN=f$)m1ytk9sbkECobc&~dC^}Ayvo$|*El#wQ{f-GMw{-=Pm8dZDcCF9%D3utp zBwvams8J*!5b7W_uHq(n7qlxqI>IrYYp(4(nEbCYwlD`jr>i^5|70 z3|Hzk8<}v~#<{OW%q+ zv^sFIen2Zqm2(Ly21eqG!+GXXUgR0&}I$3S21~PmNBxsMrGT%_zi|xMo?L zz?y)aWlJ1M^^_fd%fjF^Yl0yUjR{on`q66qRhKcfph@j0qMSpwu+-h0yoD6niig8K z^9A#LHsh5Kayttv`Yz8iqa;Jy5q6@7Q0FjR*`k=<$XsadOzj_uB}+-+yefd07bTJp zA;8RJQ{8l?=_KJ*aNGMha;q#Id3Hj?Vd$K$u}TkLA9GHB_MK0|E}$eAev=Jcv$^{9 zUiV{P?X$N6+^qlF54Tc+%Lf2dJHkiO@a^}8o+;nIB;`Gl(3?ct76SvQla28fd2bNF z8p&_4*=;l6AdK5*!Ev`apR95gk?WIf9^Q2r-Kk$PygbS4*As2R3z-*AhNDLjmz}Sy z#Z}W)VZ^Y1yI+C#OdhidP~rnj8d+uK-YSB6tcl$gYzfcsw}x)ogB^4WQoo35QRh@q zq2Wn10QaPLDq^(;)Jet@d2l2rx_%g9eRLcg*q><|v+4 z5So|*u}`tNdR{$ijmJ}dt>4Ak_$>}3fzuE^CzmPg`$d`TOY>W9Zc4re8J3Z@8p_TJ zM3G4Kq6CR_=aZ!jMVHMVa%B)yGzZ?!(N?NdW*#rOc@XSv0Zl>f1j7(^2He-dkNnjz z0G^e9I(xxuSm)r=p#uM632ui3>jP3z__*~%CmU7;;gO-vS8yE;cP%+A&2>t}yOG(z z<|mc;S2C!E)WlpeT#Mcuy&}oaQ?*~_T5PkkwY62w@vVKAcHN|7tTctxjYo63JAdCk ziq$$D$ZK~B+Tt!dkiUizwKY6eG-KSf5&Uj{Yr^?xx}hn>E7socIra z)GWKmm_9%oPH|3iSbOfbEN8QFOWW#f?^V%209!4M5m9X{zqBzn?<^zGCe0#w|3 zYw@2QADyof4Hdx1H6v7KvI$jVp_J(F7;m6$tU2xF~XeXw*Ju zo3s9Ga#7ZU!lah786}(PO~B>TEGv?kWQX=|M?sH0;XIywkDh^J7fctRH|x zjillu>Uc@`?FW@~s`o!TGcfMglFM7N6Dsz#X~i3>QknEyhaG&JOy>7P_xmSg0lJS& z<`$mfY3_d0tR=;Ah=&$K-elZ=Y~iK7DsFx#xZD7MaexNng6qDz^&;0&Tj;=SHJtuU z5MlUyO(u*jmjK&4!Do7;v+3hoO&_`?snXs+sJEI+mPJKlBP0Z z&!)5}>qy$M(n&@0B8u*yK1HgRa1$r#z4Y-%s~Ht7gQ(X@m5^bCK~8V%O_M?tFaknE zj{?tPvx$!^y}O@}Y&+)^WD56cwQW6%k**-9)NcuybBsI4K8G29`FF&xeTu^~fHhu6 zq@~)oJFYT%T7#-Wqp=>}@v~%iWKfeh2R|l0V$9GhaEdN7{uWyUJoI*D+O0IgAp6X93fw~7nt8{2QH{!)5%Uus^QW=&-qnn7dIRCb%6v>A9* z7^*zzs-4t-Vv4L%La^$-UCr32ce<@5u^|Fu)pZ>6Uv*i^1omepA7vD!jwCV^F%-TV zf_RiCOA|{Cmi2Hj6^Toh9umg^isL(_mL1g}Pc)#4mu5`TR-(y!`p&CUbXS8ROMIed zUs*}BtUln<&{kKQT4@4Ywv;#eDS0$iqoxboG^pTzQnFGdOAouMQ@XV($<7$ho!r-` z$(7cQZi=j0(A?aVd>6t$2uV!dOq+s?t7^p5j=MMnmj^P9h}|uF$HQDO3<8~{CcWO? zoS?%SG?V^yKI`)kH8QgF+(?Cfr?^^UD=Zsp>@_xQYI2@lqr=8^8DGO%C&#I(&M0^+ z@*>NBp&nuGzHv}-W<1AXZ3wMpYsz;w!U|X%2rsJ9h!895zc19>Bb@<7O(fBCQZ^_< zA**9qb`zE~4So&DD3@b&Eshi-cwdGcZuOi*b#O?|M;{&@eD?9-DeuZyEo{L6`u6mM zyYdco=L!=QC-|fusz|OL7gWhL3?k1}L#f3V)Y85^p^0RxL7Ct-U zY0^Xu219&e{DMHo$yJ`<{*nEpIFJHQ`V;#UD}E}a1T~*irefT` z6D_O@hiZ#)q6ljdpw)QK>v)_rF6h#`zaoLZM2BVj=`nq>wOEgKt1iFaB5Z)9Id>D5 zV8d#+^3mw>ZUpDo)sDZ3ELl4=pkEq)k%}$wKRf=)FO>CIA)Qoa9;Hn6=Wjq7Nu+>P z4S;v{s#T>{y~{2AsPyJv29MHgxeTtT&eLg@&2gr?kU&^G`ndtf4V>L$Ld^;m_kQ|oct-O)HhWoiFN-<%EL!^ro* zE$pVok-7HPKeqNL%~D|eEG5gsei@9Lv7;q4nQP~0Db;e^32g-cKpnfP;kokwWe_+T zS<`bFSg|P?h1B3OL(e65dnkBo(ycu-KBYP+o1rt=hpof70~T0!9Fs|Zr-3kk=tzju zEsx8AlOAF8yjMK0yQ05rCQlQd%L>N*j)>GmEmG+O@JYCF?IJm-r>>KJ3dLj48#{_p|IL5EgKIc$3VBkv+D_=1J%~ zFK^mWN=x*#riiHm8Y&d(RDVWVE6XtfI}cVXRMd?MLh|yl0gae{LBR=$Di%iqOB*P- zpxX3+?R#K;^z1ARpKEWzEL@)T6XM-6D;NIFNFnty>wt=BfuQtm!W2d5 zzbyw+K8~3RJQyt&jA$9-^IU+bYGb z?Z)tw)0^%chVWRAUm^?kbOg8=X~|I;4m{`>G#GY`4;;GqFv-b$XXgy>F?hngjUM|O z-BcUdIw%)^bgT;At$AZ=8ki*IP;`hD_@0Z1`jsho7g+}K4WiXj{&FxdhzBF3-mrT| zFshdFT1Pk9(PQn%E}r{M5bsA31C65lJiz-w6t#>JDu9=GJGh%J;LJi-qmlc=w|IGb zXj!=u60Q+{t*ey464YBW)$P``XBk&kZ6DsMudVKXE$eIT-_BnlNSbwt@ABH_iKWV7X^LH@rT>325TFQ>Ps z;l8hb>3$8{yg`k{%>$pV+ebHVGU7W{dH{!iI7jzRsyf#kjhfDH3R(g?j+11pu4C!M zzCjP0OH!bLWk%I(g7q+nD?T;oKrDG))9dSGoWfwHH*6euzJ45V%^8T5J&2zrYI-%c z@}XV;>u}T%0rq8xwjLFUsoHA&7(BuBuVm@cL=wRb?LkZ90I%^8*(hF|)aJ98^{M+P?Yy(t_5CbWy@597%3~R;L_H86=p}`WBWOeC;0@HuuBHmiB6^1oy#Pj$51fXKN?EMyn6ACd_2+)$RBpt0HI_0qN>l;IS%B! zo)uaaoO--!B)S__t|W?9_Vc;K1XG898X?TX1Bo|Ho%eSvULGW=LNGo?{QnJq?a?~9X!GJXsdR^nQC77GQ*;JLU zZM|6U&``2;l)j7$4bPWuUVUxZ0}=NP{T&4+$1p*dUM_GEk8%Iu918O2tpp^0f1Lfq z@!-2bK=^M4U>t^X>sIty@Jg@)vUU%9wXHscU{+~XY4x&c1-MD0hlIX_Y|Vel=qj0< z)g)nr`b*0AY-$3!yKPOnatDb~G@=Ct7Sf1@%~n{cIUeYu3mev-y%K7vE4O*+L`%V4 z4CN)wxZ6ZZRYy=E+|`@7?m^stVL<+5z4k(p4)@may^!vz7l}6bjWhM|gU+H*AwvVT zb*C0MY+avcpu~-%m2<^u0tX$#EoCwqDY`45oIxWd2ETE`&|C4$p7ldB2)u|gEE_kn zPtpJh%lU@l;1K{tK)SzB*XV&xG7ug{q4K{BXC51;Z!=M*JtU5?S+BZA}Ythfo#%*V@fX#|Hy+R7GI{KfMK0KHhst>e$berSk7JwW-riAgP?p^ zxl#diUn#SG-P>DQaxzmjc2Is)f47vXhp4ovU-lkCuSY;uL07w_Gix9}mY*H5{(yIY z2ks7F(QD?F5F{wjvLcdN>-8QL^ScdvU{*Ge^;VJQrNRF z8pUX3S+4I_)En5yBK0qQp{(&-z|8kjSIfz&wpXB_LoLwq4Oh4|k{!T_g{KyHUxV?gOvOD07 zT>DMABc-kULe=Itqc}pXf92ih(OU(FJ|F^A&!*jTEYw?y8qj_PYkRNsc)l}Owklzz z6UWa7m!CX(Wv=6!{I_auf;}$Q#h!j=m)r=h!xi@0_r>m2F))aP3^WIr@x~y4WYHoZ zV4OAYj2M4BLQv?8V1V6rxDWZuuUB}ou}J57RqJ}oGq`Ft&7+^4e=3h_RRDu}oreIX z%~Qc?^SHImO}))I^g|QQ7r==A2s)xTLzWViYbiG7&0V&e8(zqst>jQW#Df4AhVFz!ChSy?MJv>y}D8m9j(jckXeKs2(Q|E@;1Gav%2t�? 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 z

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

JO4EPx;v&N?IJK!d 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 u^BNAe@@4T(Kt;ughnhJ58gffBd-%M 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 delta 571 zcmZ4Zk#FW%#tkoI>wUaSz4iyREGlDUU`S_XU=U+qV8}5v$kTUmb#n~$3DNh>&o55Z z%PCEq8XW6=*g&K$L-h3KR0hX_h}11r5ShEtDQb7BDVVF*}L^RO)7KmEKB$# z%Wdff=aE$cGM5&qOg;3pj^*&b2aD>>WO9B_Km6Hw>2srriERB5;k}90 z=HcA)Hd>i~Je{q~x1KvqFY~Oi^V`FQiSL=umvV8%XkgUn?-@65 z6Q}0CU)uX-3N{(!9P;UC@CtOQHx^yDv|`eZnB=XSb*H zysdS6i&I!KOQY)5W4wh)|7*sOjmqhb1OH)?eDj{?{p|cJrwp|Bo|E zuul5_R940_MAtIlzrxYtzZ;j^+H7B2#G`RCWn*~gdA=xq$tRiR_q*%fsQj>s4SlVA zCNpkz+X1l{-$@x$yyi@taeT_J1u41D*XNeom8nIYm6HCoRr7PhV5WY&zXyJF_1%lOn_P&h5-b%=0}MrtbqX zn0EM1zcZg%ays`8W-TTS|LHypnPsMjY-JXh-nxldfESny7=TFv2=WscrZ?GE0t diff --git a/Moose Test Missions/SCO - Scoring/SCO-500 - Scoring Multi Player Demo Mission 1/SCO-500 - Scoring Multi Player Demo Mission 1.miz b/Moose Test Missions/SCO - Scoring/SCO-500 - Scoring Multi Player Demo Mission 1/SCO-500 - Scoring Multi Player Demo Mission 1.miz index 7572b8aae43f121532d2b0d18efdd8edde657c93..f518c0537ad75c6cf42844e06a3e2f067fe8f9d3 100644 GIT binary patch delta 220034 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�?(a3hH8rhC$WZFBnvP;n_jS2|;Kj_oYV%+&4^c2>VoK~VcU2sin%cjR- zUci6D{Wu4s7+bw305HFSzW`9pF)Gh$OR|LP#59=3&RR_;Qh_Z^@?-aiU&tHq0R@zMTYQzw3AgRx zZaUjfbEvl`&;II(#=oi+l4nuhc9)g4Ud(?n!`2_L+Mg_@$bEF@qc5lz!GL>&@{}tK z|H7qpM!4KNJKsM)dPFqmFU0?h=znifF$o40a;&!lYJ2b6(kjFz`cv0e_vOMZ?{L8o zm1SCDo)k&@smA{DgFJ_pP3Yl8@~9gpIkaKbvaEOStCQoy3kn5c5GS+C#KuLcv6_GT zR#)-RRHUm5aTtJ(DdiY13B_)66E7q5S-VZR_VhpCH{_j=u2;DCW#6Q>AiJnO*ezS@ zqbyIN<I%ND=brdqaQQSW~+{?@6vX;HHQvIjT;bc@sLU~?0kZ8tZER$!3z zUS9^S`oQAup}#QVG>IZ7k0~-f+$>GwTr^SRU^|({S1>ek4%0Ujo&8ff)~?Jx&36p! z!CprHne;$4+-rEEbj7;{-C9&p9+5#O3~fw7#E zAoXn^JO~Y)Gy`#1!WQ32sI-5L)ol%JWN#WR1!X8Ms7T|h9Y}87iqA{a-HmZV#-Rcn zrclHIFJQENvAFl*)`PKFR~yDRtfaqEQ2d$cu3y!OQ(Gulw~ZafbFQv7fel#`i*X`Q z-S9bUwD1B;B<1IN?Myui6e5k0^%VW;X^DM3Nzm^L&*bYSaR`O)S-pR>eK6=y9zwI| zsbg?la79;{2wA20f>jDtyQn%B;!in#MGbBk?*q+SX;Jlg`IL4XldnVTU!q9j)yFHC z>F7SxVxMSX&LtQGJ}gPGSMAc1dlQ<21~*N#`O;r)oKbN=?k1VUG>a;1TJS(3uHOZd zvYh>UMX<&TACYcecwTwf+O3+9aHD1=ha zYMSkOT4++(Di&WTUp`N`>T z+CvOBw->Rq7w~~`#jjiMUn-1U zQ9O-(OM&Drof&;gFpVM8XR=jLALe9^sZ!EPw6#{|Ng@3aI+=hu>F4dRH=Swn?uQQ)*#Xds?+)E#}qo?KZ|Z%UyPqwT*;!nh;R zA6_ZsNFEPSU^1;ha!edBEJVj#j+vBkr_{EnSF+}if?fsV21l3>jUnheW5DA^n5iPb zFjM-3P}Vh!_)|b}m#qp}qjju(+B@)ahn=)NpBzqjQ$~L|Y2~z<~yD^=041Vhc~~?&l8CDp5;*U-sn2czjwFFx$puAw5KAu zxw3GF>Ey^TCt{4%W|_Q640}zN4biw08Se%BL%J-j8s)EF#au_@^4ROB3FG3u+++kD z{=EV>Mfwk`P>A8{9K^H z;QXgQX8Ke(R3?-zOd0Jv;QBeJ{_;$KGX0;$<=}s#^Ve}XvE!f0;hO5Q%Fd;hW2)7c zf$9hH!?zGj>jr_%C_2jkTj?T*Ht%f++gF<@+Z$NbD!g#EW#JH;w;HKCF#lD>x4=;* zR6(X1Aj=^m#Byioq#@j;6!ztcq~GhXDmDD$IrX^}mo8nFjMXdL#FU0nkZA|aXsIS* zOI&{#L$6L!)!w^qYTXqZ1*Y1KUeIX!p-=1aXUb50N7WK*XH_>U6RBz>e`Ed=*$>>U zK(7d04ajwxFyTi?O&V2o;J4<>hPS-BZsuhIVG)nKr@x?kI)dxGZObsuADFUG&1&_1 z-6O!r5Fjt{^Q_WgUXIa=qQO1Io=-cTgj;_uGX&p;dvb$1Uh`AZ;T6)>Cs^HaXb$5F zr0UV=ZaBtXAoJ0v+nHunB?`A~tE7*+uzN*o{W8B#=lbf9(4&#&mndHo>e!-dO5uLs zmhu=H1JfjfpnF?)o=t9R{~PbNf!5RaY28Yrk?+kSThA;f??7B5ioB|!=?O(ps}Fyr z-VhnB$*UhIEbAkn;!bEHdmH^9Uod=lgR;^#(+%A=lLf=$)bu}Q+FNR5 zAR%yQcR~&U_E*zG@K}o=aF=mM+`*tMG4947CHo5j`(ub}KuVr+m)2A;s489BgmWKb zEh5EQ3~D2e)v)==VfCSRcDScGciw+|r+uEWEJ^t z96CGLs&>>x0a|;lxo3V?Q|q|iog|pjzRfe#X?sNn>#;0r;v)a!jj9F*L6>>~t)YI| zrO|wIe4vk`ELm{leH%?!gz|sxDkX>&zgp@zilWk>=6OX@@Kc4hmK+@qP#=K^6DwWe z#>YL^BijWc;t%MbHM+LCvrK6OMlWvdfV->oJZuM#zhsWhBRw>gYvk?Fv=_qhr%5q) z%>#a%By;PxgRj56_sz@0d+(yb;0i4U@bSfBa}bS&@V^%}pwf%mQ0RYTJaPKR1*Rzn z+Ot8-Ryq_{$?S>(C4ZNm>;%}WVMowz2oT5v+e7NYQPWCZT#L(Fio863!AK=Av152t zud7_2UpvFDOWxLFVHa83oGI4=_Lq=56Gf=|>m1I;Ej9RU0uwptsmju$SEeBE3B3x1 zVAGxsAny57bZ{G8^iY4j18w-N{Xw;tQ7gHEAxMlK$w}svoTRnJ%K)3x81io)WW7zOsgzT+- zP?NpE!l`e2_g8?T6U`j|s3az8T~M5ws4Li;ZeVZxA&WJGAVxhFuCJDpEYZ8Su~|PC zc!hbP%Ir|mr^*jifc(C3(R;cI89+*?^6c7$*GVsiH; z?0)?-XZy_?f{%aOW{tjnXYW{>8z*9)VTS);a>Fz^jA?mKhhrwRJt$DxY0GPX>9~z^ zHKcK|6CgnUJ9=1=<@Gjp8s6}@i}#_`YPDLeR;yKt+vLuG7R`VbodMB(f(r_#&Jcb1 zMjJVvjK1uo%9sb%44kjlgtPE$Y`VfKb(oH1v+DnK!ZCk2xF;TrrPPC4`*}q>s6us_ zMGp8^czg%JgHc_qKy~pjR2PgYgdKb^ro2S^aitP1S3FW4HooGOVLr+bXlg!}i~F4d zc5h-4ObWDo437Zf%5HQ+Cl9=GJscquRPz zHi)gfy;W}Wbyt5G7yORT1SZKfZ9k(Z(rT+$uqDR3FFe1==(m3i|FHCNBgfidYAUiY zMPQs)N3LxFwN}M#MNxK_b4;RKcg^&>y~tvCnq{*uE5E-ge@mKt52w#2$y!^@HJZ_= zN+y4J_|mgllW04@keYIrbLp!JJf=nYfnJYrH}m`S7T@;U4X$Ui+hX_CSCeV9qX* zrYyNAOKJ|x_XX9Il7V&%nwLJmVrcM~S9E`<)t9w>)HefHd*AluDv_i*AmOiWun^h? zRV-SAX~v>;CrZ){F|sM>V4ak2oQukkKt&;GM>se^m6?N=1rG3;>0!gI7}4Wqs3xHw z&9wVYBv{^XoRbnzhd#q#TZenNGM!1#%Ka_Dd&$@r> zGA~m~8Mw0rtz7Qr-}-rZeUM(ZULRy>edwekyR~2T5LH)3cU`oOUm7yQJz=bc&T@jn zUS)t+dIgyA^ROuZDcA!nMz`c2lRTbq(DuUh{r11|(LTo7if21(i6{v8&T*MRzbREM zRSvyt!3_Hi4Ux0LHeXaS9eMXjV`+cA@ysB7Xd19JjA88kC`-F8NP@dx38eSHd+Shwd>6q(BKzq5nWG|y~ zeyht{4kW&*T6x5WQ08*r{!s-Tu6V2PImK1)Zn;(3T?VsYJO!0V*aa&Lo-~Mu9W6>W zB%c42yBqX?3!FOoB(=T2YZiZvDOudhKhS3$o}~pCV)%h!ap8y}^FTK_JTiwT(_)^Nk4t}?Ca)0dLHqpH zYl;@eDS3mS$q1?tqP%WI4fAD|6f-KV#Rw9$@ACIKbcbHZPdf2-VtAWBBX+!>WjT(0 zJxy<4uL_FcxxZV3XD?fuyAMVjmmM^-!HZhRSuzon%ZL>CDu`Yr>q!|mt1H7z__>h{ za2vBoS58ZrMgCY$LlS>IfX$rUeek3{j0-j;>k{GKWul}z>9I!$hqc*Y}VB6!?; zb-e9e=cX>B!qh7xf5Y$Q+sRJ5cLrWryQ$%5MUn)%ESNMLqKAtC+vh)8AOyj`Ln2tJ$zs-4G_0E77WyAL&uvq?!CyS# zX^mVmX)4n%i06N^4D4VjelCK`1>flRywrb4Mk)?H0W)q2B>O4LzfW?R@v_j${V9DJ zP+lCP{VP}hF`hJ;w$7x@e$ABC)2v?D^+r>fysptpFGK+uJ_obL2pYsGHzN<0ILC0d zAhyK#H%Z3JSJN)>h6xA>=?xE}xgt)hlo>DSYI)fgUvGc->=rGIjA)x+n#)%o&H*^^ z@}9hIvm~QSe8R14t!W@=9Lju!vn%7#@`h$L`YAjGTx7XUHGi1yb8q8bsM0pO$7m@! z&2XGAWGiOprd}Kl0{TO}CHQ8|emskDtZ!q$yk7xDw+g6AS+hZsD}+~GabKy^T5b?D z{ZAI-z!2#;&Z1M5Yhh$#cF~Fo_@RB4pR42N6{!n3yRfLuRsTq|v zV9i}fE`La?0*ZrQ>WeRA{gLNmSkp>tudasW%Zz_PI+G_vP}mmKW)umUOd?98;2$r$ z!*y7S=c>8U*ct`W%84mU9w6;o^>}a7?r1e>p&tmZ$*OQjMUt;zaj ztJV9@T=S1&+L$aBMk1ZFkk`&T3Z!8lnJ0H;0csuC@VwSiC48@8kJ%TqIu2-&=# z7oaezgz5$Q!d^a~k_vZ}7DX-ELO){kTXT zvE#6m!WdS-Z+i%&)Gd0F*9%{G{!ZH5Bf=I+PL4Ffu}P44*T5kYxwp%`N2a(+lvmBJ zoE%nuyHVU_F{i7Do5cW{f##| zN+;g(THM&LoG>}!&}@tdrxS1GSQlgzm@y#XW0~0V8H<2&_*G*_1Rf)9#6jy$})e!C$PcU z3f=UhbTpbIO*yCF0xDJZK78ekxA$RVl4ZBWR&W;vJ8uR9<8Ej$F#HgjG0~7sD3Sqn z#q6pqq`2w-HfM*zSrm%wiPKO1niYx@E)0nPN{&EeSE? zDQfWv?qtc(!r~XO{ha-W1igRm(fN%yec??R2Z6|J#a9Eaar=S7sYpRmV>Vx`jES-26XC;>#jz(MvjVzN<#5TXP3#xMQ{^9BQhvl~Wcq;X=vO+kR#+Td@?O+uJ zQB`PkF~{?GAqjmL9`3NrP3&WVHH{3FKI8dL!#sA|l$obN^=L$%O3lhW#uBvTiF>0O zgu>F*2}DU<-Q<7(JFkCj^Bit!=WOr8gZQ()7D^+-_ho!NWvVGe9e5!6Vcpm35{MUX@Z<^i~iq_>&B)_#Qe} zNYOR~jFPa?T(NZAD$L0j^;MKIb%=1P>YI`da1&6xF-K1m6axw`r1B6gWBOIGjXCR_ zn8-@Agv7T=;RJuxi+L3`&Pd)lDK;H_e025YoUfgB)jZZr5zHi5Iu;)HAhFKN5Bj|6sUZ3Mu2fqaoq^k^qX+!h{v9L||mEC_T$*@f;;ED%s+%k_+y{_V_9} zvpTqI;ghtSI|#FB>NHH7O|W|-vv+3n)oe~~L_Q{W8JvGjDXSTIb7xKU)e)p@FhssF z5LBN+Hf7CJk|3Wb)5t6ro>L5WY{HHGOeh zZ2`OLNS1%DHj?6BWwh1f995tCwd0+T>1H{2ODhP4G=&Q@MwWugY^Z z*?VgvZs!>QO#ElhfYJFeG!ASir*pi^u%r_#WxwbmLE7fS5WtT68<#n+NVqaZYPs^n z6&MXipAtR*a2O?IoJ^(#Fg~m-;MI|WjgAy7;7NZ{qRxg#L6Oc9zs=Jc(9S@>b3#0a zbt|tu(;>DJm?QHWQ?7rN4T7f=G+&e!q@aJ4jnZ*ix)>zWJVg+M$Wm;@$TkC&iGTqt z*^a3W6Yn?EVTmRa9j1e&8IsTA946h__qeQb!RLlxNyPiO0VLph7>}^do7*8Q{$Mx- zmluD^*nx!C-VE*}dAdw}eLJ{=e?tWJL6(gGQVrPabztuRtnE6i*PzrJ6<8kv9bH&E zZ`NSJ_s-ijSk&U16<7y9UnP?XaGZrz$LnZDA;}oa*~2Qv|G>(f$D@CgR3Y9lu-$%~qPJ83;}2hX6KD>9y}ol& z{yn6>UwiZDUBP4$s z46b{7dnY_|_i03vLUQPP#Jq4ihmOZn#0l(CGf;5&_AbQ%=j!on7GHhO6rq%h)6XtI zh+PQW;0Yx!O|GY(0k~J*3O=4+ZiV_O#mls#!&hE=i!G^=G^Cb-53)SnV(mm^k~ZMd zyt^e;^{FOk&#AT4(}x3goZC zQOE+xB=Tan!uWS~o$&_7XN4nXn~5zlo{AVD|HlGq)5_zQ8BuUJEf29^SqU5Gwgzk< zQw6Oh6WAIeH_T*-<$(5)dP`!5jqL^#R+?;TI(#2#$TuTtxsiuF?bl{ZZ zb<}HSFy+5U;@fO$N^=r9YK$N)9rJ$XCrV}!%_e~cKu*(|jFx9+0s)0Hh#k+)ss^Oj zKvGX&)~kCIoZ6N0_mg-&C5_|>?PTjM4`^yS_&{M=QhKmDc`|8X@#POcIC|wBZ*5+l z?#(^vu~Chdm;^)^Ti&ZnUrc|Mbvt#D;Hqyo0zrQ#gna;=^l*wC+M#^8qQwiTh*fd< z;TceYIU{}QD7|SIBXmAxeXBn(gU^+kpp?Oz>A5*^UDez{Qx($4D|OfvfiZ{_1103Z z4~A)6PgN({ri!TOHda|)d(9gv7NrK-_>2PY5iC{o0fmU_0z_+gXj*@zv`k}96)hFV zPx1UyF0HJ!&{%9%+jAN)GvNI;9gDQyaB%m0RA5WCXP2OweqY;bq3|KxEKqx6nb9|6 zNK=xdTj`V}%L`|xMLDrTm`+)Sj&+=4ys0sPPcnPub_6}ba5I5_<3<4gUMlgu;Et?Atxs8dU=N=$b;GgBu9~EL&+y{Hm84$Q%0};Ny zy&Z1tr*Oaw^C5f81b(N@tBSxC^Gy6 z_H7qu=fm@Z(8&jvp=tqmgW}-e(`5rrx4uqCOhU)NixbCmARQqM%A|W%j<76(J%L<1 zzGdE>fjq)}_fCJ!TDM|u$qpW3SA{{_vafwR(8Hvaw9uz{+LI6Iqh)oN@k|hV=pH_E z=R;4uPqC6s+G9tC9em(q2I@2IC`D(nMWF$;j0*!wOLx!7FP&eJa-JQxFxW6B5+U4! z``Y9Pf$PFmBNa7}dVthn;Ixc6gsGDQ%Ga!(AYsnI=H`D0>rK}^X)(QDSag>aokWFSQg{W0Pfk2o zOmv#D%@cOzeEs96>(n<}d9t=Uf5$)dC<5+=ig(?x8WINu-ovM4hGmH z!iJAuA02<3?H!+<-&Jh=Pip_j3(Zbxc7`huHaP|12*+1!fYGKAk8D~+01dZn*Aa9X zrGxmYT8{=v-W7)P`WwC|$>t-_@UuxG=PPJM%A`yY^!XdkcjiHAnqJ=fod!>Lw%Ki2 z`d5R(hT$LMd;yzoz-c7(y(;gT+BXmg0-dcCGeLh#K%w!O@%}J@Kw8=DEGf;`aP{E? z@63p)^*X)f4CGbBlx(Hqgn$+>&=d27y}FYTHWUVzbFyeJh*r0JCPi9dmSYA$dUnlT zRoTrY2hk{%dpx1hfb zivfQ@AWpsj7{Ej&EyepWh<}XJ2^rIchPz8lK7|9eXKXW!qKF%Q#s0(WL|rJ^XsVTD z_Eta!aEkr-aqpunoxbuJpYT4-kh#$v>Stgi9I)Q*zmP;toFD9Dc&s7Tm4PjKHIvSJoufl?-b3%X8 zLBxQc)XnAj(2Pa6MHks8=fd$+ERD<@Dg4J4$h3MA{?7L|xKVwUfHMu$;7AY2h^va6 zDUYNed0vPhej}3OqiGW7m(rN}^F#rtVhKx_K~!f3?h*#7Lh5sv3C7%rq8dJh8Oa)1 zvMGaVL!BC2J;@v0VZfXf+l>d^!Q<( zAc`hvFWY%pUw0dZxAbsD5S@a%Mm!|x{n`6O%1Z@O4CvLLe)fXqW)N2NV1U5 zDj-CZSD(U4o<&qb9=it70 z9sl(G(x>8qs4*#6Syd$+ij!7}Fwq(*2uvn(@QpPGyXZ$kWzjV;qZL72Q*N~nEb+P9 ztZjgXSz*271DDML7GlXvJRBzMdI5n=;%9tOp$`@5?wu=h__C(%j;w!FA)N#QJtWQg zA1}&KhK^CKK&GS7RdsVJ<<>sFO;*;;pbXW7i7%?WZ>b`KH$cpj`yeJnF&af(zm+KH zxKwy_GcLjF4a;e!by)+Z^z}4F&eE}W+L!yha_f-C1UcslI45>T=PBjSVM<`5V1x1X zO*T+dmK+L*n_v*5 zA3KNE5l2B;UDbc^6M;9?T?xOkxq4hHu`9lZB~;E5uuO2MLiV^vc=Pz=4wWfN+@sa> z(cUMA;DK`&iX;M2$BwFaqdyrFp}@lC5F(XO&T%(VsF@2ek)c4wqA4j>j;e2w8bpFV z+LCZ=apA((+RL@@Ix9-UiY%{6v?|R|qh@= zHl39F!6x{$epTVqW~~qnXStWWua!>{kQ#Z{R>~f%ZUl92xMWx=bq;vZC=@(zI|{QD zI#9{z(unIQEkMM{Lg1;6rWAkm7^<_;q`5Zl*ShqGcaGX8FIXM!PH^2Z7x{QO2e*b~ z;pquJ<$!;j&YE|d7Fo5VGG$%S_*}i4Cf!P22ldWrm__0|Pw0+o!WiVD944w98nN6A zzf^qMwc+YKq-AO&{DQ(1W(;c}o<@1$ELW;Kf7_PCszvh}A`;gwZu*CHBHmA~kmW^m z6EIf$MS#aeDS!%I#-%1jLkmDQ^DHO9zN}LwvRr@X)DjUsN8^TA`Ug+Sa=U0NmJ2#P za+rkQ7$Y?(h4nH`qWzKMNH*3D2~6N;&*a=d{YA@`(y1{qB%^eecQ9Dkc_#KVM@SQnU_T{xQ=tZVb(4JmF=N16P5A4RuglyZMZe=;YrON$^@v7!k_K~ZN4C^D8Q*&`J*l$Ri} zk=vrt$o*teaXnBVppmG~-iiX(Zi{bk~`HQl*1eFxg{WRxs`yBqta&aLpiBNoh zf@{CH_S{)X7$Kcqaj1f(X{Pf4G~~!gNE^tcC&N>?1c_j^0nKQTZ@~#(%0Pb~N|Pyq zg|p?$6cO7d7ZH|k5U^a}C@EO~ahC>NShJjWs8bjyUcb#%5~}0`0co*9uzaMSX61Bd zzd~KLk|0P%(Yk;zNNw7{be9~~UaV&9ukpU@%7?Ts$5UysW(Y-f<4(ejcf{uOm>zMe z1569?X&8kPojHaWVhT@Q;>LeA?L|2=F#qei|LeN{L|s?JSzG*d3Wv41qz~M6x;qI2 zA`{8HG~W&hzWF8_iZtS~#@m6{|nHSdzQ|X<-^2q{TLjYJl zcE)1^pqbO_y#FA;hDp2}WQK`~>8=DSR<rW(Y)ZX9_M?`y5g?;C;s5QOVBl+Om*O%uWVsVhcH`B3VI*5Uo+bWQhea~-Wa9wwuIHES2H`zG0vXs=7H0bOy zx32}2rgkyc5^H}f(5nPGOgx{K&=*5b0NQyqv8Jr9M>S$pZdTKQQ(F5*N5%5;UJtTyVUJgx+NwUwlNxpk1Ye3RzsZEjdO`B>B z$&7+e#9MzR(KE_PHfy+2fLAS8!LU~+f~zFQIN5qgV7)harr<^|&Pyfa@ngLa^7wJ9 znOe2ut3}bASxEb^Qx{izd&0_bbV-P~?ilSEU)fNaH}CFA;y^Y&uFiT`@B=EUin`k) zWf-MZr9!Z>Y&+Gxr!{(E9VYinH775k$Qz&C4yS)3rj3KAzo_iYw3XF$zJ7Fn{>wYx z+TLI69UmPHKi&6I!E=v@6ipe=a23Tv(XuXT_;Ah8u#5K7uc(Q&UPxexUbq$5no;ey%^;%ElMU`&ko-u8Fcp@srN?g># zC(E4?h=M-MObzr7$%|w*@Zi0?6A=RbvE1!2(vk*_5y1xW^%!>B#imICoXHh5fXMEc zjpq$GS@3f0Q@S_nApsvi6nZy+_pNj`L4AMVQwj!2njS%eZjv{q#EFJJ(PA|FDGOc# z!oWH_l@NYqWrjAU;{et?g^NNiMTA*q(eU-tF?SH?d59vAv5{_@V-C(@{g75AIyM=3 zRv4Tr$NR_daFGn0@QTtW!kCB{#pW3s?6VU45ndW8-vQ`Jpjh5LO=8F=&qlZ`($jzY zRnC&;*NKEEf=^f<$bqpfuPlBSv|bW@YmMM)7Z^9c?c%o-LtWQD?yEtAlPGejrGrdL}MOlbNj zdE9yAkWP|3Xld?JW2z!ltE``n)X*#$3QREbN)iSu)u=TUDcnE&Ra(@Bc2WPUQ2(n? z4JuSNMYGcXn$#Ma6q}9y*QEZ_n$&6XotVt7H>gxq!Tzsbwb8F+KDO1fq5; z-qoVe-&z0qRb4uRCv|Ns;LKxK-NZ4%kDQj5*)5~%6wrBG{?Zb6?bW&V${gN0t44;f zR&7>#Fkchb(bcM9D*o5j{@2$2>)M*5JUK^rf2G>wSx^{9yMVa)taMZpwT83j0BAL$+MKbgIP8_{R76iVGkWTdiKr0PpgA3jtzq+ua zMjcnjiDiw$_~OqxiWi1!mddMTa0!kRr`6heQ~0|qQzXtPGGwLYQ8~@ZhKW<({arP-(5#WFRE^J^KU3OsIF32*f zT|l_nffZfY$U6GKQ6Ln|C@|c%qi{@tVb|?KMzy66Yj%NA2&-LSxYCCeU3eeti|aGe zCDfJLTDL@;VLJoDBPeY+w4eF{g##DV_ni?9R|6Ib^ zw88(=b@m-*I>06H7kgogrd04W;~|wDUch!h_W~^_z%L?nq5)S~hYDPCV{{Nih!O%F zXhEjGu7rT_BHhRU71kmG)Y}{hG$;x~rtbTnpLnq=RrrYtc%h;_U6xfkQ%2vz*a&SD zkw$;&sNNQ26#5!%!;2StUG~x)<-G)<#>msvSkn)Y`glvc%>{urlD~wtru1LikX$xv z_=;2weH4U)au$-?0HA|WnTq=@%Bv>D`KOtn=9v^e1eX;%@0Hv~RYFf2)k$)`a*|Z~ z(jQ1WFiWaU>6D<^(27JS{OHO)zq!(pOs0QwXDM>;TQQp=n?;dGN55$)=KTe?XpmsE z)}bf8H3NdaD=DeoI;&LuahpvMP7q?6!IwOercJFw9|T-PKDXZ=+JK$EheL$l-oOB{zhF|BN5xwD~ETAhE8 zI@RpvMiRLQ$80;zGTz~M;dEKM8fdZ7cT{F{$Mo_DJDIF*qp!+>qlSXb}7)|Qy@S2 zOKLhb522l2myo3nLiiI4FvnRqCMAFRIe4P*qMvQ%!estpGvNRr8DZG9I3t zSRJ712$qC-4G3e&e4Yt$?p7x3GDON}eH%Ca*yjs6<4m@_r?=B}soO7(j^{ z%U~sfzL(}#lVr%msdTM2@wP38YIJ!Wsc=cqJ1)Ayz<@{;!rc(jmpWdg{yO%elLOa2bTKs+`~jCIJ-eBj;x1L;9h#&drH+SgUf#npdG z+z+bY{!mrhJ@SRJ=G$5UO_s<0*Gvm*T=tjSm0z8Xm|x$v)?M}Pq)jSrc%wYI$$m^^ z1?=C8ECcfu(HD!#?bt&muwGy42l%l+&q)pHGVGo=8P?*4&PyMRy)_Phm`u_uaE?xl zjo1`AfwvY&i4=~g>ym%vBXW~ur1!_})1fIOZ3uq^gAgltp^kW$%Wr4dKMeUPNzE(+ zU^9)Su3c7pIK6%HXLfjJ8+-ib_Mgz@>8OobfUrm_kQ113mXktYS|O!i>5bO2DA>h7 zIn33FnpC1C?bp(K%6{rx?w}1Xr}YKfag3TOz<-R=={V~LTV;Qtt)?mNS{DH8nFR>u zBL3>tLHDX80y1mB{VMSWX4-ZkD;I60lpFaXiDm=i5PY?_rM!B!U%HPR&XSwM{RXkh zzAh|S`?ca5lB~4yA2f{gUnF+xXL2nb+i1NhsTV!FpDo41&|cq=QGm)$aD8NS&2Jbo z22=%y(oHTkb9#RTz%HC(9>iDIq@RjJQwDPlhs(;CA{B(K`X)EzrUfU~e@qD+jR{cD zIjsn|>er9(FTOwRNNi?Z1Y?_(_EgJ}pCv+^GQdBOBJEmJeP{=kPZ+{dIQ2lcf|otu zy^lLX{AN>-e^vXPy(8^yr3QWmiT|*KD}}Hm=|QOgQRsi;QE?Q}0^-)T*|wo+w#p_z zipoDj{3QMYbL?bx*6YMcQ|_my_p-L<@OW&G$7B2YG!yv?KjjIAek%br-2PXbr4DF}bL>%q{?VcnQJ(HgZBR#2knND>b(hS`W;rdJ{KG9ER?2?T`|u3g2L zJFY8pe93WG=to=(YOwn8>~EKujnMlXx@QKh38RvYsgj5)c9RKaa*@T2h5GbKdeP5| z_mY3o8Lq%5!bozi+6m5Td%e5NCW_Z z34XHB?lvHI1qHGq5=fh>23kpU%B;$aSulTTDs+;UZiU0%w~FYoq&OQ;?|cS1CCS+M zEyGdN5Qs)gf$!9gQsQ*xdK6!P8p998#mpc{t%_2#rF?kQI#ww&QK4VW>v|Ar5#mUy zRL$!K2#BkVwCbe$8KhRQ9?;W>P0WLEua}Vp_a<9mn$%lN zbz8^QmpQ?bZtFZYt@Bt~=kcP};X!|>(E-RU7AJP!M^?R45CW+S4|92kpkKY3h;U8VZuEavF)dzeJtGf9l+ev!SRIzhDCzYld1XSu zAsz)0mx#VAw}L%Rv&ZS_2!h~cr-bdx(*(W~ZWc(h=&XJsRx62@5tC6Nj@2=;>jp2uV%@A{f#%3Aut(( z_w+{ES4;^~nU{H{Qlo*ig;S>{^_EksriASiq9Q0*=@!Ry2;fKR33>lo6et<178SYU z(N<-X+ZTox70yb9iPZr-rg0)@waFHy5Br&V&34q~j= zr_kqT_D!1g45>rojd`4vm;WJ`9_@WXp1$MB>FgzY?F9?(iz)Ywg}2K%q)ZnwbvD~h zxo?+BO9(EFA+iWIeE2m+moyCv)ffCQztH>sRmALA<)*E)lktKcfN_t#;sy+cyym=O z{9UOq@QdzPW?6ZEF=UkS3Kf+SBTz2wR$j||BX50T&Jo?rGi(L?^L%_dLCOfltCJsA6;i%g*1t7&P`Sr%@9QCLhw2%S2UL5(dqXfg6Itc5@(dE zFgl1DC>1)Xy2(U?*(B`s^G83yc+uQ&vf_U4yXbX)2)yAx)J3eAJfe~vJB&5jd$&LA zRT&I{XVr3&tEy%GHE8FPILt-OS}vIVW5GV_)0HkuL4A- zZGSvn1ouYWDvr@eL%3REQF=+JOW^+|e!wP~ zpBD*#<$GobKdANL)v`lQJtZN&J&P^!0Z%RPbSdCl1I(Vn3aB^^i|s=rX-C`r^KNU- zz^V5K*izN@)hR^9`Z{>j~9;vOHo4=|X;J*=6RtcAYCwGCst4WASD&v4w8%Gr{xhL>Mn-9ze81eOd|5lbEpd+ARc&-qMk#YDcntPF0NiAfWG zI&7VJXug`!{03XhpbQ3lBeY~8l%}C$#3BFs`?qNb$7}2K+&bm79$YEltePx85AGsH zGC@NeV#igKCrhUmXNSU}v0xEOYtWGLu=AE)WTPpsrUDpyY+!)FWvGBH8%zbumMH{D zm!>w)lo5FZRhJsaUMcZO|0eo!e0Ai1G8=Srknmw=#Cvns_;h#$cD~#T?IShpg{zKO zp`i_AjqJ79=nrA1-`iHdr@bC#vxnR5L2Xkt}?uRim*K}6)>iVI&SRgA`*UNRh#S&eMAc0fBH%SKf;x1rwP4V1g`vbv$1FAbK zxx&5}0|xDm)fN3Yq7zNWK&lwfJOv{zh+QgVB&|nsS38OXDn(we6*;NJ*FzYybn>!A z!h6yRcK6?BpALCiySgr;u)aMzDIB(QS6|qw=2E+OwJ@uyu*%sTc@`$3+J!9ok&}C_ z@ZHT2x8wYR<}_LE?%io7Mv{?#EwM9qQ1?D%e+W)Am{=lu`E$?LTl2jOSc*5HOF!Fa zH5&eXL*_~)yEK?f*cAgg5MSHNPwimI2@ zAzEVDZxH$x{ucQXDBcJ!D^37QQ`^=i`#PC>Qj%G4&S)x#Jve)y2WEADsjm2VRsOKs z20}k@2~q->2CNv|)xt{C6ueMm&f%&6*>FuDJ;=_*(qQGbyq(X!6Je9<3@1(zejv5P z+TC*FhYd)OGPD0YQLHb|-a^di$Tvh|jFbM5Pk(%Pczk^L!K0H;_76XL^a+H9Cpo`Y zNMvESe*^!g-*8?3TR&5OO$X`82r#6hXDs*~!?z-Mf(S_GQ2y;CPoH^v|M<}zpja?8ju(%jJj)ojl89VdP`NTF9I{=^~Rs z0^DDwc?+$R27j?nG#j4xFD9duJ7IyL=vDkk5#{^)men6RnU^sI<{jC8f-5dRp>!PkUWi_PGkW2O zG^P1&r@g@mb}WFaFonY?8Kt1o(1=)J*%uKd+hfi}J}C%$S2ZN;H(TrRr`5i;_@526>@@8#Tr~+$u=?$7T3FUP-l2HjSh!rBYdPE zk??OG*ZruXa{;Dt7UYl?M?icu4pOCYkgkOW64=M#!KcfZ7pN;#c4Y-2=;gJd`D2oA z%+ZbaaP)Qc0w+aZ!H-7Ush zT3C2PV2kN-*Jwq(3GpfYKPLN`4ZHp|nn>v@P=^5y1*E^`AS0Xwo&ew!q8KJ)uq${> z8TIpjD==c%#si$@Ft2M&z-WZ3Yf1s@=UKIyXxH;W&t4pvM%Zri8E9$&uCX27gs37L zXNDjm=U4P#28WR^8DI&)Yn!~&ejsv;*roSS)$7#PulrE->sITh3$D1c;VjUyAsK0; zY5d@PVNkss`iDxtgKxG1YoPo;R%uXVwI17lbQfDOEW+;!>bl?nIeCii73A`{^u`JH zH5O^|6CC}$Hj*?(IV9kFj)O@u4(sW$uvsC_o%#%nVPpY29W5~c5EgSIT7zgKXG0cB z66IG2Hb{R+2XgS1U8aqXX$Wbw@QaaOXMivp+4WL>nbAHrh%is%Qj>R`Chr4y9~O6i zx5+&ky}-Zkkv%bbn$jYu*FQf`M^K}|6fcaxB{IukLepM$?&pZ9)GNXv0ErELG=!M} z)Z!SOtfy0u_IUy~JV@`sVR*JKXON;jk3Pb_bM)@J@q9vJh@NC%Q+WtER^BMRkua{3 zsRabde8O~YE`cl?(X60>Tm@F&!{Ca4qL>-JcO{b=rn)f8SJ<)^Fu}0P0AF0O}x zo(VtXWc~sM*))nL{B zBpbYb{P>DHWruqRBXJQLKPL6qOBjXfouGL-#!z$cNmM4}jkr-$t1_?ghmekJxe*pB z-A09AgWgW!>qQXunG$4w1wCeqDKnRZ6l$~_&Ndv3M?>Eu=N6}WJq4}hNZwnsX+Kk? z%*K?l#-gI#?`k-M>?K({KVLI%w4ue!IqXSio7)spD5xon`507n_TC9{izT?yhOB82 zFMsU!3uTc@ubE3~8b6zXYF+X=uZh2fYE1=0b-V1^UNeIW1SrOTdJvng3w=$@&JaV+ z%N;+r2kA=O9;6S(ZO1cgkX=51{H7vdqc<15-+)0l!pBH1zHqSMV(Sk=iS3$r75 z*Ju8Sz-7XQgrcl}>{$f1lk6ZV3B?s&`=UG{Ti8YwMnjuwwk@@ORy|s;*bBcypiGO> z>yj#>3o$Tk@ldfA#n&d-0$)%M@JFUAf3T1?j(Ljp3F{CA)OI^a5V8>?xGj=!F=(X# zV{sAr-5mBh?J)j2?X@%5X@_wbD8bJ9Mc4_GVK-2Q-Sx|Vu(G5?w|9L`c) zB;iSfaP|z8vTC1PmmNah{_78mohiNC8$3n50pNG`C<@Q2CypS|XM->?hrug5Kj#~T zIR?(`e8hl%NJ0WMP&1J`lO;gFhII}GX0Op+3u~Qx-sg}-f$d%4a*w$LEpnyPUPxHO z*&xf)a$JMuizA_YBW>@>N&(}?-k)mCKD8{uz**Jp{tePkHDb+kRqIh%& z)JjQI{jA3CVJ}J_{lKrEeFg*baeRz>(FT+F#sQVO%vpMHh1mcY<#*T#h+31HT6#PW z<>thHg2fx-P=I^OdVIlLRM;pUapcoL_U$D-)TX{^cAOV;1%2?uAw@No-l?Lz7s;PZ zEMeY%)N?*dvKY*uPA&MQ5`Cgzw8CMLS@)(Tmw1Mos~|1K-5R-vRbr?~LZx#2UCt6T z$SD6TD@>gyxs+Y&F?4bbux7droy`(z*9W41S#~Y$X6yRU%eiM6rC9tc0y&YP8!Ue5 zxO+u4`LhuO3fQOcsGOKeR9tYi096am*Wf>G{MWv^Mlhv$I6ABi?EqEKt+?ZR25p2+ zjHg*PNRy%63LxPjI@TdOk+=x`vxyUq(zJxkEa7DNRo{H`gklPMx7j{?bbP%3nCGZ} z@>a@6vfG6^1Y2Eur0h*&*!rMR=zehS%zkBf`OgiTSynI1sIpeQFqoT`kkJb#%RlCs zZ_x{<;9|X~NZ&@ktg0?^kv@nPts3UEs*22rUq-ni-aO^vXMsRV9+e`U3xZ$YLTS2 z7RaaD0CBXYUNhsj=~lt%J#O|q`_Py1l8cJFm=EA}G@P`Pc?n`M^}hHKhWA&0qpG;T z@L=S#&7$%5>72(85q24>%Q9HANxuI1yo9%Dh!{mP8Qvv^ewkUElf&k4F1wbQn^FC_ z^Rc<-yP5uVWVN)>1IY@s^NR)qfct3xAb99@=aA&JHa)Mt zA7W`&gTHBsx@zDpu)t^Fq`E49A=#nJzoJzcXw_AqLGmz*!BykQmsOXtA7=f^qG+3j zlA|HD*$do7CQWt21qjm&Dk^ecO)m_J2iA%uBmP&^3v|Cd$Re+dxam@}+Tks*z*}fj zT^-Tv;1ys|IJA*LP;0=lNLBbIj9jn6pfwcVuDx3GBNq=ac_`YZkZ_uR+NRe#di5hX z*xoh(7UkPC9(}a`_6Ls+q9z*IvKh$s9?1LqtUt^lAs=MpjTIVN=^Pv$6QNbxnIw-u zkq9`SbL7Ep?6XimmZf$sf;D@4wn!|20J3@K@uAZ~yXaHSZ_bQmW(T&&4;mTw5g1zb3$ikAm#P%TCiNEj!h00lQQb_lA4?Nf>|w zs96s1=V@}24Glzpk%X@E9;Efp`8v5DDVf8YJZK!^n*0Qyo1SvvLr z7wV)-q*i!*bU=k?p!Oh(3p6)u)hLnsU_B=3d0uiVcKjJbDt+WK3N_f&gZ+^#L+FWtJp=NY9B^=?{Antm4OJ!yQ$2 zoL;NA&O3!R+sMr$ITwXr^o(ZF{y2myg?mw|&sXcc@#WE1OGWN=pmMh$MGiifH|%q- zRwC}>9k#UFUCP-TGRW_Jx8Lj0e5i4;2C`DLn7zD(TM^C$TgM{(24lBB!#*&Mw|S_mkEa)ES(7~LZ+sPrCb(IdC~ z)Rv!rE-HU3<;}Iz_18^Px)En}N@(FVP0ww?J<)V6G*_(75u#Xv8oL%+Gder+I7lx>XVS|1fsIuPW4M>II zaOl+bFGZ<6%-_dsAZ)X=0PNyNse94QmtuZuc(TVd6_eBr&VR`pNaBR;&)O8EOcZOp}Xs72$kF&EpRqLy}nsxL+AbC8(m%D6t& zLRs$I6#LM>E76)%rD6N;k~1t9X>PQI#x5YRx!1fH@94qi!0)JP22iB zt&C|LdrxAI%IQ|hg*`4q<_b;*AhOWGP+pTZ_}Kun%3jtHvA`LDJM8eugp6N*!Y77{ z8o$Kqo{SQNeMFt-60;K3hA$k|*l5-dp=ClN=mPu_);F=7f1<`QVOG`p^pu} zgncth%b7*$w5T3d%PNERLo00`oo_BN1oCjUa(|iclr#OeV5XO)IdPdH2Y_#Sjqd*F z08I`Kpyp@0AF?x<_d4K>uZ4YoN_xlgy{Q5qJ~}au{t^AcdPR?%d#Ulk_sfs4q4-d`IgL(Xc*HV=Ug>i>6yBi(qmvB5>{=jpDDmq+Oeep87a_)EmmW$F z3c(52K6vv;d@Ve2Kgx3Gv$$~SlRJo!gFb`peCC`!k6=Zmp50`q?nh*%iah} zMNoJnREHrc+{E^7owLn(mRdVbMqEs-vx=NkwrsE6jM5vtMZQI+`w;jVth10ofS-%b zM!trG0-}9k@fi#Hu!juz8tjUyW?i#zfuIkp20fm-fA|ST2Yr0>!QnfP_&)mL8L|4u zQ}_ELjF$U28}!eA(q|0xclh(c-%l+)p&HJPoVC`wx#U_992Der8@_ag-;n9kQ$3)D zNI*nVlsHBOn+$rm{HJGF@d_^5%(pKI9nk*&7#;$O&J%no8K@`2XsZoRg}-tcJLRs@ zm+@Y&Y)CLaCevKY?9=P29rAYijL9ih%u71)u^sOC}KVi4Tt^H}HWsdPz&Cz1jPu{k;5O z@ZmYVhw&rClB#0N4$Pm;Xtb! zKUb6=Cey3z=6&cK`BgGaG#zKHWH6kjpJlzNCTF*Qy-cxvlnh|qUHZ;`$Z+A^pO#1- zr$cy~>-}tSb=lX%3;_3g;GHTZT_nT7Bx^$53&8 zmfZFe{-(6eMP2NpN1yE0TeD188kk!LxUg(MWp|-u;-KU1~2HW#Iq) z09crRDZ(?)JQLBIF#XdBg`LA2e3LOS`gStH5NXUjOK--}^U+C~ z0}$_Gpgu;8MF;dQ4uIm_85fXzUBH_+Ym7#rxuADq$qO{DgcrR+1E1pm@xMZYL|oLh zZ_&8LXdS6^*hhULTs9Rr`5F2__@S?ic33fpubzp3HDd^_9K-}fej~qexXjR zFVbjJ22By$iTV@+H7zuhAV$!P`1rV;@|6vh$i684xuiuTlh_nLalzqpNny0~ELT-$29L1h$&-}BgBfyv z_25}>b=yhF_)GBfzKv#AGQuFQFONQY^c_g=i^oSFmBiPOB8}Dzl7iQA$pHKR_&U2v z5nuE8!=v{fy>s-z(I@feU;?IaiRAz$q~?Y?dKvnY$q+0@;M{yG`-YfgYc;ABDe}Lv z$iJCWFD^q1&v`6)tM^ITGnI1|IW)$9l9I_m1xX_HlGJh=JpSb9(~l{f|LrNCr)Ws2 zXx0vTDW_@SSW3=oSgd<3($hi6azAG^oP401dy5yN*fZN%x7k4YaDF}qeM5h&FPc1!P zKC^(C$bLk`R(5Wa)rgG2xMX|tMh{>2bDICjaf7RLVVU2-Hk0i-ro}==O~a#J%50Ox znM66*I#n=od6KZL=Sek3tsL8bit3j2L;P&1-MP*r(VmcIohOxw<~BF(G0g&?hKIP- z%0_PDSH*|kMqjxGS-H^Q$oWIm;gE*7+6liUD3%_?d;^*0D$Aa`nys(XAM2-6%10U0 zhR1KLMdf^rZf#G^T)`nHhrPH3rrWHdMC1EQK4Eb&he(+Pp0HgQ^)c#DY=1B%tqCkrEjekgjAiq9nbVULE7 z*^8`zL(nHac&7c%jR&-JTV+&0%} z9X1rv!ktc`EdXL&&f!3c*gon?-NC6GyF5FEF@$;3u)T0}f~{}bf6Jxv>>rd(jHjbx z^j`Gv!p&?%o;|U?II6BEx6Sr*G0>il0O@EJB=&=}uMB5SWMnsPpHn|-v{V}~L{SAt zkWPJR1ch$ASu56m;3a{B_NAz!2t#(v`H$`L#jdA5&){s_GW(ZF4&qFQ6@jXYs1@}l z{EmvY5^Qk|IGitz>E2bG1H=qt7olFwu}C%t9I@^%2Mu;{0rn4Hxe@2E51pr@cL&Ku zlU#o9e6s)U$#;!7wr8i2t@g&U4O3m+-K%Na3LP-XX#=l+qwln$T>1`98Efqp`(tp_ zVq-iVk?t=e9u+VRbIXFObh(!V%a$b@PAE(f0@ws42oH-`9JjnWzpL@Ox`Z z(pTJ1sabq~Bei-O0UIk)v|%<<1Td=XCu@2XSueHZ@E`CWzVY){jcMbXH@aKh?&em! zyZvfstGoMZ>#N33koxk@PG={kG|1`hwC-9Z=xzzR)81)I!Cisg-rn7gF$puaEbwLt zcyqVC6LYCef!%yfp5Ywz18V%Ra<&%b8E{BZrggRy|e3pcVF`~H8=L++V8dvc?GW%eq~$XXPYC9 zVlvEs>IUBgr5r`dQ6DRG+MUj;+dHq$bZypkwzoGso07ck>$K3dJG&iG{;ooUK-!{% zuQ|O|q1)|R+MVu9n|6HN7ASW&+X}SvT4zgJ#_g>F^lG<`B=EB1bW)WOsKrdZ%Q9*! zpX=>sz|YoJS4F5a+pjs2t!Y*?0o5sk?QS_$t!vZPM*6!BU_QF9L z1_Dq@6`exwY`&(+c96EvWuRBVG|`S^$7Tfr)1+O)@M|5JeVut>y9B-2eN{(`GIZBR zd&dat)!OR95acnXSi(9$7zr!M^$ziWK(o`{s%_OBm7U?(X;+X(UAschb%uBYW^EX0 zS2H#Y=mOb~PPd@&LN1eYESU2tijibe$JFt1&bdKOyMa zhMs!0hQcf)_eAQPX$zhIRZA$)Os9T3r)9+a3W=MBn>e<_dzN5@fX}#p6JzT;Zz9%G z#DC%EzXql}+D-R$^v`bGGH_M8z*zr;fC~nu346jpVt~_z zlXEa^3oz|2va+WF~HM|rzEF;R2ItSW{0J0i}Gnh z7X0RE#j$BfP8!#~Y+(t`KF;77cLUu;tq^$Xg3}Cae#{Cda3y%-an5QF^Oa;?tf`Fb z&CW^gHEQ_@&0`|BsV9{&C~owy?Iv{%Q9CBqH4A`b=3I}+aHet%81&nz% z>qq-!lCtMF(_qAZB3{$d5X9ta{2BeIV4#9mD?1y4h2S|o9 zO{ZZAr?z@f{qC5|!V+ew4OF-kF-3+cX3~GkT11C-B+D00T>3*raKOG3G-Vdjukl_6 zcW=Ic%b>i{e?h289f7AA-+0Onq&97y+hgoJ--oJ~FJRD}c z5@MGwX*6JeYVOG8r_D#8X*M`WRU@Vyj#=3Pej;37!{c68+^&f!wzzm2uN5Z>cR5uG zTQ|EPEf~DqN4}Eci!P)Qzu~s;z1))12U8r?h-gsqxl2sUW!SwC=%(csbX9nvQHh42 z3mY0Cz@;VAM!R{q6VYI<_d(ZHS`Bw1Ah(}(l{4*s(}oXd)@oB-O&JK`5CWYl%fk~m-b26&er>N+5Z|Iu>L%;{T%Clvh zQiQ80uV0}C;}s$EkF73Y`jr$rmtq^wx|c4!Iw$Rzr6870S?=B!Lp7QP=f>QE#yWz3 z?a0umu0rl!*wE#qbfM8BNr&fUaE=V*a$c5U=*osJ8+Wf5ZE50c6}%-50fF14T@}0; z#_9Y?l{=(q`z+^(6K~!J%{&#YAw!c_@`XF83;4{Plp9n~tn5HRt>K}s)Z-{c!RmH9 zV*);Niwd%09j0GN`BNYNX?nkrOGg@i9=8(>DHQA*QL-F2vWJ(SXdDy`#~ec==(t31 zB9@`iyk#N`U05Y@a5jg7PkqqHyUpM|wMm_#8^J^vy5{mEJguXOFMV>uFU!GAEK1d0 z+Sm{E7i|(Hjw>(6AR64zo(p)twqb_8p9E~3%G_>jojMxxTN@dTU5eqwO%o@7WQF{- z5Ieuudun{x=y6Tg3Hr!xD-GTGic^?dg)?+n8f#d<*mmHoPS}(TJms6Qyz?`~16dLK zMsc?%a~UtDQ?VcnHC?e@=b~!LwDU9wT}!2jCku_zYQ7nM;<-}MEL?4&wnX!Icnb=_ z=X^h$;VY{!3El0``fdsjJnHy=xSgMXZ@5R!;2@t4Z$(k!%Z{}XABMQkrzot0eUIwf zmbGtJUEW~kYX&Dyf-c$q42_K$yygh@ZBdjKxu>C*TDw2PecMuXA>4Limb0Ul!M<%t z_oPtw8U34k?HQZ1w~yLAMpAjysvdV^vjqFa z=;h?DFTkYe2oK(EDX|++?D%GAHmTdZVrXjzeaX<+Xp#;-3I)z9FEl;S7$}x&p|y#n zEHtYpg9}pv@{+_#`NZ3QG(f76`y~yd*gp}7Q4J>h;VfU}tX={Jl`&!rI++$h_)@_8 zHg?k%Uq`=e)EKd?)z^_*H2&A=;X3_`^PYaez!6yw&;H;MbI;Ce>^E!zb9Qb)BV|gJ znqA+yvxZ`WGIToi(Qc-NyD@_qPP3_R-!nh+`sI9AxzK&av#k)P~B@V zI41kGt=pn>EaTNK9s=~iPtrW%)-u>G!5`~4b*qzrhI5`bgtV;qdx;YH){SFsDOZ>) z%gn9KGwj072OkXqbUpP#V~6HoORTCCg{cIMcDJiN^u(5ZEI z(t^eVp~KI0QH3FYlr`BgeBy^GNyUvt3Y%4&q~N!V)p^Kl_{1JFgm!z^fg8;mqS zizkp78q50NyaZP(d_Wa8^9%+Upr>i(n0H`L@i0y%Dno<#;u5+GdWo9b+D?ASwn02WuM>3UmsbP11A~_ zKAe+0=3!LQDL2d+p89ca5|qy8d*G4E{fM%h*sfCHb?IKkVJhm$X7qgzr(&sBa~+l8 za9=;mEiF@j`)3^N&NGnQxWSJPPMv(lK=4&jfEu7O9X@CU&}HT&iDv)?dxF@sk&Bx{ zT!ogQV_Iq(8ar$lXbO%8^BI6r3n)*+6;30q;eDo0A+X-sxnp zN^ZsyBI4anArhk=qldodNwc?K`0X2(qGUHOXgW-Ge*aUH^oEEd{Xy@7vPIW_g?pHH zmrBil=wJ7{gB}y(26|+K`THnGTSksCw_hYSa!{feu`M#h-1hjO%K(FePGMTcwpHq&lo2N8(NSjhAQy6fp3vOp{m()P=H~%J>p@Xg)`93l;P)513gFj5g_9#;4knJKJg`}DIOB(Eevpw$1vC-UgIM+@-cr>?_soY9>n7h@*)O1%#%Fi z{7O04qat*XAFPY~Pv{~)To?I1UF7k)2u7DaYQs^O`gMN{sWDO2uo@Xt3HMQsG$SXe zfHkIY2pIBFm9H8ZSM~Og8ktU5?QRc$d~gKTKkql99u!v`si9G|Q6K4O%gkviBaMnJ z85Aq7E>c4y%c4G7BiIRxqTV?KJ?Z`B%-5~W#X#EBo_ z4H6`74HP2dDBy%^BKhdNqa<;4zmJHqQB{zDh$(k*A6LI6w&FHA+rVsUK$Jl9Fnv89$)Ilj@jJ_Qm*~9c9XE~4PT!zKVW5vsV4;L?w7BByE z;sw3gJO$)xLI1wrlg+3&Kh|TTytt2cv}5Qr9;|Wg^0!B*}i^wzjGI>H4CZ-}l?pjEXU;85?0$7wu@r&@py@O_Gp!drfNw#n{%2 zjWVu_nB_ajyu^*(i>}zAAF%&S8`*5ee{pkn)AcrozxV2=7q49Cz3kmj8^ElS*S6c$ z+qseIgXMg7+4VNL>+R@1bmn1=m*?$zO)A6>kNE~ZHlkrhb^MISd)*va>xid;p2p)e zc$Q=0JPd;OfaIZnM;3DnyvDnA#~7nWGB{4u7=Gdr;5asUY@jm>eA*1ZG!o!=c*z2) zr^BZO0jS6upTtdC3_tVuG`%d+qB#LT;3?>d1%!)2P6n?+;Eez;y)5I6H-Y1FwQ?Ij zRF#FEWzA9>e&RO{-nbVsP9|I{x2;p>LG@<24TX0A@w*d$EciNjs!V3P6rJnGubyCd zJi`@)w|xo+J$OADr=$m^u59?c@Y08|Lf)BK{zc~`2&*yuu+}FwJVf>B4`vTqy^#sQ z;ol^Lzv!`CFkLscs*5I#cnbo7<*8p+MICVjB!x&e@fo|u@y!v3RZud4S7k;mHi9DX zIB7uO!AH=4Nb~_EmR7vx7WS%%dF#4zo!lo3Vz-HSun*cuvrJ^CNF}Bd?;J!4DB>i| z{gN9F?&oa#%a_~Ls$Cp2HRpI7vT`H2gwrBJhF&bm;CPq1bWH<}V^f1OGM!Z`!rwsA zyHW=a^22){pm8733WpmE&&{Adv4Id>!!t5~8kzBb40sjIu+=-X!MQod zYdtt$S2lPPqCU03r$XYKkKNA0Q!_>d)NH-YC<{%^`mGUik~2(aK`Upu4PVKCGw?+z z_zz9eFq2>B^w>1N*V&z~&X#GWJ#1PT6@rD*26^}T4VvB%J zXk`R{Sz0+-_XT%}lq`MKaF7<`;g^Xj1Q{QaYKM1T8-2RZU-ok3!Jo!zVq=lCOIS~vva8U%f;}`2? zdmT8hrhfHsrBLqCFCDh*6%UhBlzvf>h-A%w@Od6&po&$&pnl5%{bKg>PWbf7)#0~L zLcFQ0{dvmg6<@YbzY|PHe*M;Ekb_c8EHxL@jg5d$j|&_v#X4XGOC1=*_j1}Hj%MgC zA0AW4O>i__?s^@)f~48Kchx=Ykil^Pi3L>gDZcKB=nPb*KAKq9@Oj1Vv26^F<1Hk+@Gk7Z1Ay@!E27SU$KZGwM_|cc+SGAe zpIf6K0`b=4;U-7Z6k-*|;9!2Z-O->e<^{(~+L-y^G)YH3$_mYZhna6IaB%6B9h#d4 zR_;@qdN%P=pX6zXdY0Pom=8FAo){hum4_M^J-?eU`_k_W{E1&U`gBA2SQ0hvmPRf7 z;jeWil7K;g^x`Pp=kTcObFa&xt>=jCb$Psy(2t-Fb5Kbgh?z#{z;JNvOo48?Xss}I zyw)mWCZ-qS2>md88D6#&GAKp;!BNFW>h4o8oeU~^?~GvA(W?UrW)(1hf(RA-E%QY5 z>2~@Ccf{Ft+kxxuUvaV>b1ToabI1H+PPGF?qN?{4&{soC|FVByiyk9(wGakLX{<*@ z>}Tnt8*Q05bT7-(PrHJIcd#&Fv(02!j{Q4VT!coFgLbWi#mHmC$m7Mxqr}K}VjQ$n z&WM43<_4K9m-%hKr4f&mm)W~$; z$!hxq%Hsse4-qJj6eza@I?4-u0u^xr6^95^L<&?m0u_H=pfXON@(_W_NP$X6pz<(* z@K1MNZTa*s`*VaIGn66psEGW~M>pCs@#k`b#u3g8OxT3*upIk;vx1AzNb)B#f{h@L z5hITmBaadz--&Tl9>71<(@3bPVM)fFj{VNI8#d%`W?;;QUJugIj-i9M^a_hHny~K) z4ve=%iM7`Q{b*UR!}jv-l`4;vDnCf7JXWgQmg*q4dP;`x=z}~Rq|l9yuBg7>!iKBT&}KWiwDUM?P|8X1=eo!aCx=X%O3UT(Jx+V z7mIF{ym{R|=)O7|kH7q2)vY_Mw20>V%N=iDzA|gG@mn8%ynfEm&p-b>f7y-P3Gr=v ziAOSksoO8fkF(9g?Yi!pcC(px$rZWAS#`-n8Ek+cUjfeC6ej zlFyc_`PC?Y`Q~<$v{zSawFdsy*ia3%b^5`)ga0Kzwi_fkNVZPCxLe+CZm~lBVRqFm zzdC!k+1#w3edZbU^Z1+YnU^OwO?LIkj~_h!>bY9+Lin3G7Q2c~o4X~Xy4h^W@t?;Z ze_U&11}4dH&srCg`CzqtfCc_FT#)wquQ&L>I9`O0-@?|f7~yo7 zTrCsZR%-QY*3;l8$VuX;=`dX_#(M*BKZof%pbZd zQwDHJ!rr3i{n>)NbVupUO?SQi;wzN|1)(7VG=*Q8>GQ`hUplSakr-O zW`<#RfcbW|0uVifwldU~-)fd2Hhq>%k1=}!kB#0+>0Vh(<9fZt->NS6C-1!}d)#J} zf5OwFsz#`+K|!`uUp15Co~EQ~bS}|};A-~mx7`Y&n+OG>kZm}Bz4}v&XY{D^kJNY5 zt?2*lNPYVLw!K1MV57bPy`C5JH+ufgu=Y_$Q|bytR+^IL(Ni!k7urm$f6c0yVuV=Y3k!$wnI$q z%9ws|z20qvSJ1?0SXl?1#tzsEF+wpLgj18iH=UutnfVxAe?1d4-dtRDKP9{RLOs5? z+;qwtRiSGr=t&t?lZ-vCMe`vo! z747IlV+BiVVEg8dt`DS<5lzxpA}9n#zeT|8-((O_8n(yBY=xea8Ab<l`RwW=Ry`SFPE>u)HWn8cfOOGcD2^cadEX=^a{Op!7Birp2@E3 zc6OyJI%bif+WCX!3T#~KVr>ai&91vOV3Bvh5b1k%Y0$n()tsKG^!h+^&iE`nkgOyC z*J?)IELqc<7&9aRwlhqRaxLC!kEf4$x}9*&W{b=DEp-o6E;n~h^;Nw_e^p62OOx+r zbI73#+M-D^(hd#QT5x)HG3PI$Jw(VxzfZ^<7O&WA18qFW@YEubruO<;MaGM9;Om1jW4 zNGzvQ!xI`9UT+%d^vQhSe~XeCk%J4@>q1v-uHwa2w9ct5Rk_gQ!6a4e{5-9Q7r@Db%jzm zAG@3{Z?Epu(tiDzDL&!J`WM2E&*YVB#F|q4eBM6L-mbc#sKpC0S=;S8xjAYPon)LukIW zqpuC&_bJK@dTPM|QMb4hxfxo2*#3Yj6ZME1w=ybPk0jOv`D%W}A?7qf^!zx^5-g#% zA>(9tTVK8P`VGw|=q3{gb&_Q|;hLM0a?(0+G+XOo$gyk8fAimUkbQ=q&2Abqo;ZLa z=6AcqJzp<1=$dv8sTt%F#W{S|=6l}WQ8l+(a+Ad%*kuTxH<;K@mB(c!O+A1~7bD&d zq+8@_)wk%{6}A6X?agvdkt5J9;W}!Xx^@ziot5=EXN0XoUMD3f({Y`g)#(%GP!jXg zxum&)tch3le;oNEd4*EA`eRaT1_qx^ru7q}B-bBvd@R(*roqQje=PB_(jQZNtkuT} zflc&B0&CRAn!u*|BY|b9{!DP0rdJVQmg~<1nQ4k8fo7%ttY9nsIekJZk5>S8HlM9M zDjd<2re-qP)6#u)I2HX2f2Mi^-pmEZ*5DjSk2;;Jf5>tgRjP@!512n%k!_YVg9DA% zCvSDENiPb7bDp5$Rdd+|=CYGUw4TLSEl@MpLOd4|h0AWO<6F-TI==f0{kU+q%U5a& zPtzyFWDOLW4w5m|RM*t(Yb8_$nAuw88Vc+FWxi@SC8kt6euYu}{Ber3aYHvJKoHl% zxkK+Gf83T>I&y`sls?kme^Z(mPAityf+=QlKyp#sabrhg-es8O@;i}Xz$em!3V!{u z8s!v15uuw-VGOb;+mW3hOIc(-_gHL#Rt!r{jCw z-q9qW)=SF-!)Eh4cS$q;6OID$11_Rh&{`~1vbWdYbSmU@Z5{BSwL9DO>QT13LPXLV ze`+(y!y0=Q*Emakn8E=D~2bwUqXQap=K^y8&Ae*jhhrbb^pAS7n8c#}MihG|H4JhO6Uy8wz- zWY&T#S#1|?t*^IL(Nuq_?xH`FeAub7T6+Ax`xyE*BY`W5D-F-#&7!WwN?ETDb??Tv zLLM1%vu|}lZx)oaU|C^~=!hKuww_(7U(iO?AHQYQE1&k}&q}Xbwk#S!TJ3pCf2D?+ zcAWkct}k)(gs14OqqSaD=rC5w9Uqe)w7EVc;>Znro3zyok&3o;`Ub3cvlv&Sgv-rW ziG5D~M%~Cyo>%vL)NUrV-{|~V-2?q#g;eoVx5fq}Y;k!kF~5HV-`s#d>U!$CTZ{|p z4Qzz*F~S(+PK2?`EgSRso~tUJf0={8iLu+MXr?t}Tw5w{TT&TqueZ0tD?DDcRlLm@ zv-GUA-I<0sPxf%4bV$S)O9;2t_V%LR+w+jO&y2ULU~%_fd}LyYXJKst3>8&s($adF zo{3S4FkK_krCv2@q9O-sZT6}R`iXZ4_~`zL&{6dTLTA{oaT)!2{ zdjCUP1%beoUU`=MVxt%d9sc^4CJU1#3Xvt$l>Rqn2~F>w(u1mhI6W{!e=EX*nz zA#CpD-wMvueO_Ey=-K4If0J00{=$hxsl1<9^pBia!hpF4@E@F5lroM_EJ{3;SorI{ z#G(gqVqp{`{_-~@7UY%M-7QH;;5FJa*%1Z&eYd4^?>i0F+Ya+8^2SCt-t^#)S1rnZ zwX`tFg>DQlSG?a#(DSYUYIj$uM!$CM8lqwHis?>1_0+S;$D;oWe_>X)iv_NY1;|I6 zT7WTUd#P4|mocSw&|ph3CDTbAyP_x%{fV~8Dv$Gy(*nF_h9tOq)aiT7 z#*LDlPh^=S1cA*1j2w|5xZaZQY&i`m>ABvxM)r3)*x%gQxi6C<+2Dpd%xMl@%DxKWQ~m zH8eC{F*G`qPRu@5e2ExhI@S0{vGa*82IVdf(`$2((Uki*RVx}DeKq*#GY}5q*{S#C zhvf4}R?ExVe`_^0&OFd+Gti|P8b}Ws&pNpaSxI9n!gmD7KKfSj?M-@;IDF0fMjp`8P&Nc+Q{?LR_tmcU`Ue;A}6{0I!;Co)0<__2@R2!14khp^$zsXS!HWWyEx*byD7Q^l>S&au+l7S@m1 z6vxV zNA)q|NZx3XT{^w5P6>d&T>Ie}BH`%3m48TTp_GNfP!LGpWCZAft4k zKWL8hrEvg6FFpuHe;OM8@sh^keLs;-IHW91OL_N!s?vBB2 ze}T$o4<7tUJsqeZX6Iu4m+uef{;JJRLnD9+o`1t5c?pgI61N z;`mpuH~#k2aj>ct=Kp}Ek4hg0YU^+{{lVVV_C`{};LjlOABG~tE)1hy5BPARh*HXn z#G8%+LdT1ScCV~%yL;Mcfr84<;4{CCU&7;fvyLapOtRf=d(Z=pc9J-bV>?dle>f|t zkW8$8{4pP|O{kGq`8a4s7Kc3{T3K;W`z$J0u+(rRI@}I6zD9+y0*MXOXPm;BiXxjz zdF07d5ZT!L_+uVED=UWN4fks2k9X(1xts0P==`5L=VeMS@f=N;j(5&SNDX~%1r*00 z^Gpsu=6IY<>*cxWfKV$yv|E#6uwC8b5+>e%m?mbxokTf6z@RF=G+AN& z*htoxy9J0x#lA~Z+^o7-N8zZ>znU(hM=tgzlUC@AiC~2qX+|ceSXY3PiEyxhrGt={ zRx;m8P0}v$92`iKjI@ivt1fc^>gI`KTd_2D~P;5A)Jsf1;RFR~oqF z4`OBL^aY38ncH&iePw6)U0lKJn7ZKC*NS`6OtFIc?KNQxtCQr1XIt+`bsG(0i2qV6 z{z8H;_$Qu)Oi`6-H$utSmq4s+cT^dJ$RyHL)2$jF7Yc4pM^Nv$X_eYT=yjjtJFi;8ML6ve^6vF!uh%?Y_Ha* z2jk{|ay^1|{laQ|{A2NU@#Z%F@x&#<-Fr3&dDlb=N!?gW-K&)gjpvETMH-l|M@RRA zVCYplj5i6w4vANRh^zqc>Ng}k4ww91h)71|Ul7#tXg~~xNdOdnsz~tDB^tj_CpN?u zO$YcVH1Oi}V1LE%e}|poH4U=}gSZHTxX1wUdlYTf~B%#v9J6^fSr~C;?rCukM zktBa2*vO?p)tjq9r4A`i`AxK^4@=ai&yP|MsLL-PW;?)He}XSH?oKN#{v`iKwm+WI zmjG|=0H0kZlS|Z<2rI;mev%JiqRWME{IM0X(U@-Nv$H?6XXjuqp2 zX>Nb%kygnBsgnuyNDWeGFyUL)>LXu$d~f7iEQDY9h6H_O5P=L_LaC@4|9~_4>@Gh* z3BD0&;&b?ak3?%dwNZsGYi0^N2htbgx zkRVmo1rWJfF@ufavQ0cItPhM;Y^f2795>%+j1FAj!=CQ@Wm8pE(rGGj_gVe0cuHA{fVO^*0haHHLYpGQ8j|tKe}ZKld|vx-%R~_nGOC%BF|Ezq+Kh0;1&qcJ7Ofuf>gT*{;o?6(%}4bUDoQXf z*J5*GXg-QEoH!5o2cqiuh5o*Z=m#m9-kc68dr6ZHud-)EUeU@B`987$6%DsKOk88u z0C8P-b!c)fBe$TFR!8@|7>()TsCpUF@2nX1e?V3+BU7&Gw1mJHIL^BV-Eo1q2c7mq z4mY4-CKEX5s;crCI+>DJXJ%aa@8xFs5c)NAup7icrb5F21Q~ir`el&5Ll4ykq&{6jeYyXg&C+yi1bbS|jLp?qiZV#fY`7W*Dphrl5R{#eSiK%U)6z}Xlikh z3cISlqF8_c#$mJ`3K&ppCV{=k>~mUNatd$0UHxSS{ z6rk$6(zI{<#?8A93K&3ZrGbGsaKY!$fg9{s| z8tE2$Ie*c$Ke#=tfv6ad*Vn-BK8L<4vxN^zSu#45QKliX(kEoEmZ{>pGEK}x1+SFbQ|ot%~Pi@bte2wnn>um(rmbn&3#T1XkVzF zds#!95?@i?jOldHD_-jya85=Szuq|jeQ49F8u7`|mI-v+(uTY5+1+(pqMq9SMce$L z`nz;Y@l~eX$mqtW-Sl$1rd_4te>A`3PP=K8IPFed>oo42cHQO=Zgque4=HPPSm^J` zQeG$7$dh1Kc@*pxy$5zno&tLY9|OzPFd=X7Vet8tHR+E)hl3Cnz52w+da~0#N7yrj z`1)S~yH)RiEmPm#{4UyL{SoYPAeiLqkgPa@e;hrMs6%ex znX(&ssO(yvD$C_y8u{LQjt=(lmob$vJl}d|4e5D>DWafS6KA(z50Yn2~@8J8dXfAgIL1#3T2)Jf{V zYl059ud_egXHD%cq#!mS-u&~b0v@tIV3Scig*G}k1xGvuKAk=N#1=ATuV-7bsxoy# zJMqWa9PoO&>~Z!r?R@^8sS%u*`?^}yhJtpAz&*8RbFo$e`6xsf8+5vfp}|sds`K;-WTlk zcl}vsZ;%Vr@;Zj0%m*Y8C~*Q1`%@@5(;aLh4_-)Z=ZOVPbqcfOd6ap@;H~Hk6pE!U zBI$RhuR}VnE+g5J0+jt{PeRc2LVtJ|a$lv6p3ogbAV7s>+}WjcZEkUOEmrg(bGk zm_%fe`W{{LgjGF(8GC%eZw|`ibk=F)Juirl*>5Oyzrt2{kE}(k+;cMREW-LBy)M&M zgO?;$p&TP(soifES1g@O->kGAre(a1U?karB6+vMk@~{$q8Z|SU9Pp(kbK5CgVTyxNGjxH#=iJjc!_{OfdJ|Q>yWMUdtfw9B(35Y%W=IX`U z<5SQtaiISBqf9}20qA{_Ge$Mw+~zKQ`)hf{f59)Hk+U@;MPiJ^*fFBOA36Nxra?3* zSSJ@&7kdmvPDy_8b^-#w_`>r!7v9u}BD-qXVCsXPHBMhV%UVstHe7V=@r#ie1$+nyTk*$#8)jK8GKj41Y!=E%ZLt!o(ri%_FZt`{*2PB|0<)B|NAIC@m80 z(+IRNb3I@3DZl3F*Oo*05OD(aAC69Ef4_)x*%wR?Ti|*po$HWJffao7Sc5a)TreEW zLYQ(Fw73}YJKLB7AQWOspfm{fssfsk9K90YSn7wvPgdYoW_JonEJl<@vds%7w&Yea zuH0{mGwvKm+nlx>Um~M$_-0JVPZ7jz`EyRx>Dh!c1$*YN7$&_b94UC6RCtbVe~#M@ zup71C{@p*U+|p<+n~aG_5T+*4hNZg7+Gp5-0n50&G1aG_meDa74oCF0?aoz(w_r4y zid2)_U}_o+q6(mU&J`6@lL!H79sE_C)7DJ3FK`OY$44v|88pzcX80>(_A{t8VBksm zvLyk`^+D@K88(b?zp)|qcbwNme{768Gf$)28KBXc_{wXW1AqAyUrZ{?qGrwqbpPtrpiXz^qfAR|moVA*} zM9Zb$!vDkg+L_QNv-V?x3Sww9;(9#6h}HOk30gPjlN^gGe^iXa`wJ8XdMqh}&~^y* zWL!Zjtj~cEfFzaYytLsj(q0uS7G8lGt6%Dm{L}ggOchm?ZDoq|A2))yJ;S8ybMrB_ zIM#@Dt_U>EXa$nx9??d#f9vQhD)gVcAF*{XpU>tc;jF>&%?3m&Ez$57J_efk@5d)J!S@-8%|fp+zJ#V0mQK>2@Jfs`6THa z1Ty7I)KICfpNWB|+zhgXTO(JTFH5?C476+`Dk2-2z{-LUO6>};e?UDA9hLQm$nFQY zTL5!9)7k&%;Qg;YIe2JJb4y5=Q&y|tCjjwRjvbVhwLUCyXmK6|oA%i)vde~%VZpty~WMCk1kJ1jhb zTdi7KCD+l2@%G;oUAp?T)mRkiY_3&XB*IKLXX%L_0-AL=u#6tsy_2!9O|8Z*Yq%x~ zUN|oH#@KCxi{|9Co6D7X(TI5{ikj3FSj+f0iZ0}oa5x_V6Y@!zo;ufLpx!`xqktD} ztP0bOqTTY_e_QQgv=sA?U!KmMj8xV?IjfdhA3y;5YbjV{qxZv#)_Tvxq{VB+b+59F z&LAb&uN}c=pPt#P-S(mzSjN9}qPZ}EQQKAGS5CqPGT-H7lnlO|Oa_CK>mH(}J{r`E zaJbB6u}=@Z`)n{M0+#`F3g*yF1$jI|_Hzy(lPF~Ge=D6OM9}!kMZ}_^?;(`V?|jrH z_z03Z5wu_-aEjtjpu%1pK}Y@&GLK%OzhAqDqff8bsw%dKZ?@%r#*J^9285oP6j%+0=SZ zYPxewmeG;v@YuD$tT$}Qr#aekG5Gv-HM(Dv{YLRpG*_-Hy`RixPg(z;&nc~gKILgj z_AdQAI(h=uHDt18WUR+w|5!|PXxEJwj6QJiiQ)Oj zwqYP7Eo=d5C{~K3do>&hkyc;4r9olZeseS_;NOCcg!+3>)SRni%yN97`x?5@I%!co zufM*46b^HDAQs_3r%;Gh7?ziHIr@HI&x;D6-?t-9Tcf%H_Yy~|xV-s-yQ>1`8O}PJ ze|FHYOVG?{Q9sp}-LB3NT8FNtvsTNJU8Ndr(Q#lY52x-+w6y*y#`V*hd%Vk@*g>FG zLj0Aa0KgkCzZSoaj3bziXC|zLV56V>yvRKyq}ItZSl1vNf$B9QoN<9@_+b&~Hle5x z)?FY+zq}gSwk0;8H$@R81n|ZAT2m~Ie}zM@?wPrN$)7%TH+8iP_kv(V*|=iWf7>oe z*;-+zB7H|D(?b@gvOMSzb6DC($b2gb)L>9;mQhoYI-b*2~q-t<{%LY-egf_@=PwU5ZC9H{Tb7mv@eb`1W%1a0Vc8`aWfwn5*)VpFC%R2jC!8Bc*I6#(d9gPskvC?2 z%@4gX&9Y)|=x@EckxTyIi_ahOO$qGQ)V}orHV$b9BpHw6e(N#Ga?GbU+#g_Y`0W=5D!}0WuvNOQe*go5wUGdWN8k5^ z7?i~cnc67h3{fUGz3<+)r{1?YAVG2r(-_i16CQoPYH)&?vaI+4YSAA*K($tmAE3rp zh##Ql8;KuyI6^|vRl)@XBc*_Kh1(x4Kv@0{!Uc+AQvm~t58_oe7BE1-?*az?Yd-6{ zfPot%{$0Sp#sUU>e{H!KeE!OM7cg)aFtBRCz+FJVT|mHHK)_ua2*`5q zQ%CD{@Zb5#lTSPE{Ny+6CnsBTJ$`ZnDdp^0IMlUfz4F97G06%f*^%x6i2KxK`r?@u zuw*7VyGS4G*OQ}jddyAN8VofIKcz++4t?utg|S6UVbvzxe~q>k^q=h*ZxA`rP<2Hg zS=2-3Qz265+W5oU>Y54@E*24;kYO zsG!u;QRik^|Z#Q00u!32#ozwIlABLr+; zXUTmLqUa10)Y+G2-Ahd(Ax&^Jc9I0C4!Nnc!EiYkR+wmEL*+`f)63#cGZ#mTR@D*p zOe20*^6p^b@b6;vu;Np zCU2iPTqoyXdvDV7_wJPDexkObQA< zM)Q38(I`ZLH$4jA2jkn+%CDOg4|Hi!yqZoNf0{8pPGSa{hE?(_BJz$SAmO zrMmA~sLXA#t3ipp>?A?J)QmkOri(>5 ze@rdQvTareD3q7+f~KNBVufl+#ER-N7_}lh6|bv!xM?6kq!ZVPjORYNcEr2u4`_u+T)@r=J*x zqV8|-JdsJGP872a4SSR7zVQ6jpO;NkIIF%b8`D9_Ps_gWeEzet*^kP$)VMufU+gpL z-^S;s1@Xrjv*Lu9A|bVZf(p-i!8=Aw*B{U?`zpw>{>@V(+j4>{Ui6-5mMRj?f1-7j zbx3!Gu=MCS3&_9h<9ONI&EE0HslCBLI_MAKKnIUMeL$gyH3HrFEu$Vj^5q-Wo3fjb zg!%@!QPhGziy)q$XLU{&3-`J_U9Oe7yme6=J)Sx@*6(fGKR{RBwxHkupfV@zMccEf zt%!?rMg41i!3K4`$X)&5b%g{;e+K$qKFwJ!f722YaRvwEM1T^C2A(f)suu!ch7*n+ zvk*W6{FEecBsf&r27&=+6$z%{lbIsG<-udWrfV#H@%hJ}9scPXnX(~n^p`h z&{k$rz))X1@7t0=1f-9d-NVRe1^nBJZTvtH%~bYBT}PNw=#mn58&oJ-e~uMs`6Z$t z#2&yvV#^jA0il;Yu1#s!EWkLF#au5AW4Gy~>)v+NX*?tvxmq>%XkcwS^i)Lcgu1D*Qs0?lr6!qUf3+huhdwtnQqyxYfmou z1n%EhsN|_JRw!S#5e)3>eCCb~h-Q5gd?0PY+{10`rJ(FfQhQ%@V$9W#6Ogs<1fI2# z4&N1ulW=VqfqX>hY!Yr|V*Ids(k)?TlN6*sLpTIHDvYf)=72M`f6T<|?)G6^05Ra+ z$tb4oMa9+b#ob*`%$OY`DXEh)4qjxu>U?eF9^*B>aI;2JCgBd^P)4e9G49iiLigp& z!W^B`#HtL9i^Cgv`o^GaGJX{&Gkc{-J;07m&eXj{bzTkNdfS4k@IM?G81kT}eNk-`&va&Z0Kr5m;WwyjY%dIfe{ZN zPz87ML0EVKzey z79C4Nr;nx*z{`jIIEbF11@n+?4(-NI?HS;(rPrI6eU zHOiRp6K3#8fBe20HErKldj%VgS4!{^T%#AQ=Rp}mbo;2QHp2OgkAYtazN zfIj17MfAxuk-A6F^yA|i6;96^niZ!tSDV{#E&RFSh48TVj6tvCRyaer@@-aUI+Xw@ zR@VTCjvyX+X?V%=uVXXY*L3k5jDBIZG$5oDji9n_v`h5&^v&~lpS9< z_qs~~s6()U>H==g)$^6_hW98L=Z`OFe1^nPEBAI5@4Xpwdwv1)!2lA;)0En4n(@h0 zl2(97RtiKZgmqQbix>v6j7yi8GXJ)}mX5^$y2IXbR0y3AbS{*wRH-pqeKUegPG32* z*Vyf?e{_#6W}+UTVM45n5Fq9e+ak6a5i;gtYAu|DSxij}Bd%lAfZ|hbq97AUhgy}&%kfSZkk<<=azKf9ZpY_nF!PX_k8ESHv_!V2 zGgTRqtt1-20+?d%Mn;pc1!t9vvE`eeXXg{7f7YWW6Ep%4b+ZN?{sPrx&3}y0s64o+BnnF?&)H!5>3f6Q)Myg!eiAAi-}uqS1(>SQ%w1WcyVXFx?kUc`Y+)T|R5< z{Od4hgO{16q^3p{q%44(DcU49Omi zf47R%s@dRre67pzGO8grRZDKVmNlnrS*WG_^)sM#_hr-W+YG{zzIqo}G1`4hYfH#< zEi^rS{L&K4bYVvVZCx&!8?9z}GJ0x_Rh9AOiuQ(p2<=srGB0CxTIa|z6W3_wOHDeH zk?_JxdlOpjJ2_W=(*)a4DxaKjZM6?Ff6W$YRoc>j{l+}@sJuUwMOWE4dZDF7#fO{E zw~5A(nVfYP%W5W=Y%VZAJ96H>mYhIIS(JnUjR|UPfMeGPkVQ}*Bbk%R2g}w40pL?m zv=5pG>RgI0FSQS*v_&wAn*h4g`G}1T)bmffXfc-^hlOqA$=VFCxE-Kt%PR#le~CMy z+GJx)X44ZzutR(&jV$&D`r(rWJqQC&j$zsZs#XHJp`2F#vUlyxjT15aZ?}13QUT66MrXvVbUvZz+D>E8<(3?((pAx z$ggwz#(er`X`Za>8ug2jYkPTCNr1>v;1xPMv%=Pj#p@aJy(C_|UgVauRNjPZ2F=Ht zDttFsq;%*)*H#Q#^nWcz0D;cEZAN&Y6Un|(fZ!hm#gAuGXH@LKKEwm9@eN)b5=8n2@ zF{F@z$Ek>%hlPz77j&qdV|nD5c$%LaZl6O#R1JsI`bQHEqLj5+1B=YI${0WLmD0?% zm%V?=A?hlEur6vbOX+-ZnPLv4E5f-PQ$Ui}ZM^ja2;l_*E1LC(k^of=+-Xm>Ql2x zUt8LP!hukq-Ebi4zSS+!wsBYI(FB60)5aQgt9(&|4%KOePSaY8e_AbxM~tZ0hTj%( zF_VoK(&H}@x-g~8Fi-ro0qe|$1SRxGXJqK@%%dpN{zfX3r~^e`PFW(ke(Ip-vEnO?9Aa>lXf z(lrrX4DuYJC3je1@gBV~?)Q;ED#OxF%|!WdTpS1hiNcvF1{jd>l#TP3lkv~AfkWYJ z^fY}+ZRP{Ck~)1agEQV_JR<+|m|KB-AMxR^p1YhQ&Bt)=e|CV3nH)k1hROZ=RGA^X z{N2NJG(z+H7sw9wLnleTKg0@wCS05O_uKm?On_|i{q7)LPd+_-)OA%Ez}D85LVG1z z?;-_>SLYRa-u`_1@y_1SRhT*N`fBBSaXy^0&y~n*{PBlczFTbFyLqlG<<)$YIeJscH$()B(h@3F$`{Hl% z9HUy~!}5^FD9eauTpubQG{3=kHX)GtW%`_s?+7E?hem!&EZwjmQU#`wC9qJ5b;I&< zqQP`dX!SWO467vr&=yA4DWUlVmR@r4>HtnR(UuqifAYAY<8WX^#u>_qIi3&@?HHfQ z89K!1EGnLH_8?;8;t0;QIEC2E2VT0uqLbSrunxLE;`xvwuhW#PP-O;FQ(3G={s9_D zgYJMNO{etO-~K2rxZnI2~@VN6kr5j_XaL;AvK0zC&$GdFH39!Px! zVf4{&fBr;B4o2H&FqIt>&t#`p_wRRri@TkSf;r=8kD7^*MlQztA{)&nL@}tI$x%F} z;v|K#{B+P~L6VM8*m>?T*u&QOG??r z1lg>#ykT1A5Ce>%FUt-m<9?RsEyUOZmSfrie>YL-9?yWhIu2j3=)n+Sndp$tM}*b4 zazcT1l=gatpgPVw!vXNi6A!Q(N)K$zg^CUDCZCrOET*hTHUZ6a)heZD3Z5|u_0~Dl zCfAiF4XC4O)P>v20tL|P)1$UeHa|nyBx$s%9Y+IgUORL&m{GsUL?p6d*f{` zP)e!j6Qu@E_mCRgN}Y6sGTNj;5zQZ|rqi=T|2XPCjUr`~VSvOQqUEgE0aLqUu=vouuBQ0hn{%E^uv zOS=)5P(k&x!PD8q!G^z=^o5CrmquFw?^ecLIPVh}GYisQZEC&+2FC0Qwm(Oy`vjvX z3Q$Kb!Ev&*fx^Tk!?&Q35tkG*f9brrL3GP_>XCHO&gV{<8p*7S1FeuoT4XGJ^yjte zzFdn7Ghp83vAB6Y$g{d$=F%e6s!c(O&e){&DZ%=v#l| z2#m2`#@hP3Z>+7qvHq^7sj-JZO3MT6yBD(mugd%wR{tsW8pJ6VsmFXo&)x@;bw|=^ zrqd*BdhNYUpFv>D2;^-if7)Xa3-0)wE|9XpQNIe6SV+JE>J z*@uq76~4a0=|uS^+xiXy8R;C4~%fe!44-z zQkCZM_QzkLd(aPsqc-t3uf89y;97NPyx?da|;JgLWtqkMRDyNz1PCy;B;T6d{PYU*U7h`gE zVd7fO*q%Wnm;^lW@o@0;d|G6s-Nfb40=GrUAe}~)OJdWHmsYY5-PAZ%h z_X=n7?PWPZ)6B)(u$pe*Tj68RNsDdDV(&YrD?Ut#nrw?jg)4d~+M~WHWdYv29Y?@H zUa0a6w)Iu^fwL#REs9tIC?rQ1#ye{Sgnlmv@y?nD1J*zOSFa?^8|?=urD3_=XAZa3 zkBbKoyIZ{ee_q}*XeU_hz3;^1rcBP87}+SHLp%%TZZ+X>obkj7^A0Iftl6c7e$`Dp z43}^YEhC~5^1BkvF;i10{HQKA){jg!EH1`BpSJE)U#Sxd4tg{gq)p~z$t_YP7i`Q; zlqsy)%OIkE-TX`%EWTd*y@TBYHDQ4`)&|B}56be%e;hgk1I`40fSqtkM-y@;F~L*1KppE?&sUh&jBEKYMa3ZGw|BMgxRhBl_b zG^9QJ0#4SeK14{imU=~cI2GkR>h4mxKGK##U?S3cOsSOsnW3l^J*|{fk7sn%l5)zX zvKF~|{C)vHG;9v5Tf>@-Vf*o@&8RP?7&LQ^f4vI(M(v-e-OL>VW*5{nPrFxm5i(aN z)B%y(QzCa!QXZTA9~LDch3)E+9@?d}C{Z+D)Wb)|9w=aMjS_fn-OMn$GmMP55RVm| zq=7pccJ`gR-p3(M-37u%9R>M&9X+>d+R++8b6WuhE%=S>9nt@k#}zUFccarp9!NtQM>cY9y!HU^@uH;@R*3`t8-COT!KHRpfYrVtD*AAANS zPZusWOKOOX(K|7=ta*x)!fB$KpBSaLj3%(@{_c=+SJyjK$1*5&)n7#3Z0>oQ65%Hw zyeu}X4oV~gZ*0rd+W<*5lf<|<3X%BEe?g^7EZ`Y>ptgLcMSt+44E=;UtdbgC)Y-Mz zAfT7mMFXDy(&CRW)k-z>>inW|?wqq7)+O4p=M_)jtzVjlQpYJIYyCD7FL_YWQpfff zO#f$b{jJw;jEVq)y(lz^%EO#%nlH!ll|$ z?>ZY`M{@UBI*mHFSFPIQB95$XMyy+6)KTQZ8-{HY zN%1#L-PK0WdFEPR>YIyC_sqzei&=UPkH#}IZ`|+7d21C_1ryE)h9-b*e>p(sQ-V&l zB15$I+%6YVi^Pf=L0GP+^pF9-;QVGy1m*2FoPvtD(tcMV8k!fx-J5^G;k&`v+i0wj z7%QxsH@~fN%!3ZUPgKU2;;>1l;k*U{QNvIcsW&Vuxk~6rE+vc_1gRs>TA?CZt+#sp z#zq5*0MSZo`@O-dT^3B+f8kJ1vN6PA@)x$Lcw3H<kW?zz7qbD+UT+K7mWb6? zEhdYp63+Q1@VfBYEtv@cHC4@0WJ95)pL{O2bcwAA@#4lsN3@8LZm7BVG|#RAD=He{#Pw4!1dK059ZfVTxtF;)~PWM7v5_yXh+})JI>@wm3WO&ShgHJ+5pl zN@YJS8AwloDEur$d6Xvuu>J2Mh}H4=)z% zI>WQRRvDkK*x4Im35`-aDMTyCQ0zt2Wo<&)nArV>2ax)r*>u@CywAoyHkQHOqMp%I zh#P4H9gDv`g{5V|Y_2^_7Dr*-c@FV(Ez0O}VMDa6e1G%ro@cK+b-oMMfg%WNGw{MP z5cx1D2}87Oxz(ezv~wHHAzHSPhA1ua_Hls|CSpQFJx`KS)X#08i!SRS1m>DcE+KM) zE4YO1&7nujLN^|!xs7z0jHrX{&+?|W`*I~n?utbnC%izKLPT~Gk!va~bIClTLd`CBAXI&P z5VmH-Lyt5Vr0=PJRCJM;L2aWgc8C>9Q2wW60e_T7HBcTkLou;G(%LbpL~MB#P3Z}R z3a66+U+vb=yTzSzP))B`WUvNS+d^E%hK``i7v+=1%?QfUQmO5&+Jchi?QZmiixjtM z2W5UXQAAa<6>5pfjTLxsNn!CK$~0NpB>QPL0JCC*Jg>N&!>=&akxWrEFU%g4pzTZA zM}LVCx!jjg@)1lj?v{LsC4}QB7UIjLv7k zXu;{wzr!w-fX}|$eYM2ir!g&(HXzeMVk%2ha|B?U9_Pp9Gsnu7Ft&o=#)HGX z$I<@r@mG5q&S)b#ne1YmX42D9s!OCeHQ~PlwU0qXM*%*$_T75a1aQW;rasHwz#^QO zrr(jK>4i8MA~qn1B{iE!0)I<#lE=+Sf*Dq|OBK^{(VjS066@&*LGD}jb0G9;#8h(} z=v@Q&QW%RTF24&$X*#9vc;}P7-LF1J&L09q#MwRAJ9b5+{BZ6M&Rrn#Z3ZGAWs*$8 z4c(?Y!T4UxEN&VB`GH3_~p$cq|Vkce7F zhMHk-5G@L2=~*Uh7R-nD(b{H&a1l~{xD;^}4enj+^4}A?{M{i2Y~GR@?`*vHfQdoQ z1;9*3PlA^n_hir81rFc8Z$gIwRzrrph~fJ9U^WZMxt?X!AVAoDt_$e(SJ+qlbGPd1 z3-J;hl&LW>@nKsh1b>$oSL1palAOWmHi%(49i0PJNv>plT89j96ERX6J{bJRxD;R_ z?>OcQdP1(o1r7bsI38}rN1}CmJK2CbZ(1ZZ|2CUsD^Jnj7lRT1<^*peq~w$1GoEb0 z5TW&F7jK@og`fW7!B2m=9{h&j;2jLk>5`yvj|0K3mVIjj$bW4SiXp!$=0=-?02Ak8 zOH}>f|17R{!2d$7Uf$lVbG2*oPvq*Q@NdY~3rL1vLN>gjU(|?_$w}ePJ@UgkxVN=+ zZ~M{b6w3T?`-p!Ye}1ovtjZj+9+Br;XSeTNMc7i9j&^S#<{Cjs#>V!QG~m z&&t&4OrfX=rxPU`;8m)xAJwP;FED{z!uCzQoJmD)M&}&$Ek$3D$M;o5y9XG?kj()E6(TJRGyy}7440w9R9LU z?P~L6JcgBFRD>9dQ!cW3k^Ob(4N0P-wMQ&{+kd0wfZmN(b+nY~583$MKz4>t^jm@E z43a9{QT!I?hfDTzs{`dA-i=cQ>I+4(ocX8^AI8ymmNPI;uzP)aw<9z+zMbE8>nA7e z+7Gke>}CjP;8R(8GC6LV7H3|+d0ob$P7mr%)&8Sv~DZCXwi0l!NKZ{J%3;l^2ZP3#zxBunOEF)xW-o)Z-(h=-Hr7v&d(Oh z{;EUeK;Dhi4VL}YDBhCPD=hn~wSRKb5`Tl0m;FVyK{kTY)BV3rYH_2jDI-9++A0M4 z&(DUxKyIx(SPtghSlvW&tw{5>#9l#mt%$+NNn0FlReJGR%U>+LT%+x`a{?6AR`i7U z&(DazKzgk_SPtghSlvW=tw{5>#9l#qt%$+NNn0HL1nHHX{w?xrr6WRLg54bw{(n6( zY^4EnQ18a;Hssg}bZ<}am1WrqSe%@+$KzJz86tD^{*b@c4Ay(tnmhs#bylIze|}>8 z1%hm~VR8WPM(Nt(YZYp@BJ&DDYn8T7PFl6TvZ!i(+QnSH+QEqf%N6g=O>S3^v^eX! z&WJg%cO$maNf$5c6!UqT2V7CKxPQUDAH}G%^wu($%cy*4aXH!{GMT|eI6YPPjTb=S zUvn*32hm~VqnuMFTaBOqch*EZXmG|VtoH8>-dGSs(d^(ad2l*Qy!E|N{g^T+FDrh< z6>i_LT^YmP7I#Ko_>L3$>|0-krrZ`Y{MUk&uFEfiL1%?vkShDEQng^Ezke#94x}5hnn7`L80@*;y-Uk!n~^E>2db$?HJ0KY672EGxjgF@~rX z{cS-18ETe4cPAFiS6pJYB71)p6t))B#N_!Kr2=sL6KK{rEoyI~l^9S;uA@}qMYtxHSnpbb zWOjL~37-(=T}33-g=BJ$&4Mv;34c;pj+u+Fl`uI) z{xNOZvVpZQ9CKZOuch}5RhgPdMQN~3VnQ;=XSxbN?nbDaJzG)|Mfk#l=AxjH-tV_y zu`-$7!gQu9PPe*Pe-(NX>2KN`%jD*kZjJiXSjV>AK!01PX%sk)*OqM@2l~kOMb-_% zBXm;}1VU3QZ?3uW=6_9NuE59RA}JuohXxB~jNyRhV@@~yJ^ofJ5=hYyWX@5m3}=6e z+L-r}o$8`;^(5X?_7^{ap_hDz({lk|!G_AM$SyL-Q?anr)1-O8t2r2JbrNo+E{xZV ziWA{(5?*^`xWg+lt!sB-FPdYJwF7r432!|mp~*&Qay$H$nSTkFP9n3m$(9vFkxRM` zvq_(ltv}@%rldlOJpI%WC4e#-k+ss>$#?0^VdP@sb5Bq-osTHGfOQg%oJ@p6Z3ewzUWYh0%z} zRwIrJ@5yh>I)4eG&&NEmvx&=gD@;`@XaoQ^lGjU-`ka*0+ssKxm2Q%lQuExRQNDsO z=Xsn0acY)Z7ZKN&+<302D9?c;J08cJ#+Qqs@>}KA5`ez}6JX9N`i7IQ(#jfgSk(4e z8bX1$Zy-ZB7l!cLwPi;jFMygb(#T|47=@^J_VO%hnofY$srw- zC5F$-+%J(FJlK36MZ&9_f3iL;&eR9)%B?Y^CtAad=%=Jx2XNv>mn$}> zl(SG4A%6|PD#cpqj$KJwxjX1Q9NC7|aanH4jID*$P5vT*JGZ-OuD{4=RF>fbTp}1~ zx%V}$Mm5lr!TJG198hbx7eq|+j5ec4Vgf|Z^>EqGC-Y1yC zba8*D+gPUeHCDC(M71$&+M=T(nQq74KPg|{E14=w+x(SfI~wMniKKeu zl7E9UTMR>EUThBXJvtNWbc0XH0BMguh~8e~f6TSk76t5Y2?5%6yBp#=w#{x+9nNa$ zz0iByr3(HwH)w~ZA1-0~YH#1ItJrP4LG-tK<#6AN{r+7A*M)|A{O`0puF-V%q@bZ_ zX+2hR8gE=xe&mu-xRE~51>Z>6%1h!?QQ+@F~P3KN4 zk?l!vO_I4*P}}vkb8(cGDon07r#LiN=hvLZB$L8+n&s&U&K!8*4X$YPV&uR!Kc)*~ zU!x-}INe|{<`>|La-I<)EFm0ZNC$R}_rwD$FGl!qjT-Gy@1WNDj*-xv3-A(ZH5lJ? zrhCkpL?wuQmwGeCXg;GI#dDeVUVpvmn5TKzfZk<^&(>c|D)H8aoAcENZ}Jwl=@O+K zF?q0EWHx~}r-%(BlguSysS`15nl{C_W`TllIwBDiz>&*_xbI|IiKS*xR&Z0Q@s%P^ z@Nw>6;gKZLJjv==9@BU|2l>Xc;i=oLp>zn&^vS)6aR39pmb*aW5T!G^m490rGsdc# zt3_hH1(~}ow`~Zzq1g47xQV;d4R5};*NfYMC;L0y4^^{rnzg}dm^(~~ue1IJI9pNC6~}#JEtC7+ zJJ>yt%T%LB>fgq@MDe73bboa4)gccVeBCoD$|_K2y_?kGpm6H&(8`-$lb!nB9AX3s z?FVGzI@o{QJNbHV=K&{Y_Bx#W5?9-f&G&hrkB^m<;&55xhFOc0lO7H;RH`Dnsb6X6 zJw3E8w{UE}YY!8JLdB9ESQ9=$hpD@!qeZQ4_EDilpr}N7vQ5R127mUmRkM|Vo(TQ! z74OIE>(Gfq8c{XY%mcpPzvKBko^R%PJ}YxCTGU~VH?{sob|0O}%3%LgJ=`u+ya4F^ z5=n3gziKviQ43chZiQ?T+Q!DNHe*&npFP~}*32d?N{oBtV9AV91HwkfR>sGmx4})e zwT=7J=mIhzVe~tV{(sN$B0uMDT?>pzBY1V}uXW3>_WQTiRbz{RnpTul2XZUtgI(}} zW2dWfAFV_9dXz38;Uf7VWki4kWRGo$d4Qux&NNVrF=a`T*P&#jhrC=aKI%os^~A>N zBEyW9zE&|&rHw26yf zE6Q{11YVoq+;_|l3D{S{H;c?E_|11Bq{Fych>SZ?s*5FYr@wzo`E}j4O}8WA0{Klk zcW4&ZrwxA1I(`>JHrySfRcyTb&*BJk{+Vme8fO?u&zpz$jpkC#2o`v(HQ7CAnQCPX@ns#% zEOJ&7njOfWrG;il#TZLMjB9<+!uO_TR~fdY=L}%v=zm_t`)>0d-g1ldHKzW&94Ooe z!&5s~>N;hs*z!HhDzdRO5ktPKZfv2kQxKVrw?bq#>4Ph=Gnl|>yK@^lL|nJR2deb| zc7o-&$qPtw?Md8R_>|*EaX1nC|1Wf;q7qS85e$JtRuTM81#8HbH5DBZGqj#w=oU^- zG1Q2{yMHR0x-4SYc}8WhQ482lrHKVTADm@638e4`Tg?tI*XDml@|1a>VOs8Qq=iy| z(c}_bBt!=vsYjNIjZP4S^z|%OQRa-&PL>%@2z!>a!ddeYfeD0fTUzRxQy-(%9NN^z zid*tx8$&MWc5NHNOE2EC9pSdD2!E~(;Tjf%+kdbh)NcWU-xvsSIgzc?~H}dpS`L-Zt)COd>Z@&^|ZQwQ5daeDD*ejBa%gp3Ve87rUBrO< zy??y^qIMfp7x%osm+&Vi4v#8n{uYXqzL9@7NfeQVWC2m!P4c)q-aWye;pYLC)E&5} zL*fk(S~M-pO)@^0mw#7=^GbnM zVZdV@#Lm@DxBv5cou z6Kr8$-m3KFD>w;AYq5WTf##f=fPdz|b(qZ{=ks*JF;sFy@nF}UZKVEDd(17cpHj+I z#OFiLLO5hjlfs}>QD!)}K+B1unNBcm(xE6q(s<0?Q2|a8t^(vCmrbKSnv9^LV%qJM z(d3nIzZw2!r7fd~u^?9FJk8NIpmCIt7ttA`_(E33M$Ry*8-^A``*vk$zkg|HWAQ}q zcr3?^22OC31gy}F1)xqc<%)2sZI9-X!G#XOfQF6Lw{>L1Kr=#x&z|HZD&`ooxlc+% zCI_euo!+r@s>!h7M;t2-6PpkHbi|lCL-ohl7C!pSl8E@1%s1Q zX-N#=MDJ12tfa;vj929wu=sja=fc{r%%P6H%scR73kOx?B#BZ=>%mLCqZ1*o$PsK_ zQccyTT-&a$cw^VrFdn>FzO!JI@XC7eIKsTZ%vA-p@U2r3GsM$1iMqi=^>o){y=zpA zK5D@B(VvbdRKz6o(tlzJ3{I56i|u6MdTapkL0qD3QDYn3Kqn$cU%xYjm-51XXg4B; z&A=;tVK?5~Ohk+z-H?hQ>_kO~)TWc|qFOQgl&aM{Ll?BJW~&S#@B*rw8O{TR<3?-& zl&tt}R*-P@h>I*dR1&@RTi~Rm%}v;t^@q->G$g1UFXpg-pnuK#lEf*TSNHF4Myz^H zmC{K&2u`nY5a>x%V&Kdy*PvrAqJ4#vnVi%DQ&yW$1qg-fs4q*bQ(aYw8BCqiTfU&t z?I+`cF7C(YS^Kx^Y2gqlrP%Ujs#NNXi653$%wy@Zs=D_tDGxoF{U5RD!!9i%M z{)Zt}kd5Tr<$rOgLQ!QfEr3WSndPv6Q!}*TumVr_b}~qS=b~Wzme}IxQ%*C`Nlp{o~%j(YIo}=7$s;oPQBMyrIR43Y~5?9M0M0?QBee z4S+}THI*!MvmB>%W}yLYl-~OKJl*emHQ?R#8%a>U8IP8up= zUc$cJuT-`RNY z!P_gqegvfqOaxZq2159o@2$PJW*d3;?X?H*P=6y1WYlM-`gxGkQI4V6_6#f9Vq z@P9_Q)0R`w!O!k)w%g4%?KSB={P{y2N4e%{vzu%-$>z7iPj^oa@`s%aaKluqeR<`4R0-R{8f^_dv{?byv*!IeawLEHx?!bnz%!S73)Z;NQdBRpDA@v?9=Q>&`+>uO*UO)*vVSUsKQXLmY5Wyu=A>B$_$yKu)L66d-Aw=9 z#_{g{;nBv<&c^QNUm^PYr@P1W^W>`ySi1KKKGF<1lT`zy$S`;BHzkQ~_hpFp1E8k+ z4XEaQi*@}{f8~whAzd!ycM-^Oc?@e#eRs^q?K~e{F81ZdX${>dk!~Dr6oV}w4S(q} z5H3H8bUF7Cm;{AA;vhXb^={S&K=`*D?AsK>zoUEpl@#Aw1V$)KS)#!|;t@4Hz(O?v zFr;#cc|@hCP`v_&|VhC z_{K#F<9-XaGdda-rDe27N5!M-O@HhJKa_^QJ{QP0+%M80yqqabtz#v5WmK~u?lV*- zwagmXZXE4uI0%=;5n6yD0^FgCYXp(9PB-SY2Il7}?wWr{MsS&T@b~Xvl;$m~Ptv+P zTF;=ff5AQKIlM45d9AA=+?*nXw*+H7y1j+N>OsWo+ob>@@Co3BdERs(9e;RJKa8fE zzF((!HI@)j&>}99)4wJNFnXRQ#Z1OqhaAh6PFH6s8as2leGhCTDxjdksifW+qe41Y z?%TZKvum<^dwZvc5cFKwKo^{3rol4*$80nK>E1#6+yWUyksfWu}7n-27hXhQy01@s%tU3g(m4(1om~)0fI7o^7a=>c_{F_N-pGm znz+jCOyFiFU@H@_k!idA42YZ=Dk)QCCn@iUnZznOETW_SB_0now)h!pttB-WMPVmW zrfpvvj;l0eC^T~B7dtVz=aip|v6Nq=oQS}ut9zDy6&a6uFd zhrTofYd0U=R(NSVD+N~&;L9+sS4sx)?#WD=b*Z`*0yNcj@>{0T3zk9<`@_^!8MwY!8$a{U=}vc99&Y5I~_$Mfl? z`rN60CO*eLF?Vzf99gO>18k+1iD@hCPA<)IF$&RKPWtHJ0)}iumE4e}*aLEs)CWy5 zbiBz_;C~-nMC}-F{oakM*X28`dsQGM z-LjP^r5ZZ*-~9S`JK7L-a6G`quzvQhU*uhclyOA@xg7XgO2tZgT0m4`pPF{nt0ZW} zDqlsV%2%bn!5FLTr=l^QWxo=PuJnU}3w01f=YI#Af&okflB#0}DugtiSZ@fDFJ$VL zjWG2Dr&V4SVx$M{9zxX^1=HKC48z*UsJa;kcW2&ZY}F zo6cJcymk-<5ZdD(OSy#=VZ9Vq%F-&K?eQcID<(tCIymcXC|0uVE`}E)i3@vZGQ9iN zTYsgD7CO5AfZ4a+()l$5xPJXn^6PGMX89sHbx%2`dq$-~MHATXPz-H@!KV_S9qs z`W{Y9OX`MKOiRkTP)y792Wqq^?_xDNB`ofEhHI=_((2X$$xeF zeUjdeVIXj>ny6TZ`1I{h$cEt;Yx3;MWpDK%FcgI@=Qq~$6|wiaQ{i@}!o{Va*U_+h zkx17r%{TX*V9J7N8^=b8P~KTIp5|19xzS;4(6(YTzS;`Y*~JuVKlxg9{AfZsbo3r| zJcB@EMWzkA^Y?Y#hZ9E40nFht0e_DQJbB~BhT=C7-qE3S;2-#d!ziNZ3TrBuD-8AA z+uMyd!(;r!K{0;fx)?u{S|8vCW`I-@7;=aDH*$jN%!{c*t)i?(v)kzn^cW45yZlZA z5(ry(B}A^9w5L`)i(TlH=URZ_3Q>jm!#M-HIy<3oVl-S!WHFrIL5%HbB#33#(YL7 zQQ`#nj^c{SX2%|4#d90OVOa4L_TA`~8ZF7~U6C75I7e)d+90*9Ia1?&lgMqg(yHXw z==W-VA!#nVL}FbCmwzsV%cBb6!nOYZgA9&0>#EkZzVpG>hnw4#RKgp|+tG&~dh+1y zt@qx3|9z_}(ggWGYY8v&dnvq3JSV(N{ItT$#0}wPV(;)W@%->IvCmu8F1*Y_O+JU= zWu9>~n7IB`bG-gADvu-r46D$_2rnj)j~ncSXBf;SZii0dhkt(_dk1rgpFFC?novnX z1!t=4Sb;rJ7-SHE4hiIc>mJZe(`+{{pRY`e4 zlq~@|J6Rr)J>lA1F3cV<)xcto=c}_hov}${$3*aOg`z@VdV`=7Tb5P} z`$A`T^JPt%E>LWy#!hO>(Q-k&_hovJh6|!#IP|3YqQ_G=(BYU{Mr_<|fZb@WsVbv%|VE|cxV9V@G1 zvzyoD^Aa$|pX$keNzjiCW84}ZU<+JKw~f~l{25)2|0cK3tLy0*_;oNNR)HT5E^rSR zLY)0{=YK+oYvj*v_EgTE2M62T$;H)b{946BFeDbD`@bFgVw2_J0^r$xRLjEVezp){ zpkAG%aazU>Jdww5tP@LMA+)gRKci60Ife5LpzT|#hH8!JizyI|v+Se2aF6gtwCgk5M z112OMJdePHOy*ovLZ8X%GGQ5Lbnz(5V0nYtl}s|o+YY%m+$>*~LH@6%qs9*JR~zB? zOMf)sp@Q<6CTCa%La>by`~$%?U`|7wFJ|!4P=jkD+|bb@|E>G(o<(vW>pAqfHNAVr z;Mm&dfE_(WuFeSz{AkCg!3wrwR?XK&wyub=inYw#wF`80z{AfRN!4_rJ)CN>1GhPk z`|!7_HsKrJO!?(M=+D{2?8QGf{W*ie*ncVOe!aXkr~Rbt%$=ns zo2(yS%wXih?{B8&r+K~)KR-`#O@>b(2GEoSNcL+pMQ#$>nqGr52X0x;VG*C^i&oY* z2t14ybc@&KgaVmcBon+amG6Xw12q5)VVZ>l&>nw&^t1UdBN!0^q3Zd@|a z9|yfefZowH7)gYfgIa0|fH@pYOn*Qyq8>N|K1+!UXuBQ%UO z`Uw*|#64Rdp)sj1q;EzH8-}a9V76{6(%nK>gi4tF19BCgDO&>aaNx1TU|f*}m#Pqt6G|E;<5hVrCRPZj|-TQL)^Mk%YI30}%Tz^fN2MyFR zPl^Z%FBXC_!oE{OgA{@hf05v>H$_M$UKkiLE;_V0JhtHA`qG(-n09cVH=WnFJ>56v zxJQ2|V`VqaLEYz|t8(!52^HXuNK^j3aR$y;hu?hu)zR*L<=8PDxF>l-6QTrQA!-^> zdzO-^uAyqMQ8Dka=8DDGmVXCMcX-TTGcvC;sz(7|b4?Yf*PmrKub{(le0;QbaB@SQ)Hs$x$eD8}1Y=;#W>}VoHN3op$$vK?&mUSvKnQ|E*Bk9&rG^qV0+0;!<3#+N)fIs@@_@bPbDpbRO z0b_*-!avrS~2WmG@{}L|Dkke9ffK2ECM5&Ov2GUrk3&J@8G{GM?D= z;5fg6cCM4ma2PEa27flJZsWU&kjn>7Ti8&ZAWe}hgk*zTO;huhd}1LHK<)`985U&omxcvs zZlW0#cd5zQpMRS&CY%~;Xdz1K%Rw(Z zXqincYM7Wg-9y1Zb*?1fEJTAKb2gR>>Mb<(5;KV=C>}0gi{~8?Pp&F%#SN73DQ$tB zl(UF>7Vu1Da6f$_N7u`-<9o zk!7Gwt%?keEyd=LV+UdxZD}E8Z2nABvKQR_Fq9UxrlD`O#Q`*AdH>F^=V!1)BDYW% z_wzNaPk-h?U#+^TTf9FfjYq2nx32Bh_lRZ6{uQn{Oyew}e7j=%*{1F>aL|}F1X&6l zr&#HPC@g^wfT+Hi^<$T?zozMLK=Cz#3E%Z49>Z@*^1DgI$3{YD02QtTJLB2MH&?1hLF4OTmP>0DBwP>3>RtjVmR-aB2~Oh6JsQ99h)rUqOLD zexY8dQ&diCaXu^-@~Kd50bC=py0zPQT$~&Z19+((ke$$zF#`0wna;>;&*&>sPLIoO zF_~OKRxXx26pIXa^K%`7LUj-%s$fBVHwh4wIWjl9pH~VWoh`K?>M_JSo>P=_BBZ*! ztbgO(?XS}ra2!|>(c7qLVX@;O6539@hP%f`PzvjO|1E~a1=9&!>1>u67Z@{69-HWf z!yw@;ah5&*zx_vqIg;1M9jd80=N+`G;++!osu)#lnj|B|#cFNACjZ>DKi%YeqiNGiPi!qu)q3!;2d}%I1uj`|g6*Fb)bP8rBegQald< z?`#Mf{kx@* z%wAgc1Pj*O340JC$<*HE_2{a&Q5jpqoN36oOmb0I?bl$c`_yPIEhuYURmUsw z;w9sJP@0ScH%-K;KMU7%idll(I+I9JAa$9 z(7b6gj8y+pQig2g{C`g$G9{NT)4m2G+fOo-V@^3MnjGm`nt}W+SGVv#`BrFL`lI-+ zCftr1aZ;ZQyd4>ZlJ2N(ox;jnCsnC$Ay+AICzVyWlTe|=nOj273C8rET^ou{_P#jS z|L&`UW16v)mG&P$6}aO|k(bH;X!O^FV}IlqJ+}O-MSYi@HX3!X zkCr>Z_Ir_>vDuGz;O|lo_Ap>Nng~j8Yy^utIE5L-5$U~FR385cVKw_;w?~H=jzHBV ztw<%|UaM?=<{j-wo^Ae!kGP7jJ!f3wYj8>4wAwuFNyQd=oP6YG<1%qv{5V*)3z*Gj zU^)1oyDuIdAAiKh2Pg2hi`EvkORmeM_ssTCifW29n1DL-hBBaPDipKD9rA8|-^YvA z58JeS9<3MMe>EqnG8j!}_qiWtTWoq6Ig8j)#x9cnEouiG1KH*~*Io zXf@;-uQDnmPB=r$k+A92=~TJr_o)E|{i`x)WoSM#1b>VEOr|7(Ej1`Ys**|pTm=1} zkRo(V7LpD)fj#==56LI{|QRa6&=`NBcN+|37uG-mBdZS>Y%53wk+b+N65 zMK3GQM@Jp2L`MtPDQjJ>UKL9orGa&E550T4$KTxl~IO&ct(b zy)yQlXkvch_h{GOu$CxzE9LOb0DoOjZCpyWFgiywUU!)M=@SU6DOlA(uodEZc13?_ zuw#?~|^UaFcY3pOdsdnUV!C*r7Hy*$%`FIdRo zREd}iInl2r=>E4duJM2!ChBS|^y}H^*SFGFw%`t=`OIi>S@*aYbXX*PmVX7NfAD+2 zg2>60cq=-hdG=huADAqQ9nt-0>>ZxE1N zcraK;P+0lgy~p>8ihoF`<2N_YN6|)Iy2ilOY}~4{s`>3SdyePO_sVs=*plOWy(x$8 zpp8f5mP@1Hp#bwou)TwEsP44h^buoIYYqpdz4dkWhUdOf&3ZO-hf@vFsEW~YSw~5G z)=o*&SmWP%j&h9dKw(6FwR(r!rH|B8_-|8w3TfuFF@8dd$|9MxODy@ij!Kq92^(K@K z5dixy1cZ(<1?X&z_D|37+KY$-UofOyjA7(d+Pp4;;L(lsN}=%dNE>cr38<$cK9yTI zZ@h{nxXRb!NH_Rb(d}WrmnFs#VXX_~k`o4~o~?FvtAFZ;9C)+MrKv?zU73a<>AiU% z)_>y6X6;od{?A{Vb!&Ei&tJ8=JY?O_!M-v7}5?>`+h#Ps*Jp- zO;9CH3xAx-l^^z_-`r}+_W|^{4|V(ea)Ak!^PfCvF!X`%HEJC~<$VKxS-~IF=e7_} z(EHA7?fpSJ=d{)N4CA;_9hH$wp-1gs@Qd#Qs74(?t5OumoS6=V{>kdVQu|ZA`KdDzF)3zhvyzw52ljO%$lLEHpS{4g;Y6Brq;gj){8+w zP;P~_JJ@CU=9i?lJAmX|5N7{NOD@YHTt(MWs6z7q@onx!()xmSR;b3Bj;V0ESkyy%l=4 z3B#}wHJ1lbxK&BA=7z}(p-57-6;{42sy5#V7xhQS+oper|A7GTkcZ^_Jib~`QWG2; z=ha7fh{?#F1JCsrVC#o_n+&s{U~(BJJAXD1{E3@v{NsPNc6LwCc1ELvr(fM*@OiV~ zIMg=O|G?x{LI5r0!?|%9+A`8io@jmwWK3r92Le^fDo}!hd?@gHW*-JdJgy>tIq>b} zWjwc8EGT;(G!@xQ{9a=F45vIj2cb>_-$C!O7*p$vsrxwNBzueyxtQrp`+3RCo_}R7 zARKV|CnwSP>1+sh8L@?$$CLOENPVEYa5Lg#Rye3k$RKxV(7bI-mIE0UCiI#zgI<{k z14HBF?>v6InWMU@)Fa1$$p6bVr>2blz~q19+g<`Q9v4}Z09$}a((5@S2E4w4 z54f7BQ{+6|zE1eB7y0Ck(kfbLA$jFR!Vsv%m%87X#8$lUD0gKt<9~dX)=5?x;(U=%Ek3`-6e(s2KUrNt7)eI`Y(~s011FJ> zv_pNB76CM0$=zJn^k3cf>r37Gl|gk^>HFI#!89~nm8Clp_D?F}<}Ton@=J8CYJUoA zhWpkHVCNUMl;QDz2nh<%u-e$yzhiP37&F8B_mi~wjrm%kM* z0n7B07=#O~Q3ln*o*@llQ`fPX!7So7thZEJgwVy&j5<+EQ-%wjJN+DBL48+r!pZWa zO9-k&pCxil3rHPKU^E7;_a%R~Pn3XvMl-8FqMW;o{rMpkRHX}u7PN!Kr1TPYj2yR* zdof`Oy}W`*#BrYSBR)?qp2KJC0K!L2(#zzW_kXW9M%Z2Dcof?3!g=8iV|I`-sY zbBbLPF}s2u+g?t5?GMWxxD$5v2Msu{mwI!V>j_w6!$5BI-%))|qxF^|$rUfyh( ztX#~*gCB4#y!_Q>G8=#6aU5jlwMmI<GVlb zB2BXxv4QV%6zwQmFdwGPltx&|jPg*uZb4S0)IrwB32zH02(9Ya;q}me>X=9R2<9LJ z4r8N_rzs{@A_W~R0pj2y&53J^d?TK)-`V3u3bhm2DIFGu`2T;c)1A>5_KSw`@8XVW zC&3R2lngXKz{aul!_im!3bN>0V=8=W1S0pUVQV52Ls6etUYJU6 z_d}&W;SN}4OhUKIPsj4{k;Tywq{CY}s~mXO{dl zkL1Uq0Jj%s25f($ip1>EQZ--Hd2QA27P z*QH_L(M@Dq&kTpM$gnY#wN@e+ZcmDd5}FQWWR9(PuJ4QZ+(7w(Ef*j z4`~xbe8YD_hL-J6sD+Z%+mm$Fu#E}(4coRvnQnjVN|v66^R_v1)>G2H6D7NO9~5-_ z%`l&f;^$`fO2nkihKVSt%`yPb#+|iGHESNj3#V+s_na|VJdz8zW%bM>gWTO^z>lNs zjq5zdSZ!l!LFE>HxI9l&ThH{S6`T3I%EMZAG+B3N$MH08?<$|In>YT}w|m6*b~LNX z4SIj)9Ba`{J-jkWX(239&m3o9E2pdRcit?n@luLnCJRq)RM299mnuU(lCGdssFN%u zCkN~R+!9URwtavlgcwn@A{lSUdn){E_pr*m{=Q`WUFzA(2-9#Y%r$>879~8Hm^EgW< zHr#EJp>_sDn}X;Xf)0j`3kWh!>3UUMp%8$Zld~ZkKoKv%QjgMX7dN)Qz`h0hK%{@B z9%*MkSZ^-ri@K49{80JgrC3AzYA;0!T(EOs3a7-ZxPtpLdVWPA3!o4%{u>T&%?^sN zKb-Dc|HKvC5^d#2uf+eoSEA*E4LT)i&nB9;cwBKfvyTyVHMqv9zI`IkFkGq@lf?MFrC{59FM3ed~(5Qk+Ling49h23d`nM`6{jGdX}!;d(rXen$9cK za}5ta`kX%coOa`L%Iu_FP8Gw?s+a0G8C&<3d3+uxe=zd{uS_Gr#ar*>zPW$aqTl%i zmSj^q1S7%-sJ!@9i9ix{6)ljz&kS}!n9b)bU2BjzCaD)7577h;x)8?2)yw@?P#xz3 zEV{IDpm?`WuP7)kR3mdgIhJ1FlC^*?9xN}2D5z9uG4yAQf(f@uWPscCskO}Y=u-RW zQv2vq+cWD1|AWJRWZJx3&+0{}}vrE`;p zm(SEQJfYyO24rUf<572DBHVL81DMjW23lb-oD}46JVLqaO?L7b=g)tjPS_DxQ82^{ zSfFbhI5kk9ru2{HN1<Q<7ZKp^Ipk9??->*=;HFG({XN=OMbDZ z6Fc1@Y~qHL=zSt}&0D?vh8IHDpbEE}!Um{69a!h#Xrgazk_&a!aggmyV4nIanhSTT zyL>yB60)7iH0R-&o2DOWb(~I~gPrgS6mSVM%DEr)S7!<|M5I9 zl{#N)uu*p=FvsPxmG(@)^2W&3pw&h~dbC7tVP)Dg47z_oXHL*^;cq*7fGm_7LnT3j z(m$X>KCRrm4lGPvV;zayRa2$*oTDYQ#+npx3E-3Ww;ia;7p*CWPu++1^mJqYSH59WA#@p2RRTdL((B%={Xsx$YTr=myt#r?^5(VnyCHSf54BRnJ{Io^lOlQH46*3r*m)0rb%&;c+fK;tp6#bLw?(WzGu68r5vE><0tR;s5P z`+0(SegpwQfegE+pxB{`#%|KZB=iJa`(8^m?%$7c>Bq?oIw?Cwmh}(N-EzwYkI{rE zznp(7tdk+<>2fAX1XY_+E%R_qj}cDz;sgD${YJ5wPfkuH+p4o)lB4=>Q{W*6$Bw`Ibf~x3joov z1A)3bvS737#9~{2VmrCl`t(Xi5gcvPNrZn0Am@vFPYI=Nu%3xncg2yoWatM6s70re z5VhLU8_>bZnsI$z^Unyahe5ossc}4|ad@g955yV5#uUGkdTvg}-d+i8#@<|$guxNTes17dbIeVf$55YM$$Fr+DIUP5DBK&*0UNLPPR zlk>dnc33q0YaqX$V~@VV=j(dXXQP6s`;|7SZ~2@0??i3H@pP><(uNLvijH06PXw-A z1Oabaj-J6N`8@`JfcrCUQt0~(VEu8tuulr<~ ztF&TiM^-66t&y_e$2C};T9LTl)I|B|jB$YP>Y_v)#QF?aXa#+c1Mx6zEDIfMMm z6-S7BWo1a?A{?Xa_FgFA{3nIioDp&YtY6U-qFMvcfxZFyV?!MYDfEwEQKG z!Q+o1u$2J{A>UEj80Cabt|Pm=5p)u=~Greg~t7LKXc>;%c<_Q;D^ z5^?jEfmX1c!=w(JH6H6;^&21jzggHDE=FHH#$gwBh^jgj&b}dnRKp(u zZtn`(o27c^cbT?3bbvQzgD!vY#Q?+I;En0Rmpa4|-k7^^g*Rr?&hW-`?hfy8c(6-+ zHxn7)6mQHOxy2V9YfGZ6{p!r;);dV{_3#O`!Zv=#)O5Y~1cR{Wgwb6A%q*E`uVmjY zxVJxo!`1i9;{I7%@bHZbs$8F-cFLM}P8oIU7(-i>QRVaTu88_F!t<+W^ zEo5m8f+29+BXiV(>(I{XbQX`B5iEK8Hb#-PEq4|o)(sF#V9k-hfcN<@+=U&(a`%0| zNFpTLhGKFE{~4S)CNY*mz5Q?C#ldK}7f0jV2b0WUwiv&bDxaMp8)|=Frg9PNMXM=QIGmi#*#9XiPoawTU@<-n+}e2uf>q6x$Tan=7WJfa`s z8pLKB)?og#A}SM!YF<%(I8f=X(j;`Yx4*Lod!sT7dFA!SpOl1AT$SN z;1kSZ4*V34$-?3EGLGp9o#=Z0i!7wDoj)>-(76+jl4J^y)+W!Xy%eGcC>xOKFro+G zZ0Z66utmbtYH197GQ`J`Abr6CNO~)t1aE-s9`%QlG#mm+AaDGTmoi_pmmNwOrMVse(DrYhYWg zul4o(OJrLTEI8*&r$Io6Av2=D>FX`%+cdZbvEvh}>h^z7Hhx);?ZVatM61&Q%jY)W z$Q2n}*vMWRP85BCa90xm%?lqqrT?E|Y#)1Xx6KuauP5=vf`TA9+h9+rEB|XYpd}N; z2l>yvXb~C36Q^aK5WrgYFh(`-kDXc-NMWgX_~6sYb@pq&swsK1hXD<2K!uzEdk$hl z5JwVmv8sQAWHzQ?hn02Awu~gXSgip$APMrlQ3+@2L|>0DkL%0uK297mvJRta2M+T5 zz|h_Ksv4T^*D-E~-s0`IUiRBd7d$U{%`9Z-&B}DY=_u0d!xa#GJ`58N+D@=+jz2PQ z`n-R3rjC-z1mGVxWjg&i!oyj4hi^G4w)U2_FYSNrobJeaX{4F5KRFA{7nr>Q%#};T zc1%URP+?q1N1t{UN_FOwr|M8{EY`ObMim3Nj>26%R2)^V{TN8~e;-Jd7~%FKsk(6q zg&xAZz>R^fAO_h;L074jCbyHFx1xvuUrI&V6bgLrk^` zF-hzEY;<_^#s1mp&dJmL(@|K&Nvi3EoUCrLRRl^Bs3HUX7?V;8i=W{6$p*fti|307 ze$Aby-R@1&fD>*Z6CsJC3Eb!;=PZJSr}KZA+gV^+V^DmP-0qzX=t?4Qk>z(q49QxO z1c#KYu3R5svaU{>fRlFb^RpX{B-D+3tBP_Xg{_>hutsC%LXPzWG%Vkaah{^K1a zbQ@KBcuBE7i}U9V`gghXT|H5^7aUSFsfK`v0tdC=3}S2JhsMB-3`F%>_4+E|nqGf( z5`8h$*UE?BzC+xxilB*M$?&=fnrQjrzWaV4j&0qqR!A-9RyZVWmU7F{d;wtowZDyj zU|C4 zgFNO;KFtG7MZ3}N9({RqGPIc7RAc#c9>=q`SYBeK&e0@PYVbU=s#8lmZKdw%NzK+_ zdIH;S>v@MtoudhD*5UXq+%Ls#al}g96O&p6JiAGU{?N9B^eSXWF!kx^u-kuc$-MH4I@6fZ%@zQD^ zobAPYw(8USUfDo#$+>s3WS%C*Cbgho1^OsZhr zm!eXj@+qclBU2_E)&{1J0VvI@%luik%^T)j`0s~L5Y~%rKHB|kfA4?Um-{DHs*is6y(<;xtbKWVMS24!=t0oK3Sc;MlLa!(=78V4_JUA z7jlXt$!0oKmfc;t?%aR1oJ+3uSWZ^;ll|kPlfs^xtC;+mJ}5ixCs7t}kZuBTiH_b9fisfO<9igEf)+G%QRU`Vk{7`%SbZ6QM0t$6FfN|1?UR+jkE-+ z!jWYyMRABQ4$HpOEHkVE`*F+prsuoBSkWWqPwkcf@P36xg z@*8iwdq2&3!kB+VyF94V!shseTO#m#>AQp;xUJhpdNLzU8)^ywaV=E5rLIcpyN<+Z zjTBqfh+#ha+J)FV&xYW|x0}Ls8q$Jm9N8PEt#kgaMNk1wP2o-4ha4F+xB6`z9>5lS z^wmdf2F#X=A~l9eiKHOtc&U(LI4Sb+l_yIY;5f}}IZl6^1LHP%BeUV${~`a!8FKu= z9w2t`>4DXABD-LK*6gWb&TT)M+0}?Vp697>afA5f|FUQx#T9tU8dsfySX zZ*2zB7DPzT!G8oxW(TiO*zxqe@(-)k`iGeuBW~s+=c3KfMjv9;`D8>Q=iS)qNLv$Ho8hI0Q8KeJ(m4PNgorZr8cEViMLT&446>8&MMQ0fy2=mC@ ztY@(GEF*40M)LR?DgZT-reoV+%K%bOVqsXkXW=^Hi*nj5fH#EO<8nQ(uA0%f`Fc6H z`Jw~3@i3a+gl$J^yzLS{1kHQp`09w3Mpshbhr`D+`H9{s&*s&tnRXBV8rnN8>X?X9 zbzgse;p9pzd0N}z%RTEL%!$0P@YIlSv&|3n_0@tN%dgP!?Zp7DVDa9kb+zO>JxY_A zX>YHuni;C-eXHoFJs;E~STU^6B}^Snk_O#*t}5?9Jx7}mTZgQCWK$CdxP^gYXCI+1 zl;Q-WvA9%9CWph7Hh-YS7RG`6kQTKVm|%Zzj>VeNmELt}<|_7A-S!Uxf1>Ihw-TFKdUj`L5gQdbxxF zXsgWHUxW|u73rI`QmdLg7U{Z5okb{LQsr$K=y z;?(r`TmR!bmFOXPB+U?pT@{*biE|=1`~)~l)HPbR=nBF=g@)YE(PV^f43dBF7$krm zUX#HN%A(xb`Q%A-?wB1(X`0Jh%1PrEJ6fhP>J{(U4~`yvMskLC>l@5buzmL#j&t0! zja{H(6;mdA6Ct=-417eNb@dbo07s1YjmY11b=p?N@rf->6-jlA`}?tDc1|MbT<;ns z{Ko8N`89jWe~>5KNu5E|Ub27ulosnT6A!FgSX}!l57)~LMhl*wvEfZtUOzay=VSx2 zrbHzCOB_&0ej@+5u-(7g98VvNd}$&gMPAvsF3&sa5kh&2VJ+ zT6Z{ZV#hc*=$bP0SV+e7V0iHQ2STE{oYd%-C&5l^oYYuv>aR6(Z@zy%>j*f6G~B5z zIM8dZ()IvzYLpxcgFqmr;eqB!N5!UkcwZe5=Wr3_MfEH4B4ukov~=MP$tz24B`#*X zvy#mi=Aq3DEgHWpi{a5Bs7h(=&&*J%FPzw#p3+uD@-%Mz&`a`n<-wtm_;dI5A50*n&Hw=N5nBacnZ|=!sKG=g0g;;UJ{;{C>w{nN?@qIE!XfqHYAs%{9=hc$k z^vtNk+5v}4uu6ZER4~qZ&#}+56uiI)DZkXKpMokSUY<~uwwwb|iG!XKyQZVQ0TP45gc4)(2a zFBCe24o5;_>uS`dhb~0IE(PP1$1GqV^@}H;KR*2YW8?RTk-QAANlS|o$g`RU(IASRb?T?m z*KF8xEXAQPuIpdQ5(JZ{9}5lm3(&hPh2K;(3E@))8@ns(2r`prpjyfkxvJRg`;@Z_ zrVi$aYRP|!Dn651QpBzE(h6}p*OmHyQ!B@!#Rg2iSXDJR4Bc?dBF>X#Uu65_nJ+Xk zW*)@zq9{SB1R%I*)75c`XM`W*iT4pkOVacSXwYkH>S9$=Osc1IKL5bu+FC%Hs5l&C zrLG%jNTb{=feUGH{>Pl)c ze~JbOQ4t$2J1w%9hxc1r_IUzR`qw#Xj8>;`2Uc(=7DTYy(NSY5&;hm z7grL-LCV;$3|z*>oj6)v))F~FudEy`=>XViU4K-$LLTv1&3uU4&#VP03RMLM=cU#D3VEvQH#Zx z_D@eUG1%Rr5rv1{Zk@oIxnhmLVTFez({?d`GggQ(bR=*OjgI5i2JBrPF&G+_e>k+* z1y5zH3Hd}MU=NFiqt=34N@S2=)Ebc6?&)bp%Uj6)=h}D9?tF44?}_%h@ppftKt!QN z%(W4$&(I_u1iL4MI7&_jQz@h=TF~@B3TjHHVCYHMP0~me^nN0Tso+G44pjY&%-DHT ztHA>JU-B*)J-H@afLx*%U9vnJY)rUh7`eV_)N{OAFVBohJ&ohQ>E!|>1A1QJ-#ym~ zFuCVW0T<_2nnRZ>{G09`a#?>4rAWCDT#aTrN0~>Ez(P?juYHM3x)7PnJs`1)wT%b4 zdF=&I6_!9T3?Qrrr8`2e;>gi*4)p!GEaEr+1UfmWJASRM{zaM)z$oJX!OT*cJ!z6z zgd@!CPq@-fgaWB6I_*RHO8ghy$925`*N!uHd41Eoh&pS0yF^_i$Vq=E?LaijAwiIf zE`nfc&ka9`n}B{O#w~}(w_a(m2X<&PrO0=kVN?imx&YOSQ~OI}B@?2CUP_;PS2=8CaMA0Hfj z3I6`lYQL&0cw22(v5t|G$X*Tc13NvV4sh(|D~ZfdEki2j;Y;4P5&@sow|Meh;snGa83#Ksa?6a`DR&RU32irMSTj9vl-!4p z-X)L2m)tjbxRsF<+KxH{lu4puNuwL{I1)mUCjm0<_Vj;?1XE!kf`cM#gVBr~!-!&( zGHTi2wy_!$7k_CK|CsuFI!{w}5X7H2LT`R#tQgr>`v(GTY%r;44|{HfcC5@P^OC6$ zMVB#YZIh;*!1AoEsI{l>4aK;r7PJAkXN7ABM90i5qQo=R0^n8`m4-k;5`E6%K^1g! zA+05E)!=`9w2SL2ocABYV1MLudhePsWW*KqR{Bw2_`8*ub!)F%`ZjN^?izDF0*g6+ zSzY2i2zFO+$(&z5I z`2-Cd);G7WV0$BXx8(f`f!PFCSiA5&q$je$3ZH+ZmxrQxEE{`|SDr$**j@wkT;WA; zu0k5v3U_b0`V-OyF1IFRN+SoVEZg;mtMs!l1uECOxMqL zcV~Y(9F1jz@vlmVJ#oXqYUuU&%lYaIUOhs3UtK}}k*4Y9kQ|~X@TcclsZQW7sV|wF zY}POYXjvJP`MNZ|1|nm1_;?gg-yef)Ba=`8fX?vFa0@2cJ&QP(s$W2vRK{!Wjlt!x zuu%jLo6Z2aS6^+<{$72x$kW=zoYh0y!=`@)7ir~?Ikn!)gSg?{iQS-ukP;YSRt_@W z9eX$Ucwh;Xd~Oa_cxJwXoG>$Q)IO=Nc7zZ>N}&T;5i(!H?q@;KPAU^GLE`f1 zw#H(WHr8$c)F)absGZsO42IylR~waBV=Zdi1l!9Cv)8_>)^J2Ad8Vqigq+sPk{*8+ z+soyXW}UEU+5lEL!H4{k{2Ay^$xt8)B)NI?U>@UxU{9;1i42m2cFg$-4-*mqHTV~< zXrg&x)D|3QyI?h6N(Qbfe<^E4zCGMh2jPbe<|K?|!|q9l zC#JedvaN6ylUYeTiFWxWxKlsl*FJx|Sc>ySl_&OZcE$e^)a(IIfc!C~D(;o;&_cpP zoJXe50e4!-W&)Cp<46t#S1v3^#sTGUk7vWqwFaskap_}*oW-Qh{WICrx&IlJwFo4vtaLuMRBtU6a0j^E<4Iz5AkEVN~q-rFc%h42%;` zF4NR=dRzn_(caJxfHU#nICLI{i$c>-(+&tn%;WCSA8+gd&0Zp+ao)`N_;rxpK7e^k zW%oz?!@!F-I9#x8LjAEBF%ExD$A{54O*Vu^EF2HsJ^drE6EL0qjuULx z^?OQ2=U$ag7W|Bij~;mo#u-ikAZv*Z>L1pc))x|5Zm)>pEEfLtZv;X<5RfNH2!|oY zHQ8k5OO{lfliXb1stF+>_iIi9CRmul*V%8`=tL+%ysZp$Y;D1at22KNNdT}V>DGR- z#AnT9J4f|sFDLjUM+JRM5P*wDg`a{e-1Kt|WvQ%MF2p5bQLZZRP+=Y^S$MP@9wRUB z3ZWl%+xS;YcBxY25sIJ?6Q5r=IJ)NA@X1df1Q$shT@qkmY>7M<4|?(2w_aS%`8oRL z9s=Yy?TD%jL>AQPS$Tg`^8?_T4wIJ0!aZXy0>;@Zc0M;beknIA0Y-I5INUfav(?jU z7T*^&I_v{30j7p`HcfRNici^BNm|kWr>F3LDW}NjL%^?wj{sn zUE_fzJ%k90itpJuhEePtM}P5Tur--p*c`rkQLoytwsTOzE-Q*$Sgo)9D#jr-81gK$xF_crDx)VEStKQE1qvvH+{kuMv>J z0pCi4Q|xnUkmlL-5@SQIO7-z3+>GmPMv5;^q&V3RCP1gsWuLo8g&C#qT-@l0r7}0xaBNpSe_u zHa9SzVAWc$>F{vYx;>VSgxlp)n~u+>04NycrVIu~7i{*(#MK_EBOC$E!DHLrG;(-p zNdNX8Z+?Fy{A`M_I?uGQB?3?Vs^QSJ(iIjjj0=2P$=MMsqCM-!OE10T9$iC!R}DON za8+IYus#4?eN|sM+&uyymg%6QUBU+asRWlcfw8fFs`ZP4Z$e^oVifB77|4YnR^Va! z$&<%lefH!_g4U)7HS!+V;-awwsCsn*hWLT=lM;Vof?-1zng(+{{o>1`gD1zw4!%!H zn1?X+wnQ?+N6neMbXf0GrY`=;fxVqGk-ag4AN)7e4c_qgN;uUj`Tpw6@p#Ja4a&2O zmclf~vL;1wtyx(h?(sV25=@uRWHTVHWuo>9P*hEuLQ&d`%^Wu1^DBYsPjXSR;CivH zP+NZqFkr;uhFGTvsDTq++Qn}?)7CFxC9M#0gQm)$Yl9HF?EEEF zSJE}{ANcA%_Iq99^df5FC_{((ua0A8dvo8wGzK^MHd8iOe}(V-^719_lQ@^d!ftYa=u%l0Kj{u$fCLra^N1x zh4C1eDAH#`3sDRzDYdS-zAP031jDlZG>R~q|3xUBp5`G%0^%-oA^^EqQQ=&q?n0_j zSe>3`;^lYqcOlo)`A?<3vojZvn=zD9`54}XcH5zNdYX+SZF}!DISE4cT%gh!bAf-# z-EE4FL+tc47d1Es0rSmWNX8IyG2_zNc-@6$;}APN9Y9Tdi&Q;?*?@W}BjJvJphqf} z=u9cPEbKi|S-Y5@m#kD5!z0t9Hx`ide<7ttZn=r!qYg0unqvcT@+NQRbvBA&WnqgSK{Pt*JY=7j}W4Wfk zw8?bfL8F9Y!mF882)A)nK&u@r|GN+??7!{NEqt;(n#{6Th*0o5!I(PXqj-Ol&%Maf z)7|JIgWWz$GIBg8XvyfcyZ)G6nxD8()mGCDa%U3TDTY&cY9_PhVRzII+UB8iwP0d> zu2}}~1UDBD%!_quSw&Mk&=`FuI+r+tuwavK>T7bCsFpuhFwDks@g9wU)@yw)EOaS*CCuI>bGMARoKIW|6q)Qdx6WavnPR)H-e#QfcXos@s)C4sz&@2Uts zopW5RV4=S0HQ&>L(M{RRdMg4YZ0WYW!>A>DoNendbi637UIBc@2<`jxn)7*6b_3mr ztsE{nmHHSt=esND6fl3TctX=?h{Lm2BFGckWU!vGjG`1`8M%}N0)-v*W1i#QQ(^n) zY!fmo@&tbcA@`6z*f!1@kz_=i-XMK@>Tn(PFFwTNGQy>YjbwY|gjG#OvWKcY{oV)4 zq?yUYc*gmPqCyw%o;W&<7Tk`^9M5l%vP9eLAUBD4XFb84=Kp`*rDTp>M(!0Hb|vud zE3_EF-CCCS6f`ZjrT>M3p9#ktJs|vryD16GK5KM|>+5mqvQ0rL0cUN*enqGp6C4xQa-1p3+tlk`TQ-%>zG)gL@@IL3XMNdzC z&eWFM+e}fs0^pv~#vqDS%37IfX`%=jvZT8f?>BrxcPB2%`|^wD=tv#o;2_Hn0~o<- zM>GA@wcDzS2o8S7Q5?)hM}Grxde$+j2WWqG=ptkZ5t*fQJbToygNOsgm!p=K_cff@ zj(C5Z)S^!Lu?;oU-4a_=mw4};h^~djxsua7A^J4-WSO~lUyn2yA@Z;|hJ?|i48`fa z6L6EoRe=d}JM{nU_55&@hIM_rfo^|; zQCC*(*qfJXlFL|JN9?EjcLPRV3=eqbmO00Y2xSa}O$_VMh(#dHi0G4}9KXgA^1VsV zDq+oLOq&hQyTomPckEke_DV=N+R z&B9*eVKgx!`-upgHGCE07^6=!&KWOh+)ztRUw!NI7CUJ3bc=lTz1}kJ_QNiolkpYs zDI9%w%#g^u${shiCx(`;NXCEvw>zlNT5?lE$;($b_TnPL9g&i4m(uuK@Db=!A2LIl zh}p@Y#bTkrpJH3~<$tFf-@94D=yBVJBd7UrcXTCjN{WL@>j8tGF}{yyjY))RT8 zw7Zx2o6Wp>ULVzzFIK@a*f_~+ysh9!tP|yF%WqhQi_E$_wp-5U8)<)(vJn|7mW|6M z9%kPEhpMSLFW~KN&otg-x=TfL8zsh=kFpl&Ax%_xBj%2@I)miTF}VG8l5QJ&^129(LL*Fs2YnfS+{rF9D zS=PCJk)|v21LWQeYw&*qWZD7WnP@x>Wn$frS>y|(c3(^Z%`KSFk&riK+EgrPu5CXu zeAJZuFxSMK9dC4xQudVK_BKpp?#YbRMv@vow}Cpeut5}U-|AvmZlbWLb1O@ijV#8DSUs^hu6l6g__hx+pK^7+)2H(fRcX zcOqBn$ZW!Pi#rUuabRS6=d-YZ4Cy5u32JR~tK3%?&zNZl&+?*{G`Hw&;KFZ%>fc!} ztuBDhu)33@$4BqEqqF9`#%ILdXS!mL2Mt=thk`QZLOJnJ$tRi^tUsS;OLIiz3&CS* zAUIWDrIVn%%Flm3TWSmF+Yruos>E8FyL|(UN=OQhF(IddH@@utQ3XvHcNn*>V>;qz zHZ2F7eYjLIc4sElH~Vu%2fCUo@c>!^f9DSWC5|MKRr; z!ksWvi>%P1Di;Kb)=`g&1n+KsPSmJJA9JcZkS9xLK@ix6V{@IA5(OXDvn9N018=cR zjAq1ld*nnGmaix&s^|V3^<$#-ot47W~Up(7a8&FtDtv}!BM;`x zuL=(Uf;xX6eR=r##{#fV3~)}Y>d5ZEma+Jn=r4!MMfvN@hdQhHsg$Q@)l!1XYsocP zo#k`9=GM0OIH9}|D${LD=ZTl5lsF2AVhow+PyJ4$m=kt?n4}Z_UX;UQ@M%~;gCTkj+vK@MexdJ7LB;*mLwX9o2SqgPaCJ`Bk%Bx zKtg~0O)@D&Ww$2LSoDlTOo~X9JBmtVm>GcvAwiWgsYGSBrqWpS4jV-5&3b+yX~Pa43Bz89p9KB8!;S z+zc+`O!ZD2pql^D)lyw_R zeNGMMcj^gV+U(1~n-RTKsJor4mvoNPN*Jm-W5_coKQo~#)px<#rPMXQa}mFITs42s z=Ie8?iXRr>As@ck15oEdGyV2iZ7uxxtRQjF{cqj6XO$sKFqJI1I8t z)da6=zUV%#>ji{XJbN*S%bmEkmL7i(|J-uPLjr|%JuHaGsNqV_Qr03fhb7cG?{iRe zUUGvkx)XV-6C)kTx+3#4f1u<+h^c$WPnLhyn9T7hB}OrGNZLhqCv(L^L-aO|kW$`W zRbX=e0}1eY7CyiU}vg}qZ~+z~hz zc$!5~s}Euzz`@AA$NB~?1pA-wvCZnnCq#HLC;ADy*XIs6g?k>0+?`PY5;L~JZWSJE zPxL0*07JJDc;j9C7FfT@jfa1#-p$1XwIOA+t|zEeH94eZ4-8ud5B zDKO00=I-8LZ)X55*G|EH9k{`<={!k7i|!-|&Q@Bb<5iD{-^pX!1>?hDKy1nY;_52d z1u+Go5m^813Wbp(aLWk=zs}1!Ch5%-*=@6ZUHdzVI(;xeC)|0b!8Q+ub-Z_Ucs#H% zLlmMgdQ+-xG~YLB8#sS&vvV@nF@dearf8&oTl8BSV`wqtjoBiV(?4=8yn*TbZSS(B z31oP>G1lj4oXu%>Z8=f$8UyD_{cbjg1YY5ixHgT}YVyB4jR;UtTyS6#JiKBAUVPtf zLX#jiL4h%L=p^_`?L^PJ8l1@FG~onEM5gDX4K-fjBzdtRKf`}V#GyO1@aaa}bFH?x z$m@+6nAQxRZKzmbst8Nhrp&UzuBkOzJN4#w;9(6Ct&=pJM*leB;;YYbAh2 zFB~~pX4NnNguH(RbAS)S*doi1n@ zmv4C2+)giX@w}muvzoi+HrMcn4WYTjDgdDcF>ne-2T75_${?u_wmPQfvav+mhAh^h zFMX7gORACB{~SMRty2%*?S~c6beh&Fr?0YFvLO0lZKar_cq|oJoh!*R$dC z9F%${3_r|D!`#B4Ks*}Fii@q(ngLdGk667 z?Ozm=tMh+ib^(@K!Q=@6&++w6jt7P3!-;yIlU+>F;>b;oi2?9sJLq9!-~sHrK4}09 zPC+bVR!ov-#h>JDFBu8|o?EiKB*7Uu*SH68v|EMR^DbA$lL2;aCQ_ztnvsa2*j#y< zK5y<08by$W3Cy4w84b?`FmfH9j2T9JIm?w6UpKE;k&rFxW#N?Q&k55 zJ~Y~L{3p<}sX5CiNIjr=awQQ3$QR}K(X(RY#zpZ1FnC}&cays+;y1a|g97=3A$EPk zp){qGUna;uufUg^EP)j3g!ETZ$U>c>cixu@v5jkc$;QRP7}#^#t*hlEt#4Pm#a34z zf-ZlYI@eQ#rUB{7`k(j|s}(BR9Xfl>M-fBI~` zEi5Rb%>|X+?vyXxrpUrlWn`#|ojir)bE(hgI42a= z@l&Y?bl{1bFcp^{#WvVfR2pb{92Sz?vpfR>_vZM{$v~gX&kHZ2^Jo1XfA@yW)V8N~ z*{X)|rW?a0>u{+Xo9RS6j%Jsa6cbw|L4=_$4eEFugD{UmATLA#9s~ItQay`-q>X=| z+(wT|DO$*s-6iTMH1*n>9>kTuXwsSzE9foMXhmknlvxeqR@)T=!sx$(B78s=V0zlP z-Y`%nE-JQr=z?%yR=fDwe(3BFNPU_V4*~4udNZZKY8#O#+$St0=mmQaL|F^r;g%{_ zAImFpp&qxf(QDmdRgX6c+hZ`QK(v4CB=5d$dT0^>JIVI@T&PCtHG6;{hORl(FCrqj zj>G|f7l7#2Vv6X*e+1m=uG}_Oj5J=etS}WeYylXuH1vqo{uZGPNO$TBIgWJdWN3z> zs&Bio+f&F*xQD#tx9|efZ9d%miPswl_&Cx?gg1SAXeMjp6c4RtR{S_qh7jSs%!xG?<)uF6yr4vzqGZ`ha_m4$7w z|GzZcC_XizVyRSImE5qx?t)opCjeJ}#qUN0?jP^F&X$B zVgjoS#>tZ_$1P(^?%J)D+ikN-2e2~;VEZ_5x)w69Mz;y^RWzWRNd!isbzmcZei3^9 z4opn%Fe#T*qtcZ)x0c_5`+NgccqOU5`7J<)^0S3seY$3p@=-V0;katO$jec^U6ui> z=Q+j6FY@(Ut&gO!48%5+BJ7lRd4;CbH zFjJ9VYv3pnZI_)mNzh$<1pv`lr@@JjE_>kfGE38xt)^JO7}5K(TJZ_om#0g)Qy_nZ z`-SCBT!2%}IaxD8M)6Jglo(UUl=^@~pm+1TktsO`41T#X!kn~3^4R=;bj+#Mw5NVW z>A@S%FPq*EUVa;i*hFm7!n0%aEFlPG(TzbXq2|i7i7>kYikG6*vKW#dz7={>6%Ra| zZB$nZx{N{X@-&+}srI8^r=j_Vj|$)vSftCQpOK?b&!L9L6SWGoMxk3<&T4OK3ym~f zywcPD_UEU&`zJ^J!Oj-sGe7bO=o2FS+oa_Y4Y4jdylT9c# zgKis*CSo^Da@i4W$zA{nQ@sK+t9(?MJc=kqBe}dNrfz;9v3_AR79*>1GGsP<4W;Nr z(&0+oRDjZR3OB+{^f-wMBQ)n^9KneKki1~?EH04fF8~_^D_=B!&Dn2+(3C*hgJ#ao zGV}_^L*lldWL5JL4jm&ys?{Tf*8LNjDMxT&1N{&?;ZqmrK`+_I3LA!U-+3vlns27W zY64&U0(-|HY;Ap%>{rD|6~O*_=;AV)X6IKlz^Nb@9Wnuj0^O?w{USV)&zDK&)jgZ# zfR4$PtCvruXaakGT7Hi6lzISt+TXupfDR6m0)HuF+Q2gCPWJk{HwEw6yb(MO+?Zo* zis1~Va5fwdXQgyX{~Th=I-ibE&WZ^}bWFXK`z~Bgh796{wl(m#WZ5pflWZs-+({aK z!|Vp1RUhpqJ74q-8{#mf;wc-1k56M2^Etd(8QH4b?-xK+PQcQ^Dp=cZzw^PPx8HsA_J=@_ zKxz4KqE>Q$hy`sa!1H&5FAk4SsNl}w!QgoR)9;XVpD?;3SHqO-{%TjfWgT1Q<`lJw~4}34{&nE&h&L{KMw zmcfZHf^(}y3JQrjPhMX=WVK=dymZ#?%AN9c1<;q|wY&J{hl{a`Z(b>f(>~tlCfWvs zLjz%d2$GPN`H3Gj#5Bc|SWVC`KwnVeanoRblg7C^)^5G(lBD_l7SbkvuxUDHrI9KO zKGxx{WyJ>tpR9^l>y{D7rc{lDa=3ImSCq|Q=zDyXdD9)Y%^I?8F`>dB=h zR8N<3ojtfSzXSv#@;U})HxcR*)a0i4KTvsGCv|1EQG7qPl_069{9Ao7jIK>d83OBk*C5&`6RI*?AWA_?= zRC1HV39`wb*&ApGTOhrc1s)v8LV5fgj|F4Y>is|^Mi7%}5ri?k@GbfCS^P9gou-#Mr7F zz{MxaVZ{hy-BirN&Tw8PJMJwYL`tk4z-Ok1yi~^;H)AU;Ra{!wunkIikbH`@$XHKR zA=F&2NkFlI4At^O(*l>kxWp`f-;wE(%~e}57UBdM3`z#a*Sz#A7BViOTrc*RH#*9S z2Z*zzEb}F~DyOmrqI9~c9F>D8J4x)QyIB{HB)?}XKO2_RmviP2kk}X z1#1TDVv^^s%vAhra#=oq#upQ0wq8q6w#8C{Qa4*kQ1O8*B!FbKbp#b&_%Z?**0zeEEm=hP-F^*0 z;nqtC%HG2YVks$qTtS%8b_GGv_zHr|)+-3gwpc+>>Sik_)Jz%qwZRWAIX5f#P8V-N zI7NNpc3;>Ugt4r)2BE?WUxNU{+SZ`71+#_U?bjd_ZoLMf?3&l0jKh72D>{G_rtRr7 z&or$}lt#?CjDuF&gM;RDB8$fydk6vAoSFIt`StKCpr?X=kGIS#)Ui3*;`EX!8PTGv zcryYvq{_y4Afk*R+M!!ZuGRt;4fgIteWZtHR3Q~AKa7vANo|W(>Xuv=`JcMx~4V7 z5IUzufiXEYFC?vg4lAZ`s(WbiDaMx&? zufb&h9CCl_r0K6mv#f+tq?jvzm7adx&4=%#Umksb-j&MsMM7YO)9@Uj(y+!~A=Df# z(ijFZ1|6n(MZo(@LYE*tZdKk@7=|+%UJRe)xbJ4t0UG-nzz8)K#kuzoLY!Jr|Frnd zIWjFpbfy;QT>>$;xiMvC&$3w=*!&*=`$J<~Xik0dx~S?}OvB5u(T%(zLGUC5gjZU) zKv>*=`0u50cn{gGwG9o67&f6{Lhv$V#34Q`030$PsH-mi+2tWCGM}Ms*3^kSj)Z}3 z@^W6PMl>6OkvSXa7ngJF^&IR;;O!63$3+3d0s+fuMJvTJ@bJ`7D;njCgN;(7`Qkig z&uNzVE%20}9?s{((I47^1^}KV0P}Ey)Fi%t&z|ORdxVwk)Q|ER*us;oeK7wX?IZuk z*0aOuZU!8#xI*`s1nZC>&BP}Ji-XV+CTkQ_g}3MJuG|zLd`X{fx+8r~NY5;S=#s9V zXKnjFA{1U7PMKc3&M!EJy0=~URAi=hJ7h%2`$J9?a;tzNX?4qztm$5y6)k$g^{#<` zQx3$p08?rkC?WASK)z>yloP`(fRx$>NJv~2$d|8E*77>#ID4LBd*Cq><*vJUm*Sz~ zmmdIO19+73n|XKAA3x7WnK~;>@A^4Q()^$$e8nQSmR1;G`fYr&VqbN{ZDu16I_&kc zG`i%m#zyGIZ=c?D&GUw*U$J}B+uqoJw|+Qbo@G!UvT=$?LLkPYty7z!um89Q4n%mR zfhe0@VR7be&igap{K}7c;j(oba&G(clFWB}MRbAp+SO1NNWR#HpfP?Z>nqiY_zY4XR%^5=U)|&%Cj(fg;U?uNb zVN&KA#bHEeK|w5b$Bql^)-UETCA@y6y3kPcQAzwIN%Z-M%ydn$)bk?6w|pvsUA5{) z+9gGtU5)~-Z)z5J9IGh|!_~ehus!7mx-6skGFDyXxyGNM4&0T#98jf2D2T1OTu9JZ z(x{bUZ3%q!cLt|@Slge2)y&R+&fXE`W?#!_Sj&cXB@v)7$#7aNQahkQb~DLKMCKNX2m!mDjz-#;eq^NnW8x+Z+df4Tjz&S$p3j zM!6whPzJhLX9tkcuCVB8q7$nS@=7W$g@$kq9e#H(INgO4!iiZ*hM8G@z_ZNl@H|%` zKd+-WuwV#LaX(Qk>OdA%UrdkJt2el8mECNVr9aH&G$}L1t6*17rVtWOr;#7$wQNEr zNk13WWqwFi<=Y0+kJog6(HDFCCI5PrYOe`Nm`;LcZK$C-IzHTi5Q9X3H-915=H;Di z`8Xo+a2s$w)?DibpL9dh9VwAKt{3J6I+uuHVl4{poFOoqloeaku82&aBfM1G7rBi0k zgn=N_>>Qn?B}(v~{SLU7d=MDC0gL5Pv_a-Wqh^oWak-V)Dpy&`QhiGgZ}1i}1c6L; zJKdNANo#zu(DI^xV%YA4sC_6a?*`m=fK$Z9y#}THMr2Whj7dO>V zh~l93bV|aFAU-v^^DMs;{m-nk``tFyO1w>^yI!JzNxd_fay7tu#&uDJwwG zL_;q1wHF)J^MozEyAprZcu5rPkz{u?JDi2eODc9LHM$#r)nJwmrKT+;bZ^oD>h$}) zo$aJSC?v(9{&GHwW*ND+8^ORt>9@U`TwpQvQR+44vhtEhZmt*V=fjJ%S(mDnk5Su+ za0F@S!A5R?RIPfkNUiF$s;pEEK?Gphul|rSP9lPJLt?K!8js?`r>5>`jJXl5oz@Ot z+>GY5P`tr^KK5ILrlgq_bWMB|XH{pP@KC1kFR#hX+5w%x2?0TjEyh#QT~wDa*9i!t zyUGG@JKd_6Zd^Y1xm0X4i2Ga{0nN8KOx}{1A0#Qe83^GC_OYfSLb!E0U6Ed!?tHYH z>fQ%Gm>io)t`%Rt6)R*h+WzkSmnZ}QZb2Y84U5=+RTCbP?oBrE)mW9Kk=qi*5*~mp z+xhu_P3^*^PlLbV_7mAvRA!C~WIBUf{H~UCD8SoTR7{jZw{8vv-0>_uQ>ep zz>Ua}+~HDgCv~hq4-Kn1nCClP&i6a14wtrbyJ_oGt~8G=EHLon22<3QRw7GQKoFw6 zhu!yo7IV5XKMs~@FxY!roUQlSrBl9ORo?mjdY_XQTaG-+Kr~vL33IZ737goCq1uHF zsqkZ7XuQ3`J6!ejwB;ZRdynWm$b6c5-~r}SK6#ZZae*fLsVH}_R^lBRV~+t*77=*J ziWIwE3o&|?@B*7UacNPD3H|gzTkcZTk=0#)SgGGBbpdz+8g~EC$;(+aJXrGTRE8I~ zBcRqV4epdUT6gT|!o8fp_GJY3K^wIP8$ui|`GJv#Sk71=+tCNTzDvBAp6UX`*oJFz zXdJG2>$eWaR%7PjlD~p|I2I2`Tryr-h`+QDU%!R8QkG#hlGVz1+gmy-S%%-t2%VjO z(uk?Jj>53ICEO)(4||ob$m=M}RwOmxDw?%^rUH#dc#34Nz*3-e$Wb``B|~}1P}a{- zgs==hk(^am`+cwz086=v0J;Wd0#83JGm+GQnP}GfnF%x+VJ4Ej0yBZqAv59hm(1iP zGg&_~5yCReL~>SL>-WJ-04!xD0_e?un2E5B^I?we3`Ud7G1_xZvdRn3H;0EX)#X)* zUMryjTk0Y9;hgClz?2d-6{#fQo4pJY_qo9oTyWzd?Yp`2$?=vHfnh8tgPkX<#282&k3 zQs$e2eWxsIDjSZM6xl;P=dyNxkTXIeypzfSO^XW)x{nI*nvg9iTX_`oFyG&gV!Xfq zR)7EW)8PcRTZJPmaWq8gjOXtRFBWB%i!x_V3m;g5K7`bzzlAqD{N5HS#Y@Tk&$2>J zg}<~I^jOXnOxnjd#vM>;6unN4d&~GMgI1yi-Hy4a2>!b$zaCk0VOwE;K-7)pr5ze7 z7bV4Ptdh$(0~vkB-nX3ZsbYpAae~rJn(R`vig|GfVrV{31)sZAEn}gLqU?<;kgPkb zz3=x9267NMrC%mGD5S{S%*1W4DQ#?p1uQT@+PhsMG@{Z0-MJ<#G@{Z0 z-MJ<#G?$=oJ1qmA%rBSFa63!`!NN0_A8|WK1BvTAm!6q9KbNU-J5B@F@jRFMaXT^t tHH|%&FLFCt1HX_xmyB{dG6Q^5EsQNpEzB(}EvzkUE$l5EEu1Y}E!-_UExav!E&MG4ErKmVEy67# zEut-AE#fT_Es`x#Ez&JAEwU|gE%Gf2Es8BlEy^t_EvhYQE$S^AEt)M_E!tajzEueO zc$a$Z4`^9b#>l{s&dk6d#=tPW;EM{B1`scmc%`1MZUwEH7Yx{jp^`&agdOmKyR{ptp+qq9$_$ke} zyI$?|Q4z7#FVEi9X;PVcXIa80S&jq6(yrc$T1>@Ud7C&j|NYY5H&d|5Am@-zM}t?OldJS%P)a|EIDto*}xH0sj?_7XRJ2+}39M+9Do}lPMd+ zL(lU?@k>6*EWh7f_eSN1Rcz?%GnsL#+YX4u_)f~0;x%XDjN?;&ElA0IzCO3yu1qcJ ztd#U;wg7Kt77+%f_N8a^f!F|u4T0DQh>d~R1c*(6*bIoxf!G3wErHkyh^>LxX8Y1J zwyVDKqebiVxI=cP!l&vdUzS;PiShDs-*7nyJ^jLAJJIR857|jEPpi_IzWa>6()3@4 z?6jD778p#wcgR?7y6a&euW_d3^kuJY?5A%$Z0E;(e!k^&rXzMn%(~WA)6I|AMKN!; jvzk5yBvRsPHT~ofJ6Go2VOG-xkJ?GI73NwqFfafBMjkvS diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz index 305feef0d5567d3726144342c94c3cc18cbd8c0a..2b8731c9e6cb002e745d01316d57419de6d74d34 100644 GIT binary patch delta 219362 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�)Gl(6}&Z-8a*FaKFVAiX96r9?X^7oT?J|&Ih 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 u^BNAPREDQ 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 delta 218557 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

-a?39g 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 z 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

b*h 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‹G9qA;qG?RNoLl(yuDPdbm9H-)j%M1Eikj_euCo-yUtzjGGt|OsDDPBj~8^% zd0W14(6VyjxcU10CE>er-SUF}(6}kQ%B^dXIS3o-d4Ps^M(3C>*0D?D(HQS8P2VuA zV1~(+yRw&n6oiDhKAEyBcOkoN*WiRh5#|1i0rdwM=Nu7KYThxB>x{UVUlwT^X5tm} zE;eVQo4ERNNX2ss6r_=RX@6uSXm7`ZsbJr%EVPcV`K8C;I69^u1;6d2%F_&w)U78^ zk%CPs9Uf{#O!kg}@SHcDUc^zub2}LtrfBiV%Ana{pa2KJPsElRc9GFrQ_#A>Bxoqz&e#6rzRgAmv}722o$xx z7qtCleYrq~i*i?~(XUHz$#!xn#Pb!>C_orukSf;Y$u0>P z8d?!mB?GXFef>V!*MDbjDZ#XeXRJYbGVU&#VKwainp}x-*{t*>?M#WvrHRaWk#o2l zyj7oP5g#Vycir?HLo%&Z&1ZP!qAh}8>Z%gkv_k7#Z#jLenq{gmcZCq2V-GQRs|tc1 zHRKnAH%{^ppuc?H|1+n16q&OUttF!Jm9UQCee-K6ET1TKgnz}PWpQA|u~Mb#i`G*| zU_E>FIkjm@mNmlQt$L@Ov2`ufxjW#&(u2yDnpW+tY6-K~0+%>ZcHg{U^Qa`hv=&3@ z!3nyJ6A+>Y%ex6_MF=@a(}-Y=GyVZmDHN=0UmwGF7Yd- zP)%G2IaG0Oy2P~=%#EeXFR@4B@#xbt_e#l0h}NiH13gzcdOv4tpSau%4(4=rbCVQz z2G`mC@h6`Q9v!sclq!Y8;zcvV-jha=sp|`OVzlPQ({B>T#QhrnRzeTbX+pc-(JGWm zowZ371b^LWb+h9BO!d6o77gN3-r$FJX-%;D^Dy$<%m!Msi)+hl)9@32-E4Es zuQJ>G`2)VZ--$0Sqz?$?-_PjC%F+X*+EU~`RF5}$t7)V}uihCAQbno37_2kp~os|jI3W8gz(gr;wYyF}m zlK2o#pN?oRY4*?v`i^0R(&HD`oT=B z8o}~GCyTb%Z{mXaXe%|%F_~d?-Thn5)6?C?C7M(>ksQ(P;-Jj=!kGTFcpIs!)_-R6 zO}!=J8#FJkv&(CjrDc*AH!jh@B$vD*eM+4|^gK5vg42@z_O>9}>sZOqaww_0Qwh#Tgd_JRKYFkC zn=k3@jMJ{k{W|fxKCh#__Cnk|{@Ml2SGH+Fy9#ivnT8=DEDfVVpJwo!rru+SZjnV> z((@&5n#RGn2-214R4huOqSAv)`-OYA-2ksXrs21sj=`vO+mFjyl6t}C_J5i~^0z#7 z$w>B^zP8m9w>JBMp;b9JeW2rfOfT4wk&Z@8Lf_gbUpMp#eqk=YtxNeK5fkxlD=A&= zI2op}L1s3$W7re3B=q_YdmPL{ z_3QRr%vPJczq5Dk&5hGQ{BM}yJD4yGNl8sP-h~?oT;a;&%3RB9fa&-Wr!}N;u@jEM z9G{(C{k&PPWhZtY$E!TH3*SBKyoc#HG(|cRBNvQ+YPpB@qvgikkBg* zB;75Q43WNF5vpNxjdz-|26Y+O_1T|dch25Lf;U-_;T^DUM7J6&jMOf0JJhiP@@v8o zj++xYJ;Ex+-mPT)Z+|4q&O`n#s1cj`wP)}C{*j*Ta7R1tyfHM6p-XslhSn&*!m<^O zUN@MmgxocsQz>AD%H$rfeMf9K@I_olatAF72)DT7QhQZey%cl{*#MTKK3r zHzssXL*O>ZRlyB$?3*kMPNO1IxpEe9jC-1)rfRw+Z2_G?S@wFp0O*D$W{$g#gqT#`-cb=fkuBFCbw`yTjg+zjOG4ts@=XC^Aju{DDYTnrwT@#VbyWpCY+ z_aoy88!7(Ak`N;I75SUGwm{2`-GN8paD-mn6fvLQEx^YYG za@%l4Po45RiJ$YGnE)9g$@KouYC|~HNJa?x@|M`cvl%&aDUg*GOVfnZd-;{l7_WB^V6VsL8K_A zZab@{2>{+8^EUkos9KHyPY$Y^&aHOLbu-(}NAaZM(thsQmJY^NC(u^4T;opcdf%fb zOU47aj??XZk)@q8AL|Y6p1t}8lhe*2+2|Q6NbKkx>gpdVYPp1uh&?GcC4e1wWpAbI zzke%b8Uotl&b=C^_q{!Oy#L@kvqx*y{|z`Uuf+|H0rqdUd|W48*6yh@e1Ndd?CD|z zIV^vt3H02v?f2hHBm=DbBBL9URx1wb_J5~o(`BFjsmwTzt=;Dv*-tTzV%if5T_ zQEscL@v<{4|J_-89OCigVvPeWawR3uQ<#*<4kXkZZnytzZ8N?GTz*8X zmZFzmzK+Lt_UCv|&uUlBVR2k3#4D@BYfy@9;vj*}yz-4#d7-Xqp2vmW3RgPshPB?N zdakY&Sub`BU?h%oSAkuXAXRcX9r)kZf>wVI`U(C&4H0a*7P)2(`VY{b*Q-4{>dx!Y zoR`p>SJs*vO-V#aUbo78ItsIcx(sgAioBEteMSZr1T5wv{<@3`?DJnb9{DR0$DtAz4s^kxt)294`Mm+{MA`Z%sBJ}h%~XgSw;jxG$;fA&0GnB=!}_3d2Ub*?T% z=ep->J0lmBw3(HQqBk`&7w9iHI~(B3&CxZS5We}I3dMyf(t0R_(VF!qznZdQ>}4kY zpu#2dX(2V85nSF72t4lE1OtC>bJnlZ@VQp%YYc}VxF*v7&Vyfd?JLJ|5>1u~mLL8#L@$SL-}Y{i-OxIMq8%uj92+wDKaWgMYz2 z?N(F=j7Oqri%0ew^{M~XVc#ICdHdQZQ_fYT1e9oxv<+B$b(naN(i*Bd;@FMnX*aPWUk?}zy|1ih4?krfjIO+S1bb zX>az`Jr?U*)G*c;^OpkQ1$!I$57;Ko`>1ZcL9aQ~v?LW93)wK%jZv&6sLi+wYz?Ib zb+3?HmJNS{*LH>*Vtjk^T`_f15!k1YEO4Cuna?x?7X()}*_F z5p!$OX@;58Zwuxk|rnEYJP9v5@rg zKigQPt%t&<%&`yjcUY=)(CoS$kE5ADBy;);&^n za2^w?sCX-ZE)oc)q!ang?^){Nn=TdPSzG`@=xh*^54U8IbUzDXh?aT$cnu{IC3V8m z`U%w&d`(t*d=Unp^MejHmP+wFiciRjeVl(RPDS>i1o9r5W^Rp5#CL_#=II_*i3L#!K^X5-nmrk@DU4i)XA|U%bEl;unA0 zFCG#jT)}Xh|B97~(nd%=rY;)dE6$jPBn?yIQs2=;>gw^!J#!kJ!odu1IvO-rTe5iKOsqDt=Sv)9xmrciTj1W3OPV-aetLb zLJ-cyxt5jCF_smRC}ChG(E~MAnJ|AeO|{7EJsp|=WYU&gh$YkJC9ubErD%C@SNfln z*#)})c-8$5OmwpCqfwy>(YSX?)`4uuFSU`wy&ph?XzPJkRxbe1mX9A7JX zJQ|-SbQkud8F&PcBdG?RUt8V`15ml7kG3oVxDE6?DhKyk91eFQB0Fe-r}*fO#xT7t zxQ^pB{oMw5#M= zx{Gdm+s##^VWS0Up=3<6p0hadkW%WDp<3h8I=N@JYQVcoqqC5z;X*Q5nw?|)*geUY zk9d}RX&Ah8tTRW=%aVRln$d!~W#O8NU@%oWh1I!9!o%?|y#(W-X%By$|KcWpc)<|; z3I?gIQXf!Sd&Td4Q;K`bFG2*=2Z{U7W&T(_kK8WWyx|$mAB`Q<)Re|&xlp2Q=)BNS zy6~)J{VePCRcna6twSF3>>EqZGfyhr%yObx9(R%5+;qwJ=|h%p%rw%lk%H#>n`;*? zH@t0Hms%a8mYSMG4?uruunAs4Wq?hPf-TlZH3q!&2Pux#x<)K|k)<${?3af8mxZwg z@J5)I0*$^0fPq1_UypUr1e@zYVpUDHfl)iJeLXee)&-^zjxO~ufn8}M4zz>;-@3I2 zFx}b%m~QO>OxyNUv$IBdGK=_pEF**6E~u?IC2*2m>)rBdotxGif6NA!XHtRkvTo*w=nj3 z!#7WZ^9;|lYhEzT(laua*c@di5~0C^t6W22bYhhle8km#b&j-Xxj3cTKAt5frwd-+ zX6X#P!M}}dC~$wWnJXDcp<7j{?Ky73{V>Yo7jOx#K+_F1&prFhM~p+>Q7^K3L&}iL zeseDPgi}~D_UE)f{nZ^GeQjrlQ;Sx7PDZ1Yd?Lht#19U{cx&}6N{F{`nms;E#;5#p z?kV-Q;sYXE7OwrzUmf> z9=#74b?e!}M<9;xL=HyW?@^Ewp#(1uiD=G+&WV@t1inMUs;DiY^X1v2I13CvxnC3c zpyuYVrhIHtkwD4s^k8NWx&JtOc#f?ehTNhv9sH-fWd zzN8MZiywbsT*c4IRwiVW>(9YJfQsmjl8pDESVRgO@PhskyyU)vqesas$&;6clJMDb z5phEBWJve!?i3!lc-h-(N~@R*Z3hjWDF;!oj8Q#2 zqIUP^BsR$cArC{O5h`BvFbkEv&xqIdkEU9%Q}=%i{g+JL%C$rfVY^EK=6bM&L^nT5M%1Fqu&%%%J1V>T$xLSG`{J}zG87S;)_Oh+^7$bz#IE4)d zRdRo}oJET?!@1!x-elG8Y0SR>)bMeDI)SFU~N;~N->U0W7%3lS<6l!Mwl zWtY=;lYEakNJB(qjM{W^Ld=OA!Qmu!nvQ>F50F{{9&mAe@x52B@1Ah1H#Br$SgAeW ziNXhepo28(o&R|9^o3(pxA2&LUsg1XTaQ2B+gmRhT&`cnFf`~q!DudO<-)W_dL7EN zEKMah3VOZ-RxHEW3OcxVKwt?e80wA_o-khx-w0nLoTy3>vh0}zU-;_ikh2#C@}z%s z_~IE?(+f2)cY{|IGf?{j#>Wg#1Aw--9eo@o1~sw%`iMDfDPh8P=MHso7Gqe zP_kDytbr2~36N`jt#G@7JwvC#jEMulVab;Kz5?)LaF_S-VUxg4)WJC;0K#IZLwQO? z6?X7Lf-s6@1oGM{f8m=rI#1`GemH;Q{h?X>^z=cQn&1o64rR7x>=xzv7Ql{In^zj3 zHiL(aq%-sor)xNia5x8T93yb0Vj7YmA#we^M=`ZH4#cqP4Ui4{ zO)uBFFrl=BXSxBE-k(rXG9~|mEH>y@wBU)4*ljC}rnDyW>Z5;}j8)=8sO@h6 zE7X*6H0z#@n!1gaZl$4HY3FvDxwTequaVnoV^aT{yFKx;vs*u{d>3&>zUdt%A@`zbCQtk=iD=RhAi(_yG(Rx$$8i{aDAx&9B2-TZTWfB(q$HEWNpggD9JkB#!!HkN+}zzxYJ*$c%GZ6l${ z)RP72TFSeE`~-hu5e8&-$@h6O<@djbwVH$czr24u3{0-G&B9+vV!kJi!(M*iU;Q*qT*u&z{XHy)iVI(H+%Tt_zo zjn|Df)9*zs(58PErI_tS&Af(QBrMn0i-fFYFP7#?GVz(}Mo;4+g(6CObBzM8m#>?0d8>g(rxN`4x!j15{vdgb4hA&cznk5v| z$ocO8ijl741(KPTC65(AtL8NM^_=8)n0xmge6mlkv>t!n|LW-8!8Z?rG`sT592Miu zkuRf5CS+>lO-cL&3yjx5Kon~}Mh*d3hi0Wv&!er*RT?${V?VYB< z#Jm9i{H_HO}k0#zc2Yw=+Z738sNbVnvvddRtxegIpJ?op`r?Z zt1o&{Q}p-sWZki3`HFy0&S*u>@>5FfSFm`E_Yp}&_|x`&c|Wvja(nC+b9;-d+;`rP z?oxlGUIU62l+r?|C581U+D+!8Br6;B9+TKnaX;qJxDt<$P|u#)-WLpB$6W;5eoesB zVw4D4tT+7nFjBPTUV-;0VoMs|vd&^%;#IjinJupn(BFJcEsv&gaLUy|04C8{LAh#VxjqTeGfxGiZXzmUDl)yT6Y7t5Gk+>o5JW3W3AkJ^~k`jJ;tA z@97pt^jvt|ETwNuv1SHklOqJWdPUrzswjyf{d^rLIsL&VSob)7a2H3#qepqarcC(T zAb5FwiHnUTejlh>Xr$vkjf;@7GHKZbixl!p>B5Mo?6-G<_q_GdB?l7rSKO8hZ3%z5 zaNqgGS(?SQvU&ZZMt+*{BMslUB9ziTGr4%Sj2i{K65hefHOB=P{v3uZx80&M9;6Fl zos0uAlOG=KseP;!`raEDqH7d_Zgfq_bem8ej6a|XhS<(y!g1=hYhXz;>DHtds>>#% zjXPwPn>FyE3l}alH6P`xPpIA5T!m0 zig0wwSjD105g3HES3q#W+MT7&xn-s$eDecZO7S;@Z$c9UN8@kHQV08lv*dRiV9etM zt7|Gv!S}R(DKY1d;?wBYgm{8LYoKHWk2+05Nz{Vpv)<31@?NlDOEQ z2oTQS0jM#@bV-mngY;(fjlh3y&^nz(Cq1S(48Dm2ZZF&$z{DV1J@oZae0I*zy)D^k zattg&1ws0VM#VJF;`x{r957jEVrD!M^3F3FL6dj_evGNxNtVaVI}bl`o<(XxU4ndj zco_6HGe?G))WJz-F`a^#`2HvsqQ<`f>L>_)%wbx3CzEIa z7IP~c?B~fDkJi2ng3u*A8Ps*GlTTKH8OtQmsbsRSBsuCJ=~J>%y~rOZC%k9~H9*K7 zvVFxlRi*--lNm!U68wLv^c5~Jh_Xpl6qp2I7dXg-9XlEPl4LXa?RbSeA^|z!f>RlA z+5iwPow7e=RYtuvcOkJfig9qmiZ+PQ+Zd<Il zLeaY7lOMeU_#dPEJmS#X%YR=>{M*b;-hlfwjZ@e&?Nc z!lI5lS_jWa?W)*bE~S>`vbho~CwZwFH}Zk^LW;40Ks00y2Fh9~M8VpT@(rRmRt6T<@&WvzQE{v(l6`Rqh zk_cq5e_;n!YRuE3QfEmZm93pzOzj6B4`yv6Ixz4xd4S~ z&8ha5b~^UpOOJP=1-~ql@y}G0@x;?5Wn+CMbF)2yBh=zx`T^-7RRe~GKTMG zu&T?KCK01s&38N_@f-^oBV`I719~ZKgX6#kCQ0DrD3IX!=bx`< z2#j)KgxKo~y|2oST#*^-9qP!b1X0&ywHchqUn-J6cvr z;0UL)1HiYs=P<0JBrDQziXGE1*G&k-O}wdks9m1|)!0P=Pp_y+pQvV`^voftK)Zi3 z@r*`CJb~$_ag|zy$Y0nX$Y0Gr!jbw}JaGiW1|Z zGvgO-t3-tFlMhtr8t*iCq?uLzqj>Q+<|=GSr*G}5)RKcMyxAPPt1 zH3g}o{or73Z3s?ht)U#neA$e2I`y$q;#JYk>k;z>M_tjYvGAH03j%1(1YP|LmvvFE zMuMAFU`_7^T>E}Kh@#?m#>G%jLOjLgj&FF&-G~C%p z!=1G>*!p>5k^SVgHFG#fGG1G^I<1Df2DH;bM3@Uq>ndaYTVK^W#0=Gl7V%^aNLh)C z)+`O{2V&(`aA6wtMh>oo1uD0s#X~UgKZ?7X(aG9}hC|h<9|v;sN3;w`DGdlNB{c|M z2A-s((lh6X#^no$0yBR|(YTV*dVN5HeUZ_%tYYFiym`qn?zyeaZjV_$M-y^h;_h3l zT!8H`K%^)SH5%cBwV%v+B#wV(*NDrKW%XpqHy`Mt#VJ-0y*%iGWddUNzD zY895(FxeCc5+-~CPhn{jLT?sABOC>&RCZT#QPK>W5Ln~{hB$wHa*Cc7WTr-?2X!>5 zc#6XMnAbHU?ikEHEWh74=P_wuUHO#zPMED0IhBNHG60HNdLn~spLIK&wwmgLp%%VQ z89TUPZ37;}zpbZ#P6g_aL#JT60ZFDMwo{uMrj^)s+48NL@_DqOD`rtGpFlS&-)7C&t>|tsMxK*N4Q4`n^E3HWl?1^0jm^DAh?? zh{g(-HAF;<$5@?a$Tws<>Ud&t9Aq-JH$X?j@RWsy6~jp!@#+ta3d5=)_{PAhCb_}wrAOhj$+>==C zpd^#K$Pyw4CE4?WYuSq?!kapGTNoUcPbIzHLrp&|+0;ZxR2GARh(5`&lFZNsbw}z^ zP(T1=KesF* zuG!@RfZSoNJOnfD#nyd zrYxJhcF-YTx>MXE4fpdSl7ME{3?0{-ky!Lt85n;tjGQ2rwr|Pag@O>Dlr*zu{~QY( zh{ke}k`o+0yH&#z_Xa>b%V}WpaWn%IwqRipAh9%plOs-ppWby; zW&};H0M+_4G8qyo&#no@h5dN(NC}tBo)DAjZS>jo(1^;iM^mPMrW{7OiUQ3p?imm) z5wEFNOC#{Ejh3TQqc8V^kM55ie6knZ-#0Sz>R}MvkP5Ncw%5dvOj#9WQdIDby912#I;T4@+fP zO*~3x6TGs(A^&OuA3wwtaohx$ENJ+QtDp$7AtjC#WU09&!tU(6`quW&Yum5BzKc;x z@sQqzRe!Lxg%w&DtOfJk)BV6p8p3}k`!Jd$DfyD&mwgELtyWYe@y_45Oq!5+5*ZbgjSkS_3z=!Ajb`6ihxPK)37;@Kkl zw*2v34QUS3@nukjZ3wkd3n~>EPIMM1_vVxGC;F%Oz*)H($}Q^StKja|lvM;FkjN*Z zSdZ92+f1!OA2)-yB(%N`mgKm+VJNlkZf|ezZf|dIA4Wd#dn^|}Hu8fnhdw;{yOAd`CQ~*?+KotfN(*apQhvE>saxOr z1|#oy5J8h!`GmrACS8AnG;V~go~L|0n5n)E&}}W1NWb0OJYY&(&Nnx|?>(K(F7w^j zUniulp5<|x(3+2@SFgj~H@^IGWp&WR z5cs+*EdL);C7#&Bq!k$^?i@s)?hoJG`tW%F^Dl-UL)(9TFFi{qdCF<#6amc}H%Tp! z4fkyWNh7S8G}`=>Ovk)3)Nrr}hM96D7_&jorSt;Oo1@Wa1IjvMHz$3DEjY0rM8Tn` z1`jOfZP`6Hh68HCgM?s9P-f{tiY1nl`@e?Ws7G*oX4~2n7vb$3_-a~!2eE?PeqKZ` zxnci-Mn`{Nc*U2d`c=+}7d

    4EKCjEC?8;^vo9R&)CrR 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 N-vb;5BH04~0058%uGjzo diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz index 4210bea556ddf00e7f78c874f1e95a1c47ff406a..4d38f78f51c23bae7fa9cca42fca609823170461 100644 GIT binary patch delta 219397 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 z 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≤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 delta 218479 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%0AKqOa6^N?;fq=RqX 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

    iulX<+-h7kToro^`{xx|&rB1j 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
    *@jb6WGyHIrqJIM{!O+ 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°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�)Gl(6}&Z-8a*FaKFVAiX96r9?X^7oT?J|&Ih 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 u^BNAPREDQ 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 delta 218590 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�jG14!lK2`}#%qboQ-LP`yvgyACW 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 F001jKyITMN diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz index fb98865fcb34602d8d5d520c5022d2387bbb2a28..f986b58dca567664ef81cf393889916fad20327a 100644 GIT binary patch delta 219366 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
    UV()gGJ#^tX*BO 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
    m?u^;jXDRAwHfO!en)KpIJ;fK?5EclN4PrGHkv z%Psw=^yXg%kJ4(=>+4Gt3{&y>whOaJIRJZ11G-& zzQ3DhSLr1s>n|vm_$BH-?8_dEDaF%P|2v4^}Hw)Qt*4^763(jhI2f35hBeM*>S5D7c{7^nmXrxfRk- zMU zDjIh!$++H(IEp`~76q=`!WFQ7;t?{qRYj46VT%Pq4;@vVU7yiviA@wrrfQo5>p!9CS6h-L2EeBFQj+qKP z7%dizXc^=4T!77|Cr8KU7oQ(KdeHD9K*YiJ90l|B_BWACvA04zowrrF(KD;PbK!iJ z!7{jhBlL5cj(>sqLLrirbi?sPJR0{n%I8&H7^n-@6FTpHpCr%fxm_de#_*KWo9-Qk z@K}#uA`A9(1h^S#$x#^&Jm?rS7

    h9J=^0$;o_Y=M3*Lc*4Dn9{U^JR2$hkC>M0B z3f`@GV`>_hB;`uI2J#J})l&X)Fn=(J2P384uzN=^s+RIvM>pEh zW9`T;p8HJ@??({>jiUQJ!23ZIwTu!ffR}hXxSKBE%tBYAk^959czJthS-BDtt`UE& ztCYYJ)LS#v?bfwt8COO0dADW-cQ+&bVDI|=k>CZ0M(NjwF|jQ zb174;^DRR6Yl4m!1%1r&LD2Ospbu1n>o@oJGWhqi=y$W}cQ)EDr?;o!zOU(i4cojy zjm6CapRU_SH*YfHJ63uChkrOn_fD!h*Bp(S&VO$TS^_(clVq%}W9h`cK@XctQlNol zM%8SB^)QGlJ~ik-EO}nj>+58k!eFL1Y#eyLejISk8HklVh@T~DdNsE4p#-~F)EIP~4fG-hFBEBD0PW{jT{4hzJQ*4fAUrgJX%A}Tv*k|132oN_751HQ4lC}=EA ziy#CX68em}ml=TG&-0nL%L);v1ifKqQ$$xfYYOVp3vTytwY75NxXeAP0iaZmee2X# z;6MD^NM%)D|cp6vdX5OUn3c zY67~uZB4pz2Z>QMq6G#P(uju5R#>Sy9_XSA8`ht_5^AX{w|VJAOTk?XeqGQKmi4tA_i{E~kqzN#uDML9AJ5r4Mm()e>3rR&7lS zafeV9{@2>gOUDNTbXKqt5`X0(D5TO8qa;6Ewv1g$31p8lyYEWCSPHoVB{PR7YX7nl zOs5^Qb{+7mB8(ParlNphoj*2x$RvKyn4(zDUJ7O}&`yJ(d|0_s0d!v}vwq#%TUv55 zQ#E!_epI)Vs)wkwsbBUULa#?aRzX+0r88?FKbD^zvHpN}fCuglV1LnT=9Lg5Lv3jH zMzz_7NEgqsYOfirY2h#wN7P`Qlo-iw3;sq}x4aBTN#c#rcCT;ssVw+Gw>l{V*dK5> zK@>DaHeY82y?r(YPg#x|(^N`Uk>^A-@w~EourXJnL{iwZFdD^ZWm&H8SJWPmVHKj9 zIa!iO75LP@EHdrS#D6L$b161yq*X1h-R&k!L=#0VSG=rpD+Wx2Qcvq9tV}*YB0c_r zGK&9lnPoYMSRkL|{F9trDm6?$?z8?*MnU|@38c8af^@Pw;Ei1SO}Qhbt^7jO<~XA` zLapW9=h0gQhdv+zRL`c}b1c+biW<;<1#5e+^mx8AShgx*rGFF0&j**EJbGoW_4^=!{^1 z-FCPS`OB|YcmPX4w7;^kNauQ0>w3#GxN0`dqo18Bk84!`gL<8Z0H)1T!D;ijwarbv z%{lZ#6V4aFi2evWA3A>(A4|nwxZ-21NEfzU?%!Zup|5UrVbY+xZgs&ML-4w3;K6+i zlK*G1pxzS*Q?&8Hat6EAzgbRXxB3o=eVDak;`Us>xa{Mdt5FX%Az!ndc2dW7{$O>C z`jbbubwq6VMu_|1FJdho(R@vYr2~Mz%8`0<3?nk?nNR$abn4*^X#r z+B>$gOVKKg3JCo_=+n?*-1#8%6xNiSR-!vya7}B=rpIDlz{CAG2csBUy(a)Lzk$C1 zP|Yza*+wv9*S~pP3Y+7$bPsdF2Oq*5;4hBWr##;xy^ydI@?cksJAE2{_2Uwzp53I zXHnmFmzA|%%rV2(AF$e=ET+hPbmyZls29P2dxY|oD-8d_rFBNQ+&eqpKR@7mHT#3uSv*H`!D!Y%J`!4Q9yWm;mM6iNH3#{TkyJcpJ| z=;1~3s2e9av|-hq_!Zts6N;&TkE4NPom|}Y1askv!UvjMUPI01Bv)9YY!6P#@~H-}bWko8_)2Ce$Q;_jipFyb_cA}5b2 zGCtfaP2*fNQR84cnZ{QzG;$8pHx!-yQ##hJ%szk3cMR;oUPk}rNj$#c2yO5U9c7aV z?9cRe68Z;1zB}lU!!Nlrb_gQ`7#w0_`{cLtwFV6kLBY7Yhz(inW-uIXo=(iikn}40 ztRJIZ$rP*L2DV2Vq2^yCrj-VdX?;_^XR5ECacD()h!y>{C3i5pAywe1)(-HE-5^O( zALD;*!iGX#^3$#2U6paAY(Xy=b6F=IaK-Tv-z|sOg#z| zB8`#t6#eRHiG4ju(C-V+tD#v`0{+)X)Q!Cta4hB)zZFt@Yevq@2!)PvH5<>2KOY3^unHvB)D7ataDU)c=L% z-%M!Mo7i>I{b}$ z)UXnRKmMs29CX(~w)MsIu4G$J={1f2{=)0y*p*$#{MuA5Z7QF{ehb8S{`u$El4lL# zh|yU?g==7PN0<{%Gbq zo;c<{%z}qEzs=7Ri1wc4Q1jmCI?lg$x5~Nj0tmFHBDuM;aEIyS$S{8=VvN;hnY>91 zdrg-O(YO;C?*;rrx-6|4<*#4GTu0;b*z2eX&_#b0jC5dn0NC@41axntrIur=)t7}n5@D z_T`GC-|Mg{HT>f_^|=+7E?t(4)hpb@l!j4|X$Q?{sU~7eTo^;IPEyt0yKZXT6&nSn z+Kpb&X#1g0>+xsGP<=<$5^HBwH!2gUY9xPS{u9{`+^s;b2we@xb(%2YM@UT?RdwLE z=F5h+yt;1YWdeU;5s$p5zo2_Mg6q6(%P`I#n6gmKYW02HBf!WIATROrtkPj#j?s&v z!9B&EPdlE3TP`yM--df~gF0UGQ_|rT($*(f-En9R;|iqe(dceC#$F)v(Wu**W>qB$ zw{5GWkGrsYMQi;szfb4->X6W*k>-~uUlZ!sqH9Xwe&BzW@)#Ne(S%d z8}GJ(*3JU4DqY%yb01?ZBE?z^Y9o%-u=&Yh^`Uom zxTiUH-h8Khp4w=Rd%eOTH(Byfj?-BY?0@`mK!9S(3#3Vr00cK#KM%f6uycNXPn$RL zlP8tr9deZC@#V%)cAPURt$o)QUg3Y!A{r+NEP{V$Hv>&M8A`$Ma%mk0 zLSo6RNuFmpc!C{g$|`bKL@K!3i$?9bMY_$=#$;+R0jqM8cUZp|bfJ5p%6{Skm7@MI zMGCnfrNj?Wb#dqE17;Cf#iq!tNtv`(xB#fMN;rng|?O)9S=|+fd~^TUE#*ZJ=Y`K1tQ`P=$|#Zwz{)S zX#_?uZtZ}(tMoi<2amsGj?E)IG?i=Q?a+U;7sBzUNilcL1Ad$&bL+Q*ufM(b&CA1k z@1nur3M~fk@x@|u5RHcLzZW*3(u>cUaeN?u%x%Ug=PJb%GRB`~pLcvP>eT%TV%!>&u-)?;B8S=)b{ zDc1t_mykOXMX3Ah9L~lqHTZ1;6FKOq%F?4(rXcSLy$Xe3)1D3>?)g)6a2s9pP`v|f z_^tgxwU<#Vxq=}`j2_8J=9HYIwZ_W63Vd$$s;CG+{iQr}M=)Vas!xKgoYU2@Y6%Q&`hF?>)$~4Lx6b&}Sk_p6~YB!<=)- zz{tFW`7nW8x$_FtF0%(fTjvk!*ck-AZ$o3)@Lq)Mt$k3Fy}`n%Z+rJwfT9!49RH{! zCTd+!oSLXB*qd%(Z~P&PHG?2VJr=I7mXj>eySK4fKNom~d7;YeQ0r}X-Oqm!9gU&4 z+t8%C-EI8!beZ(nT3YSU=a_WiYiFt4TUj4=gm3y{a`z_ee*H6N`^_7IkK1OAzJ6!# zSeqLsVxM7#|6p>%G&ziEc~6I9CbT^$P}*tBYk=vvjdL}maj_F1K>s^>Sdr!RHg+1` z@VJZjq19@&TCG;ARf^l>&VYXw&43o20nvSe3ks*s5PkVZ8#$hgzU-vRmi>1ZF*&#=9*m{bgIoJ~MLVcMb(uvD_*Zy*2f>3;U93QL@i0^u zj4Fg3d@!cGMEh~25-nFeQXV$G;+0`O$`EL3K9`I8odR}mViDwpeXW1UEZ!whA+OwR zQK9DD7G|-+1-i7x|IpAURD*95(TTR!8fA_hLUVDE(@hxRWb?wHAyLd0iX>*Cz%t8g zBS6P2B6TI*bhrV)*HYnI^x(kXNAcnkz1$2lGk0n$Jz9;`E(_)W0@Mq&L3IfcY@C7M z@N!bc38tadEWNd={ziW)t`UaUJO7)Trm5S!jZg$0Xj1DINp?d4bgK=o6Ry+`et-QTeZu50le;F72j?V-p z$u(_1qbSm9t5>ik#=9>(zscyge+>Vy^l>A{+F@!cvM@zpoL7HGu5AIeR>f^aQFfPe zOrl(O&Gfsy$YOY!WwS3UzrQMfOPYKSr_UzIT3gLEn$f6ACV2SLvs#mAJHU{da+h=I zs|q}(MfrhVk8n5h`}7vy_S+4vXS3U4_tjUEY4nq%Mp^#sRs4Dtt0H|bU;)k3pC9dI zH#hK=m&rv5^yhyqX!qyfo2#q{z5z{P7Q^&i1m6_twEX_2EV(F4Y7Wfz1=W<2fp!d< zmp;E@Xz-X#k@R{jh!>t(6<7TKPp&x(EwEIpZSl)1)lM+yeKFU;9 zxO3>fSwvOtn@B*j9ezV>jz5iVVrSPzxRwDwlyNuDy6ZA8Q%V`QvjweO?&jb6d3k-1 zUbbEzWNCfqq$9hvU-l4HS4MYTw2ogIGQ&M#tcA{Ug2G;9fLD42nDO(lDF7+h11v_j zP@`=X+0VPzpY^H1z|g zL}MK-uHfC0m9v^ISH;;!e)W4W4TyWa`rWq<6gPig1WLyhq3K?*XWH84%tad7xGdic z9wn26P9V}EiXwFcq?es38Hn*y0C`lq(JmD@v04wn33v90-rz=n0ew5uS)N(%bG}|t zKx1`|3p%>#Z-aH>T}>KZ7MR-Cdrs+?>qkI)xw~X9qjG+$%Ucd4zNuPy#D`Gka^U_^ z1s#8`c&qR^#Z~WaxmDU-2D4y11(itH1uG1mG>C^CElM^dp8u4)8}xt+oI3g>wY|S< z7LDV};wnQvV@8=}qwMd(fck*Gu%Weq`WF(zw0<7k3=7sCl0vM51k3TTbmPLmjtN)u z;48?3Yp|fQo)ao)l+4gC9DF1g3>4&@|q;k6El;7Uk42-S=`G%&}SZ= zr3Dyb_<><@;fNyhKsPx&GKVMAVxE_eOPnUJ5bHtv{MKuV7RD)ggP_R>st}^QZbS|9 zWtJ2(Dy_u`61DI0_c?TjUdT^6@pfW(n?ECVyq{$`j(t5%Z(pwpis8AxTZ3mWTbqBo z4@Ml99W=ASi(1H8G7*%^h!prLh+ZV?Nf|e*E5l9rxseTU8?#7PPD`0Z{#Z^!5UET#v^AUc-(t+yzO1*rY@tx)GH%@!|&$X z$xgd>23}dcUoWPrNZ09ET+cZk`Y7Xo-j|tJm?53C-$Nr^iK-1iF7Lm^2)s zhl>H*=RaB?1i`;UB3P=)V%AnPteW5!`X4&aZBx6!Up(Pyja)KmD$_5B=d%p#U@3ks zg3ATp==Z$Te@I3u4m|-gZVDv(Da*f4a+&e6(8~QOeHl<*9Had!SN}1dG?})}q|JWK zl-1L$UfA_UQ<=Q3(MvBx0U3Wj2eZZq8pJ6#BM+81$8feFw#4{1Nyf`p(=PFb2?z=4 z4G*HZB2KH6887K-dD$0VZ}{vMEsTt4n_!yDS0By+IPmhGyl%53qf30kt!%AnAZQ%Q ze1)?s0dH3IjcF0P%`-;gT!&PeM-li6OliS+8=d^;g{uV@5Sl5sPDl6 z>gjCp@zIB5UfVIiq+@^Zk|Z`%C%St6P+^Nzgq8rQ8I?9*&0R_Jr(@JZvu7>5yj6ph+Cqz)#7Sv`G37SkIN~GW)FT2BaSc>PWxzX4f1=7liDN7z8 z?OXMDa229m>2xwXr)3pt%9RA0ubr&sKgUa@5*w|_`em!t`_F&nYy&>d(9+tVHYbfK z2#cc+d4*)JZQRfIJZ#-DXUOfR4FA)fhSD2z55+%zZN^?f>d#U&!v9wpBGmr?`yr37LFsg*=1^U8XKA(~bca#=I zE!so|SfWHxoh*L~(wo~Hps~bBa=KwUy+Tb*0!J4lb?8_#N5JuDl=5qC_~g|jEpBLK zjE&FBfvJlKCb`79tE85Lp3$D^we>^ia% z^wlIT%BRI9%i)M`vN_Y=4vgCY!Xujs%~b^s`d9Njhf#!P@z{3(U7CXL)}Y+Kmcw;a zj>@#j$93D&53{C=m22LvYK;ZqjNFK4{u$00WR={t22&B|4dXm=* zUwHmb+T4F5!WK$Sjx@rtNsxHgz#$X4x68dprnpL!SIw@R99DkiTg@S?QFp)bZ|W`U zj|rLfVlFC2?8~e^UW_gVl&($kTp;rw83oI;czykiH#$lu-tt=9*sq*0IpWZ4j0mR_ za2`w{2p3Y85Nuc%WE7Y&BrH2xA$hRv6=XrHA$WiMCoNfzc+Tnvh{A178)lpv+@!G8 z#b;+1C!n=w*%Vb^!2sXTMj^NL*;#NNPrnb!GQlUX!PyGk^rLh%nj}p*r{DrARrWr7 z<&C%ZVPleIx5ZX)7X~|T1_R@6XfQDR5SlU3kWDC(0d?eUSO7t)q%$_Lgp`JW(7zk0 z_(*@Cn~jaP5m8at?us+aVieFyyG1OzWy8jqVoyvh2{Gg;YVir~WXaIN;uo;}oc)Ic zz3$QZjW~VbO&JG)$ZW+|1FmuVfx@XsK~iHjU#yO_Ri(+3Dursz?@5> z$#S0_8%F-rHx1nrGVZ3o8R_LU9FoFHv*3SLr~wtQF#^=y2yhJI=RiMA#u&@6;B7vU zgF~_Av>-S#>RE=_JkP~&GNSmq8BtJp?L!oj37r`B13H;Ki|8z!co}CUmm7{oTnLRU zlTpMrzq1Rfa`FD*>G_A{w)=Q0^|7)-IGDzl+!F0z6$MdMXml~h^LQZ%eHb3@u*`o= z>|=p7jSQ7OuWj=j zZffUj@56)r&ptUgMHwM7!)*az3#3*Q%5MDxQuFdOS!!St*5*LK;|UqWka?EP?x!WR zQ6psyvs-#8ob6D=BMET>+0n^L#}j|xrzBTjHAT*NtrhU-5H9$W46FDaI#)>1HUx~4u+dzxbliU`%*hw^ zRg^Myh;XXvo01N26HvS{M^6(J0}3ys@(?X!`c<)wIqRI5$V#(>#J5S|1l5aq6*kUD z-Z?2Y9esRs_2rzeop#kc)=Ux1Bv?8Y9`_)z&dU$|yRt(yZD8%j6=VNkxL*n>C>*X56pJb2Zs}Ya?#w830WDXU~Aq`7tyO zY$&I5yvwkp6D(!F=puhX+UCO$z>fPHmpQLUxH3g*x$?vn7!60C5&Jw@P(;CpuK)`cCJco5FuRYTtwi1{l^BYsHf0Ye_ zrxP?^loq6*f0T{Vaay_Ez7i6#>rrh}y! zlF#EDCf(WhxU6!)=Z0WO#QV4bB;a}&kFd_0+aWCeU^oSr7s}XygxB5-?j(7-OnrSj zxPyN~1olCejQ~;&*z0v*?*OdrI;_{A)EgC89|9d+SUYdlV8Qp!+cj9!;+qv%2R~mW zlL>H~g;mGvbrgRKO|af#SODsd=!g_0mam#&?t--}pvu1T1dp|5|SV;87~akUHL1GaaKmVAG`^mNaQOBv#R2E)@oW}fea{r3l#A2PEfcBAk zOJawO?FJK8nrxOk+!|+!%?1h5#biTVOAy$prqOiZl;d^OYi2OzzewWSY-&n#5;1rbdt;f=H)BXslA~MclqAawXQxFuu|j{C zPFaSIb(~|osWE|1GJEBA1UlR+wCw*NlrcZrQ*?uWh-dj;Cq8-Pe$uwXCwfC?f`R#G_l8PjoZOJP9!JtIHQ7+vh z3%J%=a_G5@iK6EoAXMO=<zgf;Wxw= z-|43#>J%~8D7u>ElU-1$j&JE8b9fl>uL$v&jv^>B`~>!G7iZ_g^MlaI2bX`LY5{nI z;^5%ZWdlyPzD`F>LdU?16UTHQ9U%?MqkVPR&}kVs6O} z9%5I8LEEygeLK*@q?NSLr+M0w59y<2b(rx?5PRqzK6B?oPrXmEl1JG&&hu;onMi1o*lO^*f1v&A>4!e+T;j<>%vtd6*Z80fYf2& zw2V1~sgncB*Q}l(Va~zk<_POkn()9*4f2@>b1*#mld5vgp$CS8RaMrV)>9T15a2w`|uDbQz_C_^Miu21(u(hV%Lxz9`A& zBhc`(Nh0SfXhq7TOc8(d`5Vr6=0R$jUf%ni22Xdk*=S0YM;6z5p1&L?tc7`!R@r zjME7j(}jk+OH4k61GZ;uGmN5$8-B(9!|X&|DA{PLm1Oo-Kn8G%{rGY3qb!}i@)@7- zKFyH1(H-h%U?hJWu-@+D$27`G74R5`W=w^V(Xc{%na#D@lI7q+xGfu1+kQF$CZQ(e zRFU~t`j0bg!g1Uz0tIYpq0L~70OWWfPIGeRLU)xcHw~TLWZ$pX5LRr0jxYan01GNp z4PK$+IM!F@=nYWFnUw6UO!i?0&N;VPkvgNhnE@Wogu{REvK*BrO5k~N;r7@L+;s+q z0X%EuafM-)ODNJWCYs>SRSN(OVN|0!8k6*|!h)xBLefFRfS=UO<@wNzMYu&5*(c}1 z@l-60%p58F#}>%6dJ_K5_cypveU^YT4bT{S0#@vXa8a{;?$r@R*DT8W5of=#{&LojSHG7TS z>+yV@fQ8{+T*hNX2FJf_5vXUn!V3>jxdk)uH4Iu-XUR=Lw=}ZbSFm4>T+H&N1qpyp zQPl}J7PfqcZmpkq5MXWK1=F~nX1U%1i;M4_0X2V}fEiLGptX-!Zd0D75qd%eFO0Wb z7@B5aC@wr?Eocd8m3wYNQ=$NkEoxT|ljyA3c~hs&K3v1&XfQnA%fqm2EJF^-{qKR% zr?1YZ^fyJMN~rMkhB)d zML=!Vw1<^Q2P~U}a)MUOv``7E3L7bqQiCXh?r-PdzIYw~^!?JO;(@3!DOg!mB^`>B zR*5jt8Yu`&CUfwOH3z%sM?z)MH8G*3F;{)r5&Js=RNhB7-+T%#-^dCPXnBMP0v@DCoFUcyu!^!RrmnX{L2q1EzoU z^)yA!(y@2im;1bO>yXC;Ip+#ECw52YDdo>$N?@a4gYorEHc(UK?^tfW02c67qts_b z!rF8Z;tA|{Ov3WJ_y%ka#Xa!nQ12E+A~eG;RS9b=CA2CSRGP)D0k42%$^1tuk|*V* z-l_f1Az|1Dn#}V)FK5*82kksU!_+hZOASo*Lj=d4{v`E8S8Rs zxp9!ajq$QfE*)3WvOxyn7jR0-Y|VEaifHAQ914h=U=X7pJBQX0M?qO#)$kL6H`QGU zzp}Y{Tr06FzK11L&JwUpaHvA|xJP*N_~Z_iDN5X<)%4NcCx_sHa~Fyv0#V0~s(7P6 z855zv!sZYnl~B%cH&UpX3ow6?p+Lr>DJfQts&A1RM1nrrl5lKs;lkJ2%eC-2D@wzP zEU!wmD$P)%W_!bMW{5|eJ5OZ__Tgi;nQZV5DjO! zm%Oi)PZE$CdDm9T9;|Kzb#J(2SSoc6c+n^nJa0P+vlKc|$>`FE>nMLMK*Y&H;Hi$L z6o2&?s0)>O7=nY9suD!W3o< zYapIRdEqQqsylz%mc)OmMe`aW64x$n`iFHQ-cPQOf}< z)(r_v;AhX|+(7+B%a+oqF)<{gbe81~UUF-Q`(&}AtU6kh=)-@D*L@x^*4L;F%Hrk- zJ2OzEjr@cvCKiJ~Ut=0lv<_YVG1D_{49#Xd;boHpSC}CPs~r#V%3%Q-9{NCikxcON zBrDH}s$yTE@jDmxt1Np{-cA6Lqmm3;3~ei9=XWvjrQ8XqYfdd-aSil9Cju%j$wL3@ z#Tg-=xe`OSVZ?uJM_iP-+s*|SPQLGo3+KW1doo&vz%wd~p<+|%iq=!5akc0pJ{l~u zk&8^O2#DkTgR;mGke2uk$dFhm15}MFwYfXXi-wPu;RMP9k7W*kGsm<9RZA1)3}AWO zl;P})UFcjbC8D;B$~;?LB0!pDkpj!*^CYx3P*%!#*;;>I_I*ll_OFTvJfqKHIEzQ> zU;qbgXT3 z)eA90`ILX%FhUZ8D$SUK12Z+aBv;p7YN~QJ-IJmuBaz}qMC$US5AXc%W2}eOuX9_4XmMPgI6*H8VAhD6#qT`c;PcNPxo*rmpN3AufN3P<(%aYrnYm+*wH&A)Q@usDh?x zrt<(a&1jHs!3kc$?Bzy8lF7SHxLc{B;V4wYj7Z+;zG;2?HV%$-Fe*4hg>bCKV&g`vwHG z(=0KyvSHBbmsGW4(N+`fnK?7MyO zR(d*_7uO0?l{RQs)iw;jeMYS}0l|QU+uPgRNE0ayRNIVH;nOukaXLo^t4)1Pv2XF2 z%!^9>LL>36EJ-ShyqVX&g|Fqq#Blz$eZw9AgwI0&SUz^fV*{X>)9bwdAi#!6yc~aI zhKY*lt^_JpwkwujRgTn=cBF^k_C>rPl~!MG?Cikg1@d3jFNAKY8+08d}>@RiFc z&($TW@=_H{sZyS2+^2qEXsVByFm3VHYcJTM+ppShO5Fp+6sHaWlS6d>HwS?ND8pUHTQ$=_&tB@XqD872ls81YG(oEeV9 z))D;3#tsnaS983atqi3;RO5fi0{&7zF!lZt7r0*%JfO*Iwo|Og8`f3~BPPt6IYw=m zxL7ozuUlBGIf`6P#&n{4j6zNgxnNB`f&4Se*>)tODuF#Dgt+d)`Hb98 z9d|G8_U#Bklnb)PhLx}C;dq~8rg`#SyC?7Ud-C4kJk52^o3UMt!DN5S`HtA3HPe`L zMy|yyJUNl>+sZUv4o!?nvd_3lzI!NZK+<0NS9^QH z%5ii_h`8<;?HOO$P?~=?@9s(BKsG+E&U#qz11hSDy4xdV7^PLELa?%IJJr3XHF{wk zCihDSjihCb0^H2WzFUIN0vIy{vSer08bHm2hM);xua zLM}ywS!U7j_0utT5a@Y`B9O6>ZkuBc&SL$LRwX(%8F_zJ7@R7{`^WHbkqn&hiqa>- zn1~p~<{2C8vl9CeUK%Oi0q9AfSl&HNV#p`YMz}1})B9D4*I?reuL?owl_B2=ra zpN`bfEEx(+F!M?h1}oL5H5Dn`Km1i%)P{CZ|Eqsc|Eo|9DpWQ_v(o>X)Eb%;n~nb0 zr2f;I)M@gan9Qy>s8m(K{;yxP(XV7aw$-zwd}n=2DyrVqqR`)2|N2#3I)f*5Z7kr- zV_4n9F~X0WmY3Nrqw5sVd0hU|5_j#@x%SE&-a4yBhOky`R(ddB6W7tzs$nYr*Vg{m z*8YF%+M1(0IY)SZrP}0KP#8zMfVlas&tA@Il4nzT)6Vvqiqq?V56x+~8BJ;Uzh<<8 zk#(}IVrebeN*l6ONDuO7|G63vw%wosVRDI&*8m0cqrC#sO$m|P>y@y8s&8=AzBXEh zV-X^m&k#j2^ZQO5y+{@WzKoDg^#VXE4P}3W3*H~Uy0D{09aqPRWsSr5;?FvY7lvz= z%By8^wE~B)6t_+%-@;ho%e^G8w$+&3k`mH(ha-0a&*g)GAAt|@B$)_x0cuDg@h2n9O^47lAGe3hVE$GSaOP;KeLnmu3?Lem2V zEL~``My<6zp~vIq)+ZZ@)~pN#fuOLoM&^?;S4iMxiK0sHqDKgi^5Zn;BwYrvf&Z65 z^i5oI8SJ)G`Wt$$Jzz6at;7MD?Jj>|RL@VBIdrGOArbxY~ggUD(Jv`oK{j6wD|v z+_s}|Oo3t7?LtPir4MU%fl&ynU0}G%mtCPxQY4#7Cv(TZ*(X1h8>I!0a86k=d$fdW^t2;oyo$a1QvfR!fh8%%V>Wq_v0Sxs*&((E95eCDLW416$wg zI&x@(M?yl;eBHpO!d8F7$)qXMWiqug0Jj|kmn68$@K<-Nb zoaa_-J#fbdz6G4n^2d}ww-}5magxE9!<$IP>fxZI6*_Ne^vQy-0je$u_`x!>1=jsR z2^l8@Klfh1c0l(6EhxY*B6OkwS6PP&TytY|5JZR)0v%{UroVr#gn;lO-N*nH)*=Gb z+Z+irC<;TS?)#sgc(E&0_=yU5p`txqmQ^}aM&HBO2yGORM(U{E7GxCq8g0Xi7kgdy z(jDc!1fj;r)74nh50UzKOT5hmfi{xAgteyhU)zveHf#8bR1JL;goAPxlG^~FgHf4^ z`z^|=CdK)unV^5>nG`+*mlZqjmE1>FLQfmjNpik&l2rQAA4oeeOR7!jl%UzribN;; z=*m97xzdqLrgCQ~a_?I)nhv*ZCw9EUtHt!!kuv!PU4osc@!?B+%ixd_K>JIylQ;dtS6 zS-To&vC??y(_EB%8V(w(lb60rGINQbALzY+kbjHMB7GQRjvUOc4zk!3jn}0^1tzyf zad@8yN*sSsixMIJU^NgaCOv}KoWKz4M_=Q1DbV3lAV2v_YC1I!p`Birkfjbn_!A2- z$5}WgCHgsdqVS@hZRWyc{$exX03aD**!4HJZ3YJU=Gf*KfIRx5oT_*(5uJZ_`sv}P zA6%RqAAWjntHqOQ?UU(_HEC$n@mA0-6&{o#M6Nzgkky28MKMOrC94m6CnhaKoUT{^|(pfBhR5a|^GCwtUQGTK(|uYla! zsYQQ-L|7!^))R2GxIP*H>W>s-l&o^hN1pwx~iTUCMM%ZIETo1Jd$!b`1=dg|>>oX=W! z$Ie>4$%@lf8IHbe>b;!|t;NAZN=|NJ)a{}7eRm;WIe@fgBs^I=mRogxCg|g<`S^-U# z$Ntw$3u|2Vm)n(JosO7a-?r9W_3oriDsFhAJh{n!Ok@S@--|2*^A*t-i^}cTLneQ) zUSH}5__06FNe${U?4CCn*5ZcFOCOBAH4cB6OwucGj!uk?*c3W}w-!i=6ppCtlI0_E zlVqg#$L`aiDI{$Oe*}XND|n%fc$dp>XW2gt`6)@wECXOOjis(#R(m+Tee!2^cxM}X z{O0zb(BeWH_sw4t3Yry>~@djqv zb|EVlZKaeO`67vC1LF{UwYR0bdbVG>j~vdDo5TGEvC6(KELi)s;v15zwDNx+G>r6L zBzEg(axEU)XuT<^7d^Y5EycsoUf+;WfXYsAePndaZx}KLR0W69O)fQadIi8PoMIlt zSJ$MUibPWea}9^f%9tV*gsu7}H{_-TC)R&V2^@_HP|!K82)OFkkMJ+PKkZ0tW?ckh zo0axd%aNZYLYy+dKae8rT2p_0Xa|;07{XFG^+30Rmp$OUk2^#BW>b)VRr{U2BkgUa z27U&K|FDEBg|H;)L8$;y=;Kjw6ww0W*0$NUp=q|tCP0eHKSTT^{sMFCWOml;#7R@` zr>FO_w&(D8Y>&rd`}#B!`3pbg35I?v0X5wISDd942mAFtI}nww^}m0jy|9WNJy4^= z4`E@kc|mbyXkHv>_zTwV=@5V6YLf^B49X-@;*Ps$>mKvUUol58*Z!G8%LL6AT-5j8 z)BinqxgN~Y{BtJ&rD;|cxTb(5wT={?ruU8nT4a^+049L{RcA%j`E#a#2W@^Hv+Iz# zQvwgrFehjneJ{;n9X)^L2je8rWfD3~Ea$tSfNI7EKgE)2Y0{tIkG+ASgQn`-hGmG; zP^tl5*%@Srdv+CZohXeHS6nB5skly77T3uGiOWQ>MDhmXLrP~gD}yNrf4S?y(9L1p zm^;xLwG>uRqUT5w4=;wk(EA*^X9leaqmqrOl87pHlL=;Wk;RRL`t(V9(a($blF}Kjz$d~;a<1A5&T4zT zyUZqv*K48(P@qBjQqmX&svaiO3>8rDuD8?kDm|cSx0B0V!E7HJR)2Q77+MYdR# zUw|6J55>jIAW5x?QnaOfc+@&pDKk-_U(M@!5NQ$ONUDES&FcmTh^vjX>ZJP_q*kyV z(9?)b%!6>Rmyredf8*P3^iq*JEmEf@^|na8rPPh++o&CHS1Zh%KuO@rp?pk~H+Nvq zXgSeby7tB8of;a6JcanU-DP3vIlv`C$r)LTq-TgTRyIl+={>pV8C^H^Hv z@uJq@L8#FJ1T84t0?-z6)IxUf3x8D`=Vee3dB;>QjdETKtqPoi?kIXwbQk|`MN>=? z#l`FEf9 z+_QgPI@kkLhp1gYH38>F^imboS(Z1cb{inbCLpaTllOgU!&JQhkNiDs(^<7b4LJMG{uA6RHuaP%hLqD6K)nr zv*@gTB33Jjml2auQ%(|f)$#q%QCnaI?!JGhXwqbujHY$fnZN{{(dm0uKe$GH0`a*w zgDGZeAESWb7G8UFc8O=%)1PieV6~?`y?Gr5o;GjX}Kn0oO zj%*1>u8$>0$r)tQ@sIvEXTC~Q%@e88R=pJ69=xBgE0QIr%OS`;W5s}>cx+C_o@ioRr!s$LdlUUx1y7udGZ zDys`66PL@2&q2QUKc`nCuWS>e={2{Qs+ab3K0RiikC(BHZusPJjmK+Ew&SC_7$v{K zNrr|ncQob;WV;#fM098f!q0!%ETF-b2mB9j@~HV?9}lpB)1pud_W)l&puZkUb~jK@ zuQ`e3zU1y)78T9B3f^;W-mumJg~u;Zvn;1oa+3~Xtkmg3};uL+cCW?!!klq9Z}yuo5T z%GydkmErDvJh{FGo7PnyZ&6==V4LnQ*0(hpD>kXxH!R1I(W|eXDSz>9q?g5N<)dXz zVq3t-Po-2cbRd-|mcmAvTNi#}^6U zPEp$F&3!5rQodQ%zcqGHxyNts>mhB2@!lR7VsI|h(r-l#EVF?D|1DQb>@z(}@$!*e zF00oI%0`?+#=BN?EJa}jO}tgIU^qt3_gel6lfsG?wDg>GvRl=nVrBXOyZiI*1x56*{T9$wY(MB<%I` zM?b-M(cEyd;(qVD=yeFZ;Xl+xte8Bak{vsYHQIZ(KkQW*41s6Wa+0g6W&Sm2=aV?h zMa^0+nEhkHKI_w!E=xgukmR^evK-L+;68){$IAm1tJviLk;RXHvwUfo&r*`0T z_eR|+j?qX%xLRUSdP%5D;QuCmz$T9Fq)oy{0lj)elg+N57YXHiW(Ys1_2JdBLry&< zA-+9}E%E_RE%0LLnCQN+x_!yYtF!__XpTg)%MjXM8*0#cnr5a zGl3qdt(%*_svF>czY$bc373E;cY(mGNr*`+A&fPSxkhhSNBaYhDHWWOygFXG)Wssj zw0mF_=Xn*Yqzh)XRb3?rC$|O#81@GXH9!;0r~Qy5<6}N9u6P!+?F8(5_8_|~Y7f#V zzZ|lgb%k4{kn5xsokkmCekZZ^x9C(qD8SRpWZGMjNBsAHK|Dt-5|@<+L7LDd4P{EI$wKB1SSnLmXnqRg@=7rxs_2!lAKX z5lU;&kn*s9^Ojy@qbaYZ0vLO2V1U78sDLdSOa;r9DFjKErZ&%%5qShvmm0@jDe+1F zCi-%Gb>uP|baRmKVQ0j9bJzHEcm;O8+zag^HSC3}j##0g4P=e%wb-)El=d0M-=E~Bu% zJv%9X9JX^;U)ZYVQoDGyFsrJt%Gn)x7AB(Fg)I7!lY6f4-OUiUE+h{c!{(VE{N+r8Amo@u`PdCEI zRU9dc*Y7p=l`Fovg%>&tcya6}s%IdpWaU?Xz+%6Os+ZLvT4LF65c(GW7Won=-Uu%% zP5?_&+tw!gI+=S?l38%hXex+3ID4Q6W_78q_;^+Ru-gVgKX3_B0+GssPz=O&~qU&c)JT<+i+?&%P63lj{s8P7!_}wZz)pa^r^$NRTqK|2$EwFVEh8 zLd@vMH$-EMlm3uTe|&g&e0=!9qmxhe4?lYJ3513xIlos(WMQ~}1OKPra9#gfKT}Ny z>B$H%q@!mn_#MNyB6xxbNas-g?Icg1d3*o((H-Nv-=E@L#}p9Plg0xtR56MW{xKUt zocJ}3@brw~G{;Cme!nppq~s>f@coy6X>`pM%jwyU9=$uvZ$TxJRfL^if~h;rCL=kC z!Nv*FBo_D~V!6WtlLcO8yCgbGN7w>9j=Q!&@? ze0F8?`Rr&kY)kIVnhS!`Pex$0P-$DcD4{A)9rk?SG?ow$7IyY<%kNMJj-KY%qm(;gfuZPsRs2X1<@^9u$|iZS+d$Ve31K?t8)gL;UmoWwA9od2_E05hdGW&P6^iz9<&ni!bgGIXavr0s?UliY`1;sK~-aM?(aEJ-*C-3@Uwo z4#lN8EQB&eeFwx-$CS4DxG3eJd6MC)I>KD;2LtTH2#d(Y!lrNtqHM?~(p2EA3`SM^ zd12!68@m;9f>XsBTwlpHG7c8kyL3=zcs7j=hi4;vq#u#+ZywkEsG@TLrg0YJkQPTk zd^8SHrE!q1g$5GX$Kk<$r^}cZs4G-ukuMow3BhZd zywiRla*Wue_fXY;>(tk;`%v}kR_mt=uDG+|EYPwc8EK?x{NQ|HP`w=bhf2SLZ?*z! zp!`2pX;5Uf9@}&mTQMxc?+WU=-~c&!itZKU^11ZJ3HCJ>Y4Q^s{k=AlG)6fj;CqgP zNiq)W>9Md`Ao!XW^O4SqC)nE}+|7@e%AQ;_y~0yjKJ@4;bs zwk~IoqCJm)KEl3p^zOUyd_rP~o@8KCc?daH-YC71Fs_oR1q8`_!gOvffh-%*te}Bh z1y36KjdWo0tVS&rj}YP6EYN~ zcjuQB6q407S6GWMZLm&5RdQym=D`iXG}ssoR(-aAO_wD_hGHNE*M3x$V~Xbi6w%TP z*XY6kyf;nU$ zBx)Wc!{Kz}#TUWzLJCG#o#arjvr8E#A0>Dz)4_C@T=&oL%A?Wby66O-XCt2EvWpbm zDcp;H2q#&JqcjJx(X``t&oZY9lwZvO+W}Y^a?G^Bj+#=pTaQmv`Y7_!Ub(T zN1T;RU~nBp?+)ul;W+R&m2EGDfSbhgSUCw zE-;A4nu^Yx)=xcYkz#;7dfDGW(nS# zCiU1$7=`Mcpm{pRP;>A}R3_w&xKUH9GOzK6kdAD*5f&=lMulL5-cI7{MG*Fx5@ZEE zW{W8^mxL5*v>eVh9E?Xp-y`Q1r+PgFt>sAGTeE3DQ>Dztl(EL5qTTOmID_mZSvx;p zGjFt^#mqVENoSke6jCUtDUA6TRCV@$-U)JxCAiXttZ5K0f9&@QWsys-nM-OKKbwJS zUGh4wiNA$vO$9@ByX@LtGlL5RD8_mao30CeP0Y>^L(a<`Keq?zO57f#55{fBGi;Du zK7ahCB4ML97rozrK{&$4NG`r`u;60r7%J|?pI^&y`4u=y6#EZrU<)uUp7^kTQ0M?5 zTO4cV%`diMMHwo(qWGG`$JhdFhoWGx7>n}j5+$PxvmYrED)ZBGd$8UlA_-zXA4Wxy${0L!s0RinlT*CQd}hANrZ6r43x5eYM)$}9YWsz z>ko^aDZShqJVm_$;CJ>Y3eT!1jv&!zgD^3N!7DpI=NpAN2F~n!#DGXb0yI!Fkvo$m zK){A|4hCkg(OwH{oqXQskVS#*UEy+%xdbh8rPE$WSi{*M%hPgPgXN1Op`)2YvB|GM zCWDRWbEpw*t{_41jGD-QA>l>tAIF^jNH$30=$&K;%uu8uZJC`4ft$(b1~|&&$i8A^ z1>|*)^1v}07?kl1?Ta}N3Fx}rI~;;DvR}Lv-l8-@u@RX&cLia|(dznGE56q^W<|_+ zK!s*k`?Am1O{bBfU4kgawL{rBgAuHnC-*7UJT;jci0JtT9cYudOQ#1=EQ=<8{<%bd&_!!!CX|> zC?0X-(?Is^B|X%pzG-%x7jp%D@WdfSHJ09~qP!Q$pG_=b-hb3{K1;F~%%Dy!_@xqk zqF}VbVUbz)rX`nuc!ry+AT7n+8o7s6VyH<%rE>gT&Jr}pDE}-gOr0mWlwIpFbaD-_ zX1WfY%@S(Y2clVaE$wFO`q0a{XBnkf{3`-Ek)azbe(AV-MK$@e5d;d@r|_tpm`YS! zaJ2wc3(wc!KW+TizPd&*rFl3ytPSk|RnV=t<9h~egiefqr&%^glcC)TAmJf8)*(BQ zxCs5Ti4%^}w1mto;bi$$-+c3gVhVb<**<)9e7ygd=cw{l%15%>g*pUVU3;YLO=H;l zpi$_4aPG{0WqA3|4Vzh3FU+X2R=qHoo0gE#3n$Az=9zEN3#Z^>y{JgvM!&48E_0DS zh!(9H=CrDRlB|F5Fql;n+`+@m@=kr`yG}_02ak$G*Q6EqRD-`F=nNNAqIQaK2Sv&lBzc*i$xRQ| zzRM{%FB{zrFFmFPYr~6#B5|^jM&)48Eb?7?Hiv3|k)*a3$fw%?akQphGvl}ER>A2# zZuUI;(3kO&i;BCL58!n)oV1g931TtzzW5P__gAB;xWMpWPS)7x@=5Q{%mYJJT{kikChQQu;a-OZw9>BJ*;BGp^ zY}>nknf`TTwY1R#$qKadiv|RM`)L3mc<6TLkmR*CJ+HnWVrf@{ziElOYTzxfz-Qp3 zx+)>rq07IbRT*g2RiHugFpI%e~w2?tjYrwKd zRrn^1T(82QH5A{jy;}1l7Y{IbDB7lwaGKht*E@RkBRJUJHUJjo+cX}1wEy-8j}D?H z8riZL$o3w{`}?dv%poBkWaEt$8d~Wb93B&)Roj^)k3f+KIG=Om!EWrcP(PNXb}oW{ zHG6xuNGyQ>vU%s^8?WmxbbDT9Nmt_vo{vSO;G=0hdVZSL%{UiJFiqkxfF_mm(p;{d zv*l<2U0wGt#M98U-FC{E!S3R5`PKiQAy8)FCj^Y_t^3PDVN0|ht~ z^Pf@&QiETj&C;B@_78TNcICs7=Qz)Sq|{$X>yYd4MdTIuJazG z_0Rb_xgRN+!<#&49O9b%1fb)ITM+RBIU22|4oO)$_5c^^q)Vh$czkp~g=e7lAd3q$ zH*D1?k^5jhCh2)zaw>NG8AB?6em3i|ZFo@~qY?v>=sQ$83>=D2((9W6#;3&yn}6ja z{mraoOkF{O0A{lF0Wv#fmLy2eiC5_ldlIbT$7aJFRd$?StGLcPg*MyB%_BJ%g%H;i(N{}F?scGYw;)9hK9@J_bFWq+?&BS{wA)>O%Gnz-$nSl( z-|NwQsBy6dvQo5|y}X565zY=QDfUe@ti)@**40OfMR+>B_?|%4g3OSKnex6%%b!6( zv{B>>q*Vk?h$-im)8jgAchdZTIz*dqKY;BNCM}4P=vCbisyeq2jSS)%msEO?3)YRG z0?lPYcw0u;LLbI*ZX*wWE)(fylnA$Jj}DIZqCC5n*$r=!9=m#zE6>Vt5u#{KF;z!a>1=r zt6_9UansC_q`UUn9KA_e2q=Scfpmo!-6Jii^d4!^Be(q2mY*&ve=Ft9wbS+2O;frN zXLU+w;WbUqZNWX!bS*Sjtj-alSb`e67{-H|yC^%q!HYtFL6dXG@1kL?q!rypZ!Ff0yIPJu!KKhJ2Lzx5moW@jX9$D^8y%*Fpw1Vh#sS|KNEH5-jDVc}C0Qq5+L)v9w4VXT6g!NZ7mqZhe? zH+?fYJMuV4FGguvhXpWncHzK{;vod0vffVhTrcV|QuuIx=+yQvMX5c^-^XkqY_qfg z?BYkMd(q98Vt#6Pvd1(Plhh5)f5{t2;)Lzb+A2KGABq}Abvjo;;SFyvYn>cNAMby1 zf+Wbc6T*H#`Md7l$i*@X!gS4_=gHx)8`t#aS!~M;Bf<7~V1O96l zI*KLcpU&ui!pZvPm#*HKtAdKKC7*_`GMQ2VV$52bn@x)lX)Rtq&9yikaAQ|`O}NEN zF2D8Zr)q7?#dfGg`|px7 zEEj2R#5W8cJk^TOoOe1_GqYAPwU#%xT$76{;(1Mf+xk4MjA64iz; z9M#xp)(@d&LL=w`{1VnTv7CRR#xY@5)%x_7X6qt)M8|}EGfT^vMe4Mu9#+dLgZ4u! zZ6BR~Z!R$e@^H3tf0^%;GyS(Kb{la_(c945_5AGa3(77H)`C&KrtOc$59Hj34Qy8e*M;MvW z%iy~&ufuS88~vmwwk1%CkBrN*F@gomJMSNVe)L#vc*%LUI6eUP%a5?3_)xkzjZR^B z#4?3m>2o?1-k}7elMKP^S|D~P@#{cLC%+dV#$=ZsN)HOb3D-V&^GJLxJaIqDa_FC2@XpDMC;m^poU05L{gMEMg^M;dbs?jXISwH zF51kuF9{vc{{I*r0*cNPd?^`!s3*f{s|`(z7GaCRs6rf_rqk$x!wJs#Edo&SUOFl@Z+B6XzO(=7JNw6<9#@++MD%NF z?L~@!{Zj>?0y#@25b}u+k0v+pfj4?dOQ*fr`=tH6{9y3mIlYJRBgB$_s$$Fz%%9C@ zw5ZsSBRBw8DvwOLVu(LvBzMh?Lg!k1AsjY1j$G_vfTj`b(GbRDJ^ZiFoN|WLyM|&ZTdqtOMW{UPp6$SCk(n)2r;}edrwdRWeO9 z9cQg%Fr22JWxc5;XScmfv3-;bVBKB%&VI;n;oYB>NFJv{c$@3}Y;bki*Tf6}_j}-- zDkWVc!@=Z26DC)eAi=kj(+NIOqRgF~_6Jaj4-m&taekKE_7nbprnJpPUF@SrpY0#) z{{uT1GyWgxULU0cXl+%&vv-owNP80A{g|FzYA+gP;Q##qSePloGtWE|(VH;+(+P#0 z!y9~)F);deGQtpP%sfkP#?kZ9Nt)xegfp;xdRJ!8J}d(e?_!`nMvX-W^ezs7;@ue+ zkbGUhn>TBWMxnWXpm$=)3pB2T7rjCQpW^@Vze0mVT-3F1(YVEE9jSEKM~i7vq1;VE zY?^$h)wIv}xx|V~J8hu9Tg(aeSN8TJl}>>TCw_jRPOLA|Xj2AF5!;FS6azIaG?XAl z(2V%_xSjHq4VB2gDE_&mMI@8h94z$KOk+}<5^UmXg5VYKutS5;>QkFey)la#}Q8FKaDS#WjRNy+$2@bkWnW>+%8 zAg?cvK6>;WNbifsM<12M*N`HO)(nz@*K)}K`~UblyGjvX^Z3J~_aD7;^uf_5@#kOy zrf`Yn04Ah==7u_Y8TymS5G+UF+=tT zkAYJeW*WygU|i5sN*pS;7~=C}Gz5SgAleHHpTPP}QM>n}+NNL=X2G49wrp`JW-IFQ zt(d+mF&9nlae2DrnPGt2*{>IOE59iSgvUgu6=P2=JzqYvfSJgCM8sBhZj;rBjKR2M zd-Fzr4`26ln*YghgR695ncu-SlkGaD#X?3+!=qlxY?H;AL^;?xRWNdSlCZ7kNi|2U z9NUWOmi0sYY^mM3&Lq*EkY=4Hm5SyzH|{ab0-%P6xYf!=ZsJ$Phu%hCxdvIe(BR1V zL)77rhPc`Zza=P^9>jbDndU0Xp1Yc@uhSoY>!(x7M;X+H$8W4f<$R59ZDOWQ3eS0FCS%(1w_ULhsCQJkrh%n1!9Y`GtsVvi`g7!I2Zv9MEoI_I;PBj z2Kyl!FpISDrLdECq()Aid{Z2?iU9dVZx2aPL@3A@oK^3C_})zE`El<0wvh5pXsKj0 zH|7JPni(wdPY}}yfuS~WT9i4p^f)zBvmUcs9S7gC=6d@T~=TmIL&^4D0-8M&m{X{kA{!gi>!b{&?i24rv1*12efos zWmG`S?Hsl|^>hU>gSUlK`Mz1N=(d}=H56;mXqLxdRMs6f6w$(+PN6LTVqMPRK#JHt z>Pp?gsT{jJJB2ZXdDF1HaCCyLZ`yy$rSj|_lueAMqhs`5^zg#XY($1Y-t_Jg#q3};ScWH)Y~Q$K37R2wivQ3XekPJL+vg>JlAE7ss8frIv? zsG|r&cFg&Y?efL0r#{c%Y}_*Ymq`xdOotVLs*9)<^(Op|inbDLaSb?}FOKQnRh$FF z3}Y9eUd^#cHU}KB?k@)oc5wlJ_77jV5$CWEou{LB2gyZ~Tz>C-vj6VMca1o^ z_QtXeQ(fKNt7+Q`9Wcph1Fxg+w4z-44o(?s?H2oEaMWUBJROnlFC!imFb#9df~$17 zmjug}B^ypCOc4Uu1SJR$i&z}DygI+D@w&P}t0pV9bg;#WdJVhibjkUD#R!sVD~Da! zJiEtemHwFYOB>&3gEScxR|VbADlLS!uAr5T&`=A%yG6IsSKLpjS$re4dKv*6D^j#! zHc|vIs_Z9gdK6hNwdC+0@E^YM^H+^&F%`dS|#Xi3A)pN-f2t0U4h=--rbHd2{X1V@MZ~kbGN+{bE!>%-F$7Q3u%mU zXV(I6m4LUqTQ23T-8p=3m!P*^-QA3Z!x`T@n{5;YM%@3swj1+No+Wn1BAnyzT3>(6u|e9Z~+SLW4lsqJytFy;h;y?ONKM?o69@eBBl( zcQ@M#wDVeLOIyZ&?X3dzYPXIg@Ur7{Qk4;?#Z0}+GHNTI>+NU2&(>B~MW{5}uQ`&f zZJFJz?e+eXo> z(zK1%>>{IFw2WX^hb;$zRlAOrpCEv4BO|1PplkKkDuDFqSN$UBY#IdZdIVc@IM}ir z=$K@BPPZ(BKYx&>SiBVm>D{evd$;R!=FZmc*4FmIK^g`EP)Ze@Lho$8rpb1Yw$Npu zSHU#Vj%3GwW(5M%q+P@CYaN+=oq1uq1ijgPRY!|5bk|3F#|Z1y+Umj(-F+h*drn`pH7e-ozlC?vdW|$$H8+8dYYD{yW*Hm za;uJXBho-OO`Qq5Yv`&8LYFplChTaSVIce(s-IYH@a~i)Rk}y++J>&DKCPuy$t#vX zjB1^K3))8KwI%myW0YtXrO(c&lFH#S4DgetcGq_qRw0hI{kEQ#E zs!7F5dy9589bWPPx~P4$>#7JrS2lE=7dxweF*FuGA?VtMo_e*0!Ym~BMCzPr3!VQ} zODNDxr+z!9WyJgniJOL-IJU%lmSBZ|&$ts~>pO2E)>6cO;pe{y^Iu8%C!&%z@SMDg z`-t7`BPK`nD+-jBo&_ovUen>=t&1uxxXfc{1f_v4oY-aHrWR$X0WOMAtE9A`G4%<5 z#tn3CP3FPAMS&4s+S6d0rnZ$<7hF;@G}?p46Pz}qRJlXjsQfP}jX@HtHJ_CWELmKJ zT|3tkDBEXeGU`GUQ zQP*|j$cEZY_jUBoZrn0(Rl2}f|Ac^l3kIeMd%{6tfYXMPb1-ZRFzqg~vb3;fmQc_l z;u{~=Ma@|`P%CTTGG(VRz|)MUB&Sps%I0Q=rEH7xX+swL=4r*TX-G~Q*S>6F3C=#w z;2C!V-9@bsc$d$8-j)4HW;Xw87$rIfoT{9S0~(*GP+HtVF{aZZ@z%bpuEz5L8wU`fu|YY zc*-Vwk`ZX<&Mnd!TI5vbCZj(gyNu!edaZ%Nkqq_?C+S=!649B}(76;Wtk!ADdf}W> zX6(b&KD9PzeKB-{VwWyyG+=7($mOTaN1$mo zI7n3^rX7x1*#dqdTwlZEURT_%i7B?Ycp9%2Ckl5tRSH`-yC5wXyxd2=lH!Xlq!GX2 zw(q^%lG6uM9My?~k?&I){uilJROI-=hjjpI9{A)rEDo#_j zgiW&v-FT8FqGHXBohpmF@dbFX<$?8`)nWKj@L#9QHUJz&v!SHerB~I{`@P>Kjz&6W z8IST5%saQ9sx;4kc@}p%a14zVt-Cb|HDJaa7I(s8Xe#$yXsQ;CHK$JOG4wP|83^GJ z0;&YbGItyhbx2s;+JeSB%pu3nduUHA=qmHk&LGFm3!BjTp6>d{a5sB`!>XQ2GxMY) z&1^V7aqkZ_v7v!Uq1tmYs@JEe=yq@Dn*u|?2fWI&Wt>ufgsUj8U!ex$6(RGFtuA5u zl@vRdVjIu8moB|JC+(P}AeK&9?%o$eHJS$J#@vF&I)d%U(5S9L?q1l?<)n0>(IZKR z=Vfq?4CHcNmSO11hAta-uNZA<;%pVXB@O|B+ofF_9=S;i0e8<0wVJ>UKM00zPw#3bJAyre8_3n zdcToNM;act6AdX8>>E+C95=Fum!D`H6b;85LnG+8L~tUOq0zi$A`D$vC30{!hl5Xj z(8#;Z;61fTouV7TL>Ri}@+3U1qlzzma>Fmn!A&fGO4VN4*bns=Z4xDpD=)_&8r;yH z3wXb_VTQh+1ZiD>wpMY<;N6z3NpAK(DQR2&vwGkhNxX-63tb=`z>f4sJZ&zL3VCHKECr*Mc+5QZT zjTyY=2=;AJloq+Cp_f{_Kf`_7QgtERc4C%)v!j;5zHLeOshLHFE+$-Xx)Ergsp;rx zg<>~hi1UfmxtH@v!k=YmDfG$!ZEPd#PsY7>yzP|(or)TS-=-w zcx>}n|tjUo3po%+C4^6dDN;NcVn{z`^D(x_bA_zw9AQ&;)WH%{oxsYcMz_`?amxqI4|d)h-?a^ubTk zJmS_e*e<~z>o;|)lYoYEo;QTFtoVD068YARV{R!|m@CW7t<5v+!p;XD4FPn2J@rCk zhvr~Qtg2D9i9L=6y5geSSz9wShYw~Wx$V@brQj{hZnIgy%NfbQBlKb(zf#h=Mx_s&Al3_$G zN!H4|`o_ksh@LY!SnhSOs*YJhYx!lL-^gDdS(XDQ8Vf$0lRV~ORMIJbH_REH`f+X& zl+NdS;E~Gxh_am6u2SK3>0ZTQD(cB*^nDMfVyRbi9hKp5Uq8z&EmQkv9PG|BkleVz zj}K0re8xcVRZ)N%pfVjkXa&$^<|T<|00w)4*tC(0n?qcMmZ4)>Y8x6mY#3+?jtBD@ zfKm%6Ps0^XBdy_mt`aGK;V*i695nO7TcKyXEOHx(LQreZ8N=h@k#N8l0-lAdYWX+TSpO9sOfyk`OD^U7>AG`aefgX<0{}U@De`pC8#ML z66q}raFE9^*dboyBR29ee^T#Zv~eE9;}7y820P4?JmmaJIoP8jbdevdi~LXMB0pRg z`959b@wy0qMwdQn!%>*}b$<-0F;Ug98W~dw_fd{CBPXeVHKuR~81hk-uNoOw_4be& znNC>kZV!BL1lB+AH=-UCR~)IKQMFMY>1fN$X(}U)iY*xwE3Ph5LnF(gK3XH#35%lM zIRriF`F2>lB@K$~ zQqs_WxE7^@bflO$QFBtGGWrXP71@@gp|L$l2dx(Dq}@pS@k&Q@zBXW29vN43^Z2OJ z+mC)^F?gCX+`?y693gLv)pz3~3v(|4A@M1Tbo&v%o=(KI{Z3$wjH=nK@iB$FAN|N? z@FXR?jc=>s2zeu%z#1P{(R&F4|8wF6z1chk` znNgqNlQbgwIJfGL)Ip46NSL@@M39iHg%froUElkK|en|ZtG z`l6fP_uJHriZQAg8(~!!?P$l)F?LOoka&AdYX-&G){KoZu8WxEJIK7mjoyo{*r6Y= z|4bX%Y{q|ab9dAAHiy6W>Zcd4T*-A^09tdrNa+tu5-k?Moxe0JIOHo5D6?dU#q z=3$MO=k0n;D#Q=!pe{i$YEYuR`E|jQ}sbEaQzgf#Y(uavMKXm4%*V%~BhF;x`W7xEC@` zCR{7GtyAYg^=7#Zg?9k)yAv$&LI2V0b*k6@<5a3I{!SJsPK^2c@oT z_`LAahp|H5nOXit=OhTLG5xUCCpJ7p_30004_dvE3BlptB!s`{v0N~JT{pI>izbbD z3j%@Vsb5z`9dQICg-AB>8N0^u%@K!HP%?p6WkxMFf+FxZX+Yq?N6<+00VS4Jyyh16 zs)>2)x^kV|Ck$e@iFmLN+DNlZWT!|arW5ZRLB8Gctf0nehyG76hNz;7#FW83(Y{JG8;MImc@~IA2#bcoU*NwZW%C;+&7& z&cjnPMg`Ptz0D{KP0jkP5pt3jjkV*X`l{Y7WQ5Ye>ph87+bk2ri{i-1pPWdvDTIa>DxcZrlNebsP~ z7USWUi7EscAChW^cU~KPy3b$-bWjKt82FV6u!4 zp%olV$Abs+?19IB3w44LR8bP7g_i+25eztRQ3SZ-7wctv9XPM1e)VvrQ0~z$9k%Qh z50g`reo>K#WXMO9(IDQdT@ zxNk6E@TMqbQDDGJ1`pP8plwN9GPpXGj9pLGaSV<_A$`o#`OYEPrxrNgI4qer;CU7T z&r%zHlFQ{q?CJ1jk8P4F&Wa=+C}9uAd<8W%mkn=t#*?+pBjUpV@7L-|+|HSU&1E&SoHbtRI3L4fq)DBb7qsOxjD z%b~63i0yTGypYh3pbm3TNgarpM(DtBaO_Nffo{5JtuS`H)+%BqrWfJ}{V;qPUbYl6 zC`J9jQN>5j9}N%s{;yV6)=Jb75pvpMD*!)`UZEz*>>B3>+WB1vK@0P z&$V;M{9{hF14W{$_Y}}qLred%e_x9pBX+eA21#kGM@8&s>7yHMnK*PW%hON0f`oT} zurOh>&16`P{X17&ghrBscCCcP$YaFFG2vkH0R5$_^e_o(6PN4FC5P`}_fl5c9@-Tt$Pj_E!`SdUQbA%oI_5zY)u*o5$~9Q(6^i_l2&Co+PKAde9vj~6445+mPL9n|4as_;WqqWz)KgFKw&SOsN}f($dG+I0U;g;b_uu z-5N`ot8T8ADp%d6Q-f*k(k;5{yX1C3ONwvqlGiR?UMEXDC-~~iFTc7@+Qn7!V70ux zA;9aTy}Vqmu4an|$q(&nw!8&@)^77~d9~Kd9`)zZFJ5XFi*A*?dEGwfzB(I^zx-g; ztvjr=i01ms9dBR0GHbK(TOYiB&d|?4|2%)$jobadHw2R9w z`Gg3Zk9!Q>f;&ZSws`uR+u3|$@pjqXwBHchGre4V<>il(&z7tC)hPMqc9XPMS8KHf z{?^z~4YhUp!Mub2B|o+sBsfU6PQJKX-fnKOLj7TO)h)j|d$`%$te<`68TIq{o9>yH zCpS%Y^~sMPJpJmqTJb`E_?tNvyNXSlyCtN$*=))2pT{46Tx(b+yP{rMPwjL#~ zbnDrJ#VGk;wS0gD{xw{X_WG|k_`o<`gpc3C)~^`hbeLQ%6WdmQYV~W@)8Hq`&U+V? zyMe0N)BoZxudS~if9<1pf7L+dIf#!Rc3wzm_uJWG>kx>TZf9E6S7@)mKlIkEwr1$A zOxs~RfLXUKG?a!3JNvhA;Woi?j0^%9UZ*(zb-jhAAl|gA2OSXTo(BDL)}FI#Y=ip@ z-Y(^a1+%e7Ymje$v%0-R!$gjM*<8@go<7_RS5;`;t`%1gJ8=8B95hBs{q^j8%aV_u z{M^NhI6^S}tP+m|dFhUf)ZWfFBNkX|SNCqDX^fhacHYmS$ZTu)a?<|L&gShm^Ug5$ z#`4GRhi)}W5R=FOi=X%h|VovrESc>#rijPJ9MJZXyIMYCa*~1`pP&Gk7CP@NL`A@q~!A9Q5RydkXn35 z==WG0P^u3FevZYUEaJnVF8Ct3a3c8%t;`>~D^mt=Ny6Tu=l$7&ymUwD%}sZ`{^Bc@ z1O=fX0yKqRnd}L}&2g=Vbd>z~aE9p^lX17E@@9sAVRwM}cD4c#J%qM0)Ry0BmLWEM zmQ0T^djgM*-b(3SSxn=4y~W?EF83$zy(xR#W|YFyqpC)ztU*DxR9`idqL6Jkf4%xsi)Zwx^N-Yb)2-QAbni3Pe_#lIGD%KG+(k`c0BBE|ny7P_bjz!jx& zoxxBZA;}XHngZP^AVcZ)e7o1rJZb9VUA99^?aG*baJ}AbgjdkSXjoYXoyHE>3o$}5 z8-!Dnz&D+tz?u0NUVl9kG~QfXbw4G$`a(T_zPQ|U${SUoYbfYR8CH{wck}L={LcuW z7#{V!zookzYQ;j+vs%*_=b0@~C0*BoMcLV;kA z$+5^^n#!IW4sfvkgNJst*3EHowOsTHy>`JX0G*!6uIqMor7JpSk)hi8gXIcrTb$6B-y^ZyM?J$$a38 zk{OYMB7dZn$>{OL5HRaPS8T52ZLyh#X57$V?A931q<4|rtd`$sYl5Yg7LaPnH*UbC zz<3CZ`gAb3E}h!>&BGQpdN8N;(dI{3f5Dd%l#duszCgnXuuY!sftc5nW zS0F~3S(D5}3rsTzS(WM#kjEEOD=e;TXS4mQRUt261h=M2N*J2f3FGT zN_Ax*>7wg&@uwRfTM`z>+@xUe5$T;lSKR~M6Jh>Ts+F-~(zy0N<%j|AQ5bqI{3gKQ zkX`anug!J5jg)Ce= zT7TI7fGQL9h#I#tDq4>u)&%)#e}2Uw<}^a|{5Z}METOg`<79YSU%mDE4b3O$CKCvC zl4UyKnwyex(mHW8TkB!Sv1`op-*u3EhM&!D8Z(|afFkC1yTm zeAecB-ri9)w_0+O#UR*a2%k5Y*iV(mWhPBMfJql4-VUT&nK zQfvkWpG~Iq6Qd;8A9H*x)W@d5$5MYR@v+h$Q+%w|#|eQ=^hW|~)W@2@rurj+WvTv5 zaG9o85nz_<&jguiiY0+&f2IDcU@QGOeL^aaR{(Z4pRGMA9MP1fW-{5+(tUL}75xl< zrg{V3%mv5R;2cPgI-RS?avD{tiL?)xKU$G(mNbI{jn^k{b*xD*3WRf>pyE|?*#+jZ zlSZ_j#aJy+GuJ{q7ZQcbZmr{6&kj1i`wRWJaJS1>Y6?%&C&Xk8e-xSyk}=g(*VOE5 zB~%8O*;?fq3hVx5zG^rnrc^tAg;D+daf-BYLpLWt5ZA-GL+>NpmRLG+g|3u7(%*km znix(imeztPW^zDsQQUE3M`PY)nC0?2kzv3m(t`?q{jnP58KoQbtw~3DO&Ldjt0?2> zkJC}!P|{J~Z~(!Sf41nSGG>QP%{*Cz>46>Y5(WTv8O?K+F+-$UYaeS1m4{p~GQ0oENTA&R_xpl)}2 zdmdwNg-EeuibJ;&)FgGur{fCiD_YYS(WpbHOI)Ypd)?mAeGLSz(Uo zh#dd6o?WS5&_>lCzh%`cpZ4a@O0QeCEE+*t?RiS2hMIPq{uHh+ar1~b8lOMFXJ|yDE4Sbul)eMn}wsrajta!5+SEGc>%~y$iPX0#S$WNYE_k7fDCbi$_ z{8`-tfBj&ERPj@{#s(y8ad|8;zkdYZ+<-sodg{Adj0@@wY=rSK!WiUEgt5yl8}s>| zt16zEgTRTg+o@=#HDp{{DsNj-8Evn(x56ttUbR)c%^0)vthC*khB#05aH4cb#28Bm zx7POdqTk!|khjl_x2s@r_g{QuVu@#AZ2=4we^qMI(t4SmiBXC$T_e(^UNvc=A_r=1 z_Nol}iFXM2=>Cb&QS}8vXV}K767aI5)5%PRI2XJCx6eIrfHzXG1mD=4c zNlD-}+B4Y^1^j)trE~8)4c6NZ^D6Sje?~Xn^x%(IEy{kiv@pqqZVWG1yx&XE^R57D zcUP%Kzjp2#qG9ri=}tcN)U(OQqW=qFR=0} zrFPI@OED$WNgcbQC=mULw#h1w^N!O3yk~|axO>#;d(6g@U8xCz{vYIq#W07Re@l7I zC8Se?>dP=JrRc|ZNsrxb7la?HoxHTmgff~MWp3#O@*CgVVN$PLuE)43|1s?uc--{b znVKrziIiRd=tY*E!OUvBU2#Fx>wWcT^(P^t@AtQN9edvuS+m31-ODXetIZ&N3~ye+ ziS!ipZhK>v-+eMOGs@w2+jL@Wf7~w22(x=#nQFU%ovuj{`6LB#;Jh64*hmd=O^l(7 z+1y-}CXtt(1w=I5ZE7*_6%;tOh0bUD;gbrHTdW=5DwzmsrTiFL)o@)stI87%DVgWQ3RL4gk#ne}U^bTPARo(|>?~ zoUxqW!ccE6uu}V>odc>!`@^2?KSFYrz+t-NTn>>>hn(Ry(0m;jq#yhU4B;m-LIe1* zkKhP?B!h>r;mxT$WX5E}75&%|9ja5st*Xwk(%Tl+kJ%K*%A%{gH(&87{aI{8evP(U zot@Li?bx$(hZJ^ofAZqOA~i}LQ!LPj-BRE&0spkxf%Q&D^)cf}-e{3sI=!z>34p&` z`|If1h0hl^E!_!!zURtc8N^#qf{aNL_82p%zlI>Abf7^hlns{T-Y*Dj(a3o0$; z(s&i*zgSbJ^2m#C;W(#PvO@cB*YP8)sE_Uzmk+UjeAn24%4QE9{7F3>s32zNV*Qu! z^YzyUa>QeJnT;)|x^tvH%@*4SA=cxgrk&lib&w!i)H~p#B>HDK;i&>WV(K|o*9!H2 zLD%7uipwXif2Cwqm7E_2jSH&C>ti`?B2*X-3wDE8fgTt0{|u|0DncTr!lTrz@c!$y zeBfkwgr*Kv(Sg(95gdK}^`Sf+Js}>JJi4n>rj3JF8+PLOSFbnz_SA8(sukw{fToX1 z9|vmda5eqG-qrR-Qp4cSAn_lDBE&8Xqh1gAaH5D(f69x*n~nlP$BTw`udHsnd)jG% zg38a}Grx^r!sB?ejwi`XvfXWa&;yQkk~ofIJ5KC4E2)r7tbY74AFoZQkyrURXhs%? zJt10IaZvj#Dp;`8a3wn24mQ38E%X}h#rlVY%4-QyA_-hY@TX26|9IY7XmD!w#XVg1-h)|k5mh)2b~OH!fy zsLsEdE}};+_9l~7=!}VAg&Ju_CZ||efRl-Ef3Se1gOHb2GT%x~(k}XR>Erjy)|dC| zvziu(r!_o_0|D-N9`Q5zs3D66ye6~{^U`3Vm{eC9xa1FFW$5$;hufLka_)U)XZc-R z!R(m2;MdoRd(up?g8J<>VGOI2G7Y!%@LALl>P8SREhPk~Agx<*5Mm5eFPPCWg#mFuNPpc!4iXLa*QzrR7;2gp zc}e|J3H%5aOUQ>`D6t&ThTl946iI-Gf0PNu{Mq#A;8pf?FSC_WzM^wIc%oxN)Mr>O z@hc9Wg*e;DUn|aB_azCd)I-@Bw4lmRWH7?{x+-k1)~5&K=74fNf_44EYJB`-@pkd% zHvjR&CBof%HVApwL<&jWSWDfjl?#pMiO5A7n6F1i_k&>QRXdC~3BnGESAmGEe*p06 zHzYj{m;7FcNJiyf5Y+N$Kn#XS02F?zNbu7o8oy8{HpCW92lyv6@Z$Agf5q^Jo#HhO zvj~H@2!puD0P%Ym#P0;64PaRO0F&TN+%~@lMpk2wseSM-3pdoguei$q)0RRyECYTg z9D24)I>2H=)upNuUZd)qySpTzf6~P}Ub)Dp{0T{=UMH22B!42<$fZHmo2x;k4k=Ih zO|+*EOVp>&k5Uh)%P$~iJHT0jFE#E?D=hvb|3DIl1V1z`-QQphg+YBeo}M=r3hs;!T;Ri=?)zm^RaMey zDslH&{jhjSS&D$Revbi`?}=yg8SS>-wp5>yBp8lZPa-13B7ph_RBVZKk39KE0WgUE8`*6!d5fCz} znUpcD&D`3IaK#0T#t;^*9`Wkuylmm(KR?Y!^%E*eFfZ3)b7E*diZYxy5BLY7>iC8J zzKZAvDVpA#4k>#{f0GWcvS&nI(aI3{KC%E64YxW>Tw~S%ab0+IXmTzix1f_&NB6uK zjp^d3dKuF1tQht{Rxl$|uIjXez!x~qy9eEIfw%{q_CpRgpkXExIOwXX@)PD zT>0pl=P-`ZE zy~yl#Aw+o2f3VF5JA)Weq{Xfap`R?qQML}E7(iZ>l@bJS-~i8|gQ>skH14AUJfQ0!0>G@527osZ&^Z*K>bugkZ~Vs1yABE%Kx?Ie zfjDr%=g@&0>}u@vG9!x*Z+M-++EF{@*4QqK^fHzce?z(&=@xrAf6=u+xIL_as2Gpe z*TC;ShrTMag%3(uGCGt|rXjM@CuFadsp7gaQ;j6G^wK9^ZMIxz;9gGBTWKh$tZP~w z*aNqtw5fC(?7GcUr!RFT{7jli=(*BtxQ@+zP7-KesGfUSLz@y`QQnN{bkHka>l|=S zMi;-{e>nhsXw#}1@yXGa33S}jhP&_C-E~`{p4$IK+x(&WyL3$PRi@p@=*Fkr^m4nV zU8UkQzvNE4X_PqaPF?FX?wxks<_~Ulg=r5dYjs%Y@5xeLC)vo8U{`q*>=wNTc1xZD zdj=l^%hfO;Z}4I8`IR;4k3ffm5Ei}q#K?NGf73ok*fWIq`dGV_<^o2Z&SSG{af=3U)_zuKBT zlNkIwn`3gj8a|St!0FpxB@1A+92WnOf7Q;?6s_G~ErGoo4cxw%P308SG<>jChNv2! zM2g5skq4>qOiD(m#)1TEl^=o`mmmA{odgAIKT_05>cDG)4!5tfKip?c?JlGsHX+{p z^QrW;tKOR0yKOK^;q!690D^Qo(Bp z>z;WrQ{`-4b)rt<;}^ldd`k1qe=n%XYd8!Ls|K;nVqzI}nzxe3j;eon) zZ8)N_t>rTX8@J;9KK< zLeTU?1W@v4DmJu(>FD%ge}*_dB2Iv@mt}*538EP`Eggtz+8>;F5Th_C0M&19KKHaV zqYgLcvcXUwMX6$O@Q9Lx!^cx^mh=Y`mdx0MFdr6wda<|Rd))VpUF67IV-z0@B2CLO zFg>Ln>f%=^j*mx-r)Y4$f8QOAN%ugzKCD0RQWR(OxBMXcO&GVLtF`XRk8(^i9*Bvzpue zth64cWxS1GB-w!?dAGum`oi#{8RC6l1j5$QY5{Iq7B)UB-7LGr=H8|{(=EE^-RM-I z1C(iy4=%6D39C#r&$B->lGN>4nVGMqIdgN(RHikekIa*a_ekg(DBVx4P}V+bnKE2+ z&~J_|D7uNA+~oMif3CPbAvgMDVj5O~vBUNWh&}t}>c!jRQ_wGQp#J%zOhJ1A=zWqi zMm6Bv<}Q8vYk9@NFQAdLH6ul0jKtV6qQDAje z^EnsZ)QBRxYS>`vgP%1{Up&iNO~W=^bnWqst5{k?fnd#Kf9)!?=kVZHdV5)K9{EUK zeQQkoqGjB}Rw+NGeOB8`;D`l3tH)FNXkRb2FFo@6l`vsf76P|pJg7PP&7d$Np~Bfj_1aIQWWP)iau^=WWSwfgC=E zADs+;Mk6ise?Hd2#39(tBd9?81XyXm;xXaVoIPi z2==N1nvop665v?shr>@+;8tdL3P~(Rlt!}63nsSYe^xTC+;56A?i@$koVFZaBBOBl zW=zOW5yWlzb57Lh*@QC%d*-hgCcP;fDR`Y!c#dw4+YYcBwcq~TKdju+XfB(KiAWHp zCeenay2{#T*nt7dxV$mdr=XV6F&GX<^tJ8IRfe}~L!LF+~tHjHq;u_5+% zoYzEbj5;$cj9(b?o z5Lp(2Z+4OK|7$&F2AvyDSI6866eIz}f3YbE47|DdB=L?(B9n8J6dA?-so4@R*S2N zFd_6#jtB3o?idVRLo6ekd8;(Je^!ALyjfLfqQ8rK@gCW2nHi{!N24gZ<|TW*wUy3} zCEfgVMtw3}&Zt{Hd$LH&;gjW$7E_?OjgCa3W~a*5g0dQWP)b4-@ek?HW*wZN=5Y{{oN z+Hx`Y{BK{K59+ zmX~!o`hH)}iwdCMwWU?~r$?n|_^{wc=w)0%s{%bwUlpjATrm81Z`8!*2XzmAL}n2u*A ztc75spZvVYe?26m*2yzi*B~5$>NO*rae-*~VG-yyp{NknT_8ulyc*iJB{rZpMG++g z@WuIBQ!I^zL$B_cxqr!@K6N*BwG8)yU_{xtV%2}!E=k#1VW%Q}M<&xl7N@d2=n!*X zddboEDCWhBGGd!V{^W(5gb^#eWhb3Ft+tl39)FvXe|STA+#%GK3%i=zGn`<1TN*b> zodRzmCu)iUlNBpd-R+6G6DEu+E@iOh*fTWXG@GXD4zC9i(%2gb-~$VrM%=kjE_xsN zk1nk24WnKM4k;yLX=8mg>RmdrPr)mTf_lfs19#lL4ZA-f_@&2lDKJ)cTpFW$EuKpQ z=_;F!9NV901g6UHfqiQ`2g%<<@-PIszr@5ueNn)*%pi`Vk6?+R#Rf&ty>epsv zarObi08t;~MzRpCU0X|zy8LAwuU!U z4Rm4IB^hNGKS|jzc8({yO;abF8%Nh!F5`KzHz|=fW_`^My)n(QVsGegy}FT0{@{zx zAM#BJ?AFx2^#L{xX$B-2kK=ypG0Aewf3q4rHb?JWwu&Bw@CsKWdpyD%nDZDFS)ExB z^qWvz_{picm|atzZL(n1p+eZOjOf|;_c_yKCsA3s2~R*oN_##e|RpynHiA9y%ILeW*ie+2|1 zrGRyX+aE4KSpE;f1&U%*0RxH;;#D>lFhIcX0tWtTKI^-Hfg2?LUBJM`0tS3-xfp!@ z%6bvizo`N@+{JMaADH|!@T zTXQ{rasw&l>{&R}wPwBY#5^&{e+neok?sMA`_yIn;+Yn(WF|SgNFVIilcRHb%uUxC z3^fctrA8YLed}t4u|-T_)h6AIwiWcB?HF$mInhvcMITwzL*`Q`f*p76_V99d4ry6u3R|E1yFW5r`{%+2`KurT98~gSWmhXXgi0oFpE+D7=U{twbd#?XMokw> zSH43MSfQKFMudXje+Z;|Y>{lJMv#qQzH-)1M??Qi3JN|(^L+c!C`5rbJqq9lf3)t(v9 zj7%9@1D8#?P_y`nog=iU%x$r&L5aNVBtgK`j6Ec#i$yq0Ez7cPRtG4Qm+^w8qCaAV zYDvV3>M|I$B0CkYt9ax}i;*`HrIM26!gO_W49N?)M-82H*&cJ^;;E?@6Tjw& z_|6kT8O@1(mZ}2>kNuy2_vknb=lj^?k z{MDbAO;k9mzAYQmLCH_czVLkhv$ENb%C^+FJzihze>3Xe#^*k z3eS4MJ4Q^`AJ8xRD#)?^%~K=Wa)K*f^qy#zDiY43b(M8UcZIO@=r{|=zwG09+1t(D z@yDsX!9hCc58*%uk3W4tp@%gB-T5t}9zOEr8`hh$n~;S12Dnkwfyh>LSY{cC-}26es2UH#y7 zg#<|k`d&WGSuTIm5)yF+2joP65{d?%FL0_C0%C>}jvliRKmz=fByc1+RM`fC0cRBn zrs0#BBEaRrW51?rEPe6$$DbYk`1Qg5ecEVze*hYrRtzoBR%TMbP+vRm+mb;9q>q{1 z!^mg_{M(9c{6G=SRQ5+*N0?IRk`i|tR47`G6=?Y-q9DW`z(8Wl78?Pfmp!gcY1k~l zIF!X)FAih3>7?u4cGYP-BpSI|HTP&>Z9DW-)->0tmm{a78DwP?qIKeA@wV1pB=9il ze~Jt3H&V8{w6VUau~OfeW2Gi5k5%SX9jIQ*SiNJ8{;_&Za>h!8x~Z{J-J*MqzZU)23Gec@|QF8KuR-&m;RsWDb4U$zkp?CX5y zjtz)reG_~jZNl8cZS19>>`PL6Uv*;4f7Oo@khSjwp0$w<-xZ3JaBUcYd_?GM5^iN; z{IGk{En#Mp6r?{xI0QT@jIA~1fHSqs#Ov<%VO#();NHn7rtU?>)$YaJT~ExI9V02J zlQRxpWW4HpZR8%~HNJ4OMpGu?4&qQos&X;z(~Uy+<;=nyozujs42_G!8+rQ1f1qqK zeibJ(d!ZGN)V)P@UJc-S+k&d_KO7kt@}Q@GCCT0myTB)1T3NiX!f}isMO&D= zPZZwNJe`csY^BuvHe@V00`+~v~mF-3Ms#x+2T879aCXQhd_iC(_SN%|) z0GE>s5Yjj-_ZbjLLYt5kRWN_inO@~x5{vjilP|M%^)U>itRhGY12BxXT>dNr$oUK+ zyy#c99I0@DW_27p>&HK8b1DThF1rjYZ%Z^F#+8phRoY5Xpc(<77qj$uyC=N6_@+;~EuC z&l{Q*r!`lb+i)%Xx#ETJf3WwAL9gRhI77JdZB}PGl>jJK*8qr)ARc*Xc**mxV>8>= zbnzUFeqpvWAfyzHr@`C}r}a}seH-`d^?=YjfX9>_UpV)=O97}uuz~6VZqC*7mG6f4 zC>iIEFKB#*#8E5vb{6lw8FPDn0rSBC63Nq)+H0Ee$yAb7fJjyfe?%#Sbyd}i7zVM7 zOP823|F*xDj>Q1F!`^aK2%QjgE|jfQsWDo8GlEP`Upcea*zK)!k1b}R9-v`LQqDDk z$qh3L6S5InRURFGLirQ@5qpHR?GgW^Zr#7~%SeoyV^7~Z>qJ>hO$#HgW7L4+Q*NRl z6G(?zmCDQUP8X2Ze+w*fK#6y5$LDA;^N^a4Y-6#sM7F0hRT+}4BpSd1m}2fmMw74w zXO)bx<(r>p=M$vXqb3tH0uXhx1|9wa)nv_ojL@pIHs+NwO+=m}CP^`SQWC)*Ls}E2 zM&^X~IsPEQZ#<&Wh@)5;Wh!L*RTePa7fyLCGiqHvYwY~%e=ui*m$9Eu_#)EBI$4IE zvRbB!rhv!0T!kgsMcV*jD;-P&T9dq?t4VDR=VojS$sUcjiqxvv;Cg(m%keU*AvaY^ zZn~B=r)*iMrTq0Xpmq0U)9%|0!jisv7g#aceN1ah$aF0KufAQst_J)86?NyXAFJpFE=g2Y>*J$QTO*)g2@WM-b6I$*&Iahwu1lv$5 zpPX@RwGT4Q7HL)5(trKNJoc!(Kb1vS**JQkrA5Vuo6on2#*mqubr{QPCYWq4Fh4tT z-oBQcKuKAYgaM5SYHfgH*9eeBP#+_ilgbCn)&&9Je^XGj51I$+T#7C)wGXDWMKFq+ z0J_uph>Z=@^G~~IF_#^Og>B@?+6=I`9iVH=D+M!&JEGcTV@zh#6GgB?d?$@8_6Pdm zlLb8p15b`&+5@Uq0=l7`R{yeh?ahr7G5l|s;X9aP29m>=w#TzW2YPKe%Hvwv0K)*& z@uluHe_WcBIN=CP`Rx3(vaFTYPMo&9%j3?mcePrrR;$%Y+9>)H@>(s=Z^b2)m01f+ zM|PN4^_@*~yn_l%ih2`&Cx2nmD{jDD8r2(@n^V&8HA2X*bNj}8`e$jLtm_)}i;-)4 zc~(h)$Wh=GIySZA8mhyI8YBnBFid?N|FNiKx!&5gl9~YUWh&U@5 zq~ss`2sd9V*u`%z?^}ZrtTi{dv~Ml65n6py&SmC~x^gk3kb%dkh@6LojTaYmsGVbZ zf8>~Wnx7nQpF=}b4TsbEM-vXBl(ks{i_Esl7(eor(#*D(y?@Ff>MDY;E^0C4tAA=X zJF4C`Hp#Jolnve11!Rl#c&d$5{S<25oyU`AS7U7N@pF4P#BYGc<9_ro9U^84jqo|=By*Wwuncm>vFOq@5nT-O9HJ$6SYh!Vy)o|h zkw7ZL(oW4p`EXnu2mpz~nJESse~|H%jq{h2@z1n@L*Z=nG<`~K<^!~nI(;vLGu~u8 zBLDN4TY-EZ@!_zZyPPA<$8hd;fQ*?OLJ5Y+{rgmzA-w$E!*n!4^ZOUb4)#MQNxnbC z3V|kEoB8+K`zK6*Z1Vl?AYD&BJ$%%4RT;q6)|NthC0g$y1&LSZ6?)$Oe|-D#&fd{g zm^ts`{Nk05kH0v9;(4WDu+?7*1!rLp7vl-rBsjSlp79<%mq8*@DY4D@lxt|`^ZmWY zy<<)_M9MF}psYhfUb*F_CkcHl$MngZhgFE2FzWl_Z}J?YTI9p>kjE&?h-O?LDjzhz z!FV22)d6tVaF;8c2igfF$G7f7vkOxDH`@*I4_0 zdfn1KQwKGf9%n9LOi_ywJqON1`od@eJqJ%SH*P8(NPPui^wDqrL`V)s+h;J99TU%F zr&ssycYuq#os5Dx<7khXiIGMw#`_{0%_c-KsGiADJf`9#g|hr~&}TuCj!@Wn?lIWJ zo86e+NP_5hShE^|e?nT4y;|8iXNt2Mm!<-&^avYEO4-E(*{rm@VOr)81B{_B%MK^w zewODg#MlFtW7+~YQRyDffV?^mU$E%G5Mi0 zMiYU#IOFgM=4+BAaQqry41Udu38M3YQDhN`_ZUB?M$lcfmppixp~x;D)hJCYf;|R5 zAnZ^^UDSOT9MroU#6-%K-YA2~lQhpH^`TxQ$PjzuZ7xtsspu1>22b~p8r({qbc8bC zEVoI>mX`NS=N2$^}IZ0ab*LJ$=dt4P#kYg^2@RX=F|Y zlB+^e!>a6e`KK|g#UcHtuIJ}?}|go_4rGy|_5C&R3MqReQsOjbqw zKA6jm;C=y1az1A400jdDnL}6|fSQCyZFVpcMn>6`fBgm00UuA{B#sB%AhvKVd&~Bb z$(Z9EA;cu|h5tjRvZPSL;^-U4Uq%ItejM{vprq&veqIB+Zu03&5U)u+jeb%#kZ_Bi zjGt$i!Lg^_Z_u(mV9hNWU(!QCj5)J3RL)T9NF&P0juuP15tmRw^|Qg#*~GzyznAod ziH4U(e_H|XR>oa8?-Lj^3({U~YQ6;q#_S8WKS!zi1fwVlP)9Doak8|5!o(%Rx1f;` zmlQMUytzSi%XsRMbkWY|PMI3XtcwG!kVaZ$EPeFnwd%fHiwiSg-sQ2lc|ORq#eh?l zHv%^{fR*2joT=Z)Ve5OiAMJdy{rJ&d^vV8lfA8SvTYuvS>BHHHhqO2sUOA*lmbx?( zoS^VWERTo7jHC|vaRCXe>-WaIGAEb)UQ_M*@!vFa@6athuFs2`nzwet-rDUuBWN7 ze}_Oy%LDAY7qb7a%KR8s|0(qv#3>i4$9zQ3-UpI(N78Ag(eazQXB62j~uorp>52 zaNq6D5Gn?39HxvPI_J~rWxo05n^;h0e;0X@r7-0rli8aW8D%(0F3&GNoNcYIZ>+uh zHn7}`z8O!R@j~}BBWf@`Kc#eew90b|Zw(RR4B0@WW)I4H z)Lgn>930@h1=6hyK_i$1Jn`{x@br9I zWToB2<`tbG6r)|H;Hy!Djonkcf4;yt@ELW(e*L3jKd;+8B#&k@VKDMsfhM~Djo)%| zWX-y(rXl=febp=I-}LO}+AGJ0+uuBn+%u_0T2f9boEG;AXY%c3IYHCR#oVx(Zs1$t zW6w#8ZOUTrJEto?Oo^Ioi$#SidMVnYzA0q^-n<=0z(HQ9@(i~1RrZ0ieHY|KrRDXiJcAfkWW{7f1wzFzyi zgWUr)VSzZ-2F6+s%JRt^Is*gF1b={?a7sra&N&e3;eW5R7UKJTatA zf%0K-4J||E8FTM(Xci0d#e?Ooka$Wt*>_S!f ziN4scU(T{wR-|1hzf?7L@eI=fx@WLo%l@966eEQLCCT<{GWtNMiflnIa=X#w{lKEV zCKkPjoE$^ln|7Z%7e!w2)H^Irb2bW}U!Efjkp+e}rol9%J^TVr)~h~5NVb-GMS3_D z}N%7P)%-egQu;Y!0hi!XIJXrL-tfG+)%iN5>v0U~i2Qcy8UyFuF60jJObw6`iDke>)m>_MN)k$01JL1;R!h z1^Ig&J-2Gw(HcQ>TLA_w_>Jrx(f^dk7L2(O{k7w5Mwg4g)ZF}AFEij%@= zqMDx=rMHYGf3WHP?vQd<*E>|lGAMP`Uqs$)?s=LL;U^!wEHvmMqY+Og*qPvEUznuk)yDI{zCHWDv+P|;GyfA$zm|7UUjwRyWxZ`*UX8AWf$ zyIDYDeN{lgiEEah+jkP}Wu{DBrGFf;oG4o=2`codOyOPzmjzm#xA+a`+?KZ;y^N$z z-m<{0xtipgbncQ+%QYFVR9Z{$1AkspncP-Aem(%dD}W0eRGfO)6>n@YYy)E3Xv`Y} zhAeeKf2E>&r@o!A$``N`r%0JOCbv~@CxzL@YdBHDrP@;OIvZd|a`#y}kNps=9Gt{c z+O+~8{b$vs6M)4$2Tp>K!CEzWetSZ3P!)?Pr&+`|SU93qUBdAV5Lk=yu3g!|mFRSn zU*ejV^QdxB3g*!`Hwss++TRCV*`@K<86}PPHOKwD;UD7gCGFiW)&!uBh~o z0l?t=W=#a;?Khl)in!8#S0Ngj7sTD0f5G9q!P(nrtdSTiteZE#t#ZtR4!=)S#+Tx- ze@Um|yaobM!%!BfH!Lf;O6W)~C5##bsUy!?p(0wXw|f1?Mgxif(MoIky}_$p7EIgW zP*1Wk#9{ImwyAhqj*;Y`;BoUd8qI1tOF7n}G|Pvcr8i_VQV$evE0#Lg9nEugvCU42 zK-GQALU<^*0`i(##bM4Z+1-&03BMJ;e+dATn~3Ye0ok#6edSA)osoJpu$4iUR?fUce}Sun?w-^+~tmxY840K z+M)xN>ZKA!PS|3xVpw)RHUzIttDwTrmW?fRok`kELVtu=2X&Gw2osfQXc;JAe~k#< zqnozX7QVDO41K9`KpOq7i=6$UEiZ0+0_aVRN0xXAbG3=*3=>bZc!^hW^VUM`6lqX@Y*ez2>~@# z%~E7Tp{1XEF1K`vtqJks#zjZ8e~6H7sJZww&#plsFeq3cKhz8uomZHX1-fgP!vo0W zsNW|oi|SSU^8)L+0V{_lY@acKO4hs{8;g234hO)%UEagGY0NRdbUMd9JoenA7ty@i zCKyZ~Wp!l)yl>scqa>&0qm&*^b3{-X8#I^{$LvGSr3H6!7qqi-gw5f0fA8qva~ogN z9A5KES>uF+(}J)X_~}rw&$l0bzGvfW8o_ALLe35}5QHSD)T(spx*Vl)zcUWEIcfke z-(BLt{YXD`(kZ&mAO-e_!2odh=FoZ&)8Z8&U`kUC_)#=h+xN*o~Y`#M3i{`g~_L zBbZA0{1RJ!Ei7jG6j4Ld*(q-YxXf^HF_6%MuP$9Kfysab2d5z{TaH=s1PF;Qp(v>h z7&3w$D%|dM$oF^iXDsleWy(RSDCjGk|3f4Uz&Igu+Q{5UZV z!?)Rnz(EoNX_#m=MBlfF2H7JSCC)b{`^j4J1Imf$WZJ> z)Maf#*_hb@%^_O0k%lNO z^7e6o6DDFpL_JTEQq<3Fpo=c+Aq3`{OD-XDf-AU$?aiS_f6GEQ9;UgCbeWE^mpEP6 ziJZ&$)pjOneqK{eB4PUc9aDjm>Ze@WP&pjR`k*6T7j0ASRWwyRt9`P?=}l8b`z0nDlK!#JflL*E_WbQeS8qMX2e5}G#I4ssee>-k(fbkqb+ub z6-rS4r(^+?M>S9$HA6A6KhoMUsYGmf6##%hf4@!X355!$lL24t*3i4fopVr4uUKTT z23FfbT*iiupvxEKlf}&l%FAq!Aolo9T@US1<<&IljGB+jKr3IKiKL`+XO5p#$~4C@Pqv56s+ zfU@1nSY9tdUjqh9H_C3TnJ7b#$s+u5?)*0|X5bO|AlnxX9@LE?PYcC0X$WWxg^rIKEi(?*I({sQNA%X;c1^nZS6!RgSy!!DJ8&%WDzwZz`1 zF)fldAk#r&DoayxvJ9N`x|Ny;Ijug(QG5)$ zN3=+cN`ek&I#*N(6K5NnFho>-o~3S|L!&=%s%BN@y<=qFz443&%<2Ag30jTKK!7M1vBwa zr{Wq|g&BvN9Uv$mc!agHVaY&uFuQWTTc$7qOb2Ka(?k};X_`OdJUCAVlGz3_eV7?i z@n}z(^TP2Esm`~Ma~r5d8AftOOGz7^!4V1C&VLu?laJAVo+(a$VsjI(b<`IZfm~&> zcS|O_$NJd4x-3rA@>rSEv> zlfB)qK1a?U0z|~wJ=i;TMWp<2?hnpgAb;|01|lD2l1#%5-KIOi_+HE`ZW;mkfnH&R z;w-L3V4i4scNUt|H1syiMPoWRm=aOx&QQpU8e5QvT1JMNVQ&yE3T5e8CTteWhxgIi zW`uANQhm4-aTN{jUF`DT6TAG~AqH&Tk{a)9y!U{KLCyuhOh!+FmmT+H&)WqK-+#Yv zLWcoXLx#PG;rjSsHVetQo@Lb_K-hk+3+VM%*jM~>x9aK(@e&-AsWCC}VOu8zmls## zdKr?O!Ra=LVL2V0164_`WPMtP3~&=MQW`!O{KvQyU?T50<_mg4uEqro{m?ibZpBBU zb$dJ6fI4qlBsKpwn`A3b(cl+@5r6;Y1aBjxpZ?;(Pk*@{ z{D$D*9SqLtlAv*q1HrDAeQN{AZ4rtgzbfWNn}Yxo=VD7#{owyBu6DrxLatuk-mP=B zYw}Oz>ZR~+$khu-hF?N9yrN&!h?2=k;m$qs!#cRPwRLa%(dQJ({BZk-e}5i-ey@wH z${e!fIK&k-0jSN4IU|>F_lW;Ey1bs-`Q8G)VNKA*>|otl93w^*kuQf4%H&|*>2um! zJy=^?b4%bm^uUZzZs&i7@s@O2Cb85(QLgen{#N2LaL=Q&aOKqZuSH$2q!TD8>O_hu z%Lfa#G~ZF+QA1nM24dHpn12xDKVyeuSN+SE0;rj&as6zHD?A@pcr>=$L|EKBhk-9u zC3^vZw4CMOndo;jIQm1shuucO@U7OcG|@WdeNfAi48`pWEvKZ^a{59OGPoeYGfX*4 zZJK|@Tovy(NkylP*cw|E2;+%BF#cI}2H}nbWGKPirj*ah)agv2sDBBk6D1qqRjRKa z)u;e3Fo9gc_D#KP9kX6^gec^-5A` zmG)0gT4J!W9BQrds~~EPbpcmvu7dx6o>^}yR$3_j*BUbi_ioI>FWw{rU=s4j4}asvM#~DBSKM~E##b0`hUseEjrA?g&lb!6szc>K-i_1^mi^Tz-jdWS zEc>gqe{#|igO!*4MYcgUg3{CdzfNj#qpc|;K)Ko~1p3d6M-SE%IxnBSK$--5nDCJu+;i0dr9A#_KlZ*a~!SPw0PjZW+Tv>!YPTZu z3PNj@wtr7fTD88isA_%M#azDH!HEOQ74ObXZdZ`BIP1F3h&ix#Bev2>7cc7+^Ld*G zTv4>R!Mz{FsI&CeGMCG!d}whw+95KT!9_SdRrrk;K;d6=Em#N9VdSHnQzl!Dpa6H) zL_273#wx7#?+xBq5Jb`J;4gV_I!nCuy;1#`GJhy9D}KclZr`z88N=QdcSc_LjuZOq zTVIBz+!izZ*MgO<%P)dKXN6#pD*LQbwP2;cE*8VFSlg66|G}(4Zf4z}OG_u$bve(Y zddDzSH;Dc?7;#vMxh$-ngtk*4MnlK!ZU2%p2y>5;6wEb#gsW%{qi2YkX2HZ+g0c}O z0DpP;uOimjSu1LhYFJM$PFAPM>p-+Wd8GL)E5N)lhNu?(Z9xASYL-9b%XwI?{w(R| z(y_SPhq6;>v43*U%Vq`p(*-2h+<|UCG4W0)V8^zEBNIY1X>);2^oCblVzwfCe-;$B z7SzP#`5UDIaQqW!);KL{Z=#hLP)e?&RDa?{xF(la?^=Rnc6q7^pAh9ZTu>>c>?d)A zj2X=ha6&NB7aT-gMI_aQWO9zpf-!LkQdo|ei?Ee2IYs_4ZQ8PdwJ;oWU4XBp_YGB< znn*=yuuft^GRSAT3PA2gsGB`oQW8b@!h`0bppoA1w_vd{ncl*5rYlajx>$b|dVdn> zZ`vHo0bjv}%B{#QGRRZ0u+-C}d4IsGIT&ko5^kj~jMt2c6X9+WUVCJ?!z(haYj5RpOURVV?C$wFm=+(TK=aBaRF2$#2X$38K%(Jh8Kh z%XTYFRV!!&05_7?OOg7Vl+)YHNlBG%l9*ES+@evwf-vWKoC0xbmRlDQ*O%OQuBa%_ zfh0Q~$DGEOi=pyc<<$~^zkdM}V9qM~hLf+-${KQ5)b?2#LV>q$AVWA8hVa|9Wk(<{ zfSNGU%_k@$*{Majb^>apU<%fO*s6uRY}#-#A<3P^s|#lZ)w^+^TohMgoM>*CD_uHS z%gV9Dpu(yO)&KqItBGllRjmxW?U+6Vmu82X1^LM#9h4=8&&%8|k$)UK*nA&F!mFEq zvOX=&)Cca$tudr0TEmR!r=)48QO>DmSr!lnaNkQ;vrrZx4ZteJTIr5mNm{u( z=sX5DHrG5yzIdxOWcwFEFBcxy6b_5# z+7tCJZ8O_cqFOUDO@mrPn(N@-*F7gnR_Yz68{;Z!2dw+nD}StLTLv)icTEW%YEnq} z#r|$wJh??0ibUQCprSPLS9OsqnJP=${FP-p8s?vgq zPsspjk3WdsUgLkvwbm8|>~9GH+IG7e;ybp@Zc`o3YU#bud)%c8{x&ygho&DcVft!s z->s|IZM;GBw|{%(aNmpl{#^yvg@$|l@3cIw(RB8tprL4KJyvrXZ(LP=1B z@Wx2ztD&rTgy@<}KlOqCTH#!R`-L6}{P1#E1;r&Gs}l%iX-!4$iUP;(ZuO!=TBQd$ zTiV13G6Z6j!jQ0Hm6BABbN}kAAv6TGWu#Mm@jOlEPJb(r?MZM=lDSq;+x50{ag>%S zOs+SlI5b%2*PO;AlfrhI<>?8|9C+d6<*q^%BSLN7OIwiUJanHB0z8AX8oN3baMWHM zW^~jlM(-;I`fpeG+p^eyTc3C1(sB*1X!K&_z&1ao3u9lSBP}@HU@+zv;EQse5h5%h z9Arobc7Kic!~-iYM)+`z8tqZIPP#kgjHf^Rw^5fs3Y%Z9k`WLk-(W>8jeQ-7-Ql_F2@aqeH?ktEVQ$?91i(|A1x z`Np&1soSlgbO_G$$-Rkj00X|3yFlU)r8ByfTN*RQs+y}sV!Z{KyDhhE2)d!!46Ucp zWHthhF>JYnW79C{rNjKQo)xtvpur4vAp~(&E#j}h>Spf{HvCmTfkwEAyVDJCzPHzl z+kb&4`#aqaRkL!MwZUqbJ4}hMv;GD+TT#&!$9-chll$H~*gcTTRHH}g-^RN{@uYop zbnw+74;g&jGb+j|P-nfH)Zw6T>hRFYn_iQh`raI31PSd2WaB#6f80CydT-|eCujCL zoct13+m6lmd7zJvm6YOeS>uLTipY!==~B&a0$O^Hg-`9S0ZkOY=08k z#>TETV^%?*J>2fr%qA^LjCb$y!A-Wcjr-H+0x}?B^gE6I&+#HZ z=WbmKj7TGRb?mQo%dhtPx7Jl-i-DR}lvD?DE9Zk<@PT8et8yQ$L-=}>E+F9|`5|RQ zfCOZZZHak+qe#v)P>eBUNs`y0WPhZGyj(6m>P5%(#K!6(!;F@`RxwefjYGG*0B6(L z&uRUoE_T9R(}Z%Lx>Z17(c_EpGerEI@_ul+R0`>CTOcdSbL<3Oo8a7c%nk|ISHd@o z%qjTIcOs<2xLSyeJ5j2OC2^;}e@ppw-L_4)BjE!1O*(gI7T2c@e$6_57k@)G+#RD; zY`pu=;s|s8nQP7(XBbJ(n}_%0ZfP&>211W&_pc)Yp3%`4?pJn~ow)bS9T3lLF}yaL zbXYb--DQ;cxIC!wh8M8b0dBET>YkCma9RB(LYI4pko#nh6`PlrHNMAAyB%t6!?PW> zKg(El-ogie*7+^)ZNH7?Qh&_|7I>^R**$2PYGn=aWgW~ca#j+W9mt=hg=R>_7)wHo zYkknd_oil78MdY83}EEwUd8)v^B&%Ei}W?7{=6J0+y}!`J6GyDWvkfoJC*p|MjCnT@wXWH#x8E3q?}z-ha48#+W>x55Xi^#FE)<+#ZUNPlweN!(ocl;cNn zI1&5*FLb1$5>ZzX41q&d5&TXCYsi*06&(>Xw4Pq*7EVtw)QG~nDw?`1V%T{`Ww22T z*iWU21wJ2~WjYC@@CRGX4lvi|e@60@d7oig?r)@pQh?Fq5?mxi2Op_NmWqu|5QX&h zELKtGjM7e)8BYj%mVdOuS@RNs350K3TI!lpAEVVA+SJC1Tk>KXLoVocZ5zT%FW#~p z;kK*@f36MT8Wx1xupiWK0j_U5SbZDNXg3J0212Vg8ak8UKc=AHp3=FlwDg4St%*1C z^iuh@AZFACWVUa=5@zJi_g--xVY}PCZ9ebYO{ZxyriFJ|M}Nx_Nm`uLLDp!U1mlIU zdgtZEjwf4<3!{qarORj$021jc{mQ~}Xmwp->&nMn#DM#~y#Atg8&ntfyuX+5CnpY% zDrx=}ij=;Qe>X`Kk%eRdQQS@PxI5lG!Jpyh0hZJqxTr(o4G>y6yCknx7Zo-cpwe*e zd|81l5E)&g6(V{f4@6O*ON~V zA9aJv-ubR@c$`zZ11{}oTLh}bQE^Q&K9`q&SBCRSfmUI_V;#iK)lRqo3J!qz=1>=u zHx=(0cItSNou@w!#&Zcz>e0Pfn!0Y@$1mK!efV=qU&) z25Pzjw=bp4AQnBXMnCbQKYFY>TT%!e{q4= z>_Lz@%wkZ;nBNs=g2Jd2EJDt@+oMx_UdAI2lt*g&0$kFZLK}ffTJ~EH%r9p7)CDI1 z1&xC&}yb5tL&o}N>2Obh2;jydAC7Tg)>jr+tCY++yCs`TY6I0;B=v44Pp z=A4><=D>BB%^>IVbiy%Iazyc9*Pd;p{!x3(EwGVB%-&G}P7l3(HW!oLRQ8`&M>MQh89Enc4cV4X=r2dMDKVk$BYI}aFYbA(2WJ4PBP_+ zaH?&O=90mM4#I$jjn%hxWW+!-LWR$sD-Pq) zaDOgXm=eTSVQ;R7+`ASzsxhh3P)QNfFQL{4Hzmw_+IHZ!Nl+ocGWPv>HX1)C9u7L~ z7>(kNfg1}zaSCD@KFhMps85zYnsfeXsB3anjNh+HGn$ngDoA*`8=|8+hTiVGAUcH1 z-oNhxa{K3~!$D-?h{~Lnj&Sgh!<(0{S%02P=bPFdW1mFyQbM140VBIZ$&TyI#{*O~=`lT&F)4B$lXQPHfV#vzPXgi!3};6210Y z;H0F@P1u}VEmTY;^45H~zd?=q9?j$hwjPpPw_c zvKWz37wu#3zTK}><$vrCP$5_?_ByL* zZLF=o`^MV(8|!axMunYRQxOpr6jDIvuX>*x938uYE+l6E;a9!=gU828ZW6W}JTiDP zb1PkyAm4pCOMm&Hb3UD3=9_Q62}OB!ktbRD6qfzT?9Gde@+Ksg=a(POw%%WR`@vcl zJVqen^OmsR*?8~4+bh6+1f>j21Xkh(Lin5S zt-ZHq8+rHbwFmD|BMxNLXQujjkke6)q1pBfHm*rPt&fLDAv-NBO$J#^ZOl<13mxMr zY^N83Fx%gdiFr0;gG-ugbd@I@c+|Nxv626c-$HjBp01W zfy05<%b%>WDuh2VtY~Tc6=&w8SqAtkQWw-%v+&(a|K7&&?*8G?#?H>h?&n`2`unH5 z$Mo~$s|{GX_X$4I3^|ik1Et6?ckeePiEj60i1!1arhoelsOEi(b^TI*<&EMYT`uHz z5y)|Q3~Nq(cg)A_JRe;y_T|QD4c#b_ZX9kDgDoHp=`s*5KZ+UcmqO#zhL_ehaoUIvN$FWwb{} z#iQ#@>;ylQhQB@+$T!?C(jmN@DNU_oC3$63vmov>R3^2|8rg0f?P@p(m&FlUfFT0h zp^Iw-k+M!V=Cuaq=PB-*e@I4fnRoE_?_iYXEq|*|(z-la&!Dq^!9D6Zyf8F*t*av3 zoFav{1Y4dAP(~D5AZaxN296+ zYLHVGx+tn^F}sB(=~x8zb<+WeR7;W0-D_xN>WB!rOK@)$rzxd2RS2F7?1Yc>%pLOo zfE|4MYc87oaY}YY)dYjti^mz!1!p3IOn>-CbDOyh*$Wy6N(;ZqpXGtP8M;(Xd`_gL zL3DHp(wU_hgF~b_wgI{zLc7dEw`g=RqY(_lD#dqj=QWhbgyL%&u0z&C?`Uyh8hJQe zKqt?M8P_TCPKkF)yi?+x5{Ej%B53mV7fN|3@VrVc{6deF`*h=SqJmxjQ7*Zh#Zxt9n2`Pu^dEKHl_jry{N zE6s}qvFORnjWubsV9}X6JIO6etA7RZ-=Fb8nk|ru;n1IsVD08*yPEmZ|3MNp!1SppP)lw33tFU?~4gwRS z3qWYPV0HfV_g7jfc#t4=Nq=l|_3-EBK(~nB`pxami6ut?>S|p~Az6apam)~NGs^A& z{U~!nt3y18!Ez!368ASJseUFt$A3OCcXSLKS*j}o zY^9coX)EncF3oZ=3ej9n`sm;ShHOKX+>oW%19Fno2Td__yvbDHA6!K37;pXJmxLy) zhy*8b3AqJT3pAmA0^?ZXMX-K}@~84vzzo;rJFI(EASKhD^n-y5br3`62b+QcOazjuV+bmQG@e**2$C;k>XwZ#^#rF?UKV1c2kjn0)fffS z+pG-3+$|F2TG!|Dx=x4JhvDwJVn5f;-SpwOn|98o3ptz4TYn3@b`S;-+T$NfxrG&B zy%bi;(kh|t@gxo_CPU0RIO}aFR)L*E41au8U~`?DbJ=$Dy>-LB+ve#{uUJ1oAYof+KkeT54-6gewW;x+_KR2J zKP^|c#(zpnz;deHT+7LUJ-6TfWpG<_8nZXOIh*#>WCr>kPE1SchF45W%DPZY%k>9p zv?%XlH993M?s$f4tXtCR<0n3l&@7EnS*SCCVH2g069YDJ!Iuv*10R1!W-onwbZ`VK z6~0mEZO+Mc`hAk#j$t5hu9~P=hxqjEPsoPh7i;qD%4Ki$Autq$F6TGa^cAu9x>MnH zr^3ahpx4o`dyz=jF3mUhonXp>X&c8ziBR5IG@j;Egt^gSY|yr1Grrmi)7ixoYd`r~ zb^K^TIdt?Mbv%PWV?}?a4ZHLAb=`*(M$G}t;W7b_3Osq^#)jfI5#G_Ebl@NOgTpAI z=?ZHqm@5qR+}qoYH^XE6#6dBB;<^|=lv*F)2WEg&5*Tua`Zscd>dcF&L#?8$Mzh=L z4fGfdmAm{-0}=>Zewt1a_?Fy^lZ>o(aCMScE$2yUY~mE%0-=9;CxvYK00{SZZn&Iy z3E^_$dEs(6l#3fIC%6-(I638QkWVn25}AV$G+{@?8c5q=*CbxpX-lxoHLKBtb zNTL=+{4RLpw`5K5sLSU=%4WwNV#RYC!(mwQ6!zWdmKrU|?Ol-@P&h|yklG-%tvOQT zeUr#-wbFm8ZKr17>K`aJQ)4H!<*fZdy!T~#(8?b~!EoqH zL-0zvzdGpbmb)2GRJfU z13J5tUzpMhmO>Ew!_;3eEyH0DH9?B7Ep#?|{gV$C-*~&OVCW<{PM{6%)6hlnuj4_h zo8kwGf9-IeTsG&s-f3^UF!pO8GivL!)cArNHg)t=3w1n}EH0Dn#2qWEVzZmq7}ZuV5po(Bip-O0t(YW!NoLog&3qWixc`(l&j;R4{)j=L3c9v^u>8+|HL?^Z?u=j(7p?QPzb3_i}ha(|3A`H3wMF9>M^E z@aurcS5TbVm)uS%zjxTIYJmu;s=nlYUNttOa=-ueF51@=2rlTe#3tn5D+4AZ9z1`K zz=TZZTvS4z$?7s;8EACzD9d1ZgV~i#GRWHwxi{P_UzS1suco8M4)0eR;rB~4;h}=^ znI>mg212ln5&Q$eHDFFdoiAqa(olnIBizu@Bmb@Y?w&<*AL}{vxi!6e#^Bi6=YSnO zMXt^X4E$)vr@;!gVph%9Mz*eqv5J4S%-ppLbalYP&m2kBbfG<*YOw>iIgk7Bx2iVb z8{bU%wdkwHK+Zg?9835Atm_1gt8zPMt_!h{_NmoS&Wq^ zvy|ooH5+MrVFAopKC#{?bEp~iQ_U0~#9E=X9=5j62(sOgXN$vwRf4`AU0#3ox|@Ne zLA}Ng9qQFr!mYafWPo0QizhHpu9G)n@a0I-?blxWF+o(RH>0m-umN>G1DmWLU(8_S z!|!jV=BIhS4?jOoaZQF#AO_Hs21xd6GevF^+L~U2GY4*2&S4Rs=8IO=HwZk87Icf( z=7a*7TO<>_FqQ9wg#$GJ3}Jtog#*wYe}43{`7a|FDI^-Adk^VjihyohGSMFgy+nZC z(KQ%JgqVX`Y6^fk9863=Frpqf1mqForm6WmLqg7rU)LytDclsFrz13sH2Mh>JH$O( zAE7a+FQjiq3>${4yI{6%E7ILUScFQL`~z|opD9}c@^Ij>#9&;J1(<&eZJdD=GYfi< zh&(ynJw4p3B=f}dx{)->R!I>h1<+LRF5cbya`*FtzCk!0jR{;$m;ikNnApEsS?w>{lA=D0_HC}U+e z&OzPhpsRB5^$8W=j!1t~{=IPq&R2)ueE!wZ?tbOiF&(%kc|#MT1YjX*8c=(dlBuqt zYOql;@3H2J#n_eyPIq|BU^6nWGpa`cUvo_rsMnumH?N?>aD05UcW`o2gLf@u*}bj; z>6-e*=_93*d4PODX1!!)f85MV_ z$=T%EBshJLvPJ-4mXyo#?JJ-@pXFJi-VR1loxq=)GA5iFYiJ=#>dQedJZPCsENYmT zIo(6SKy|Jp;4DOgAagdB3+gR2_7XFRCMX^*V2kG+5l^lvZp96h@F{J9os_ePdKU0Z zpeMH@ZpMFE28lqi0g6pwX+EE208&2w2U!5hc6?*h48t=g0PPBfYszy2NfKbvG%+UZ z7EB=msYIXPI$P=>Y5XHH-mRAh@cZtolr3YrMxa5 z?LNNtnlwYkN_|V@(w1>VeB4~wfYFAtH8pS?We$Ii@Uq?J-E;9F_m4nLjw9f-#ssUe4?F)A$;{O4 zB{OIyt8FOb?iP#ci1`FD7-k8F6aX#~KLm7_XPB8p=jqt256TDw4f~4Pdy!?JO|6Oy zjxB%1=8$6tVi|2|A!Tg-OjEKK-2E_=7PY3KZ?(k%G-P@I&amfautXxaP#5>}HLXwP zL0_%9s$0B2Cyhs|2Dh&5*7t~I%KjCuIZWd$p?tey``M=MF>uhBH3V4-9j937geWY5 z4}hq?ne}6ru)n71Z$R-if(hUCB_6|XN%DWYNyN#|E1V6GN}C-zSIezT`axae1Gj2J za!;%>Vjl+yC%*)-%q&a6gt-8F8`tSdgN-XCzHn+0frbRFj2v0i>R&;DKz^ZKs8du< zYjHj-7V@c3Z2?>(vbwd~cwC$u4g+|p9*~{TlQ9DHyqV6(Y|rQ`QcjP{ZZVl$LRNn+ zmOK=T40!W%9fCr25G1N#L47v~5R^GGH@lx#3Ll*Jw5#Hs67;GVRcxCi7kVH;W5|TY@zX*}Ljljh zvl6}fWcfZE`g4AX({?37Gz}0BM8O70l@6WesLmA%FIaTnP5ec-3N^_*fGBL|$pxuO z;-H_VEQ$sw%f~L$;V?w1OPr98XMngb+S!dOQz{}MCD9-eMkLP5cnYRjz1e>$mFT{n z#F;~?)e>jQhI4F{BrV9VRgz}P@@;@8QHEb!W;J9j$g$NDm(R*JT>EaaTGAHe+p5XS zc}MR8>FL(>HETvb(KBakH>2N3H^Yk?KFa2dnfva7*DwwWCK}cdeo{OS0q<=ffIGwh z7aXTZzQb3E_Cw1}$w9#6;c$OL;x%ZhiRc#{zrr7?Ct?Lg$<+WooZ*Ppgxx#%V>bRB z$?r!euy_6o_s5VhsBQ|Q3As(l`M+-Jls}Kj6an92s|Y7i6w{r zK(Ln4IHSuQrU0Bn`^G~Da`uTl-HoYLn|bhfXRN8gpdHmYGpfnPL;bs@kj!3M^#lvn z+zERSBFWU=<@M;QxKTqHTf>}b$hb^$QCIEPV5KwU{&!|Of z8e#vpfF@j5INb>ASdNV5#73j!jXou!LM3ZqF2ZC zbQj6&=S1~?6$yR26{y@R@E8~zrgjPgrVSBWk199%FjDgOf?PxXIw|ERN*lagg9k%( zpsbPyo*JPEDSv?I>I+I9JAa$9(7b6gj8y+pQig2g{7)Y;C6_MKz6K)OPcoEaPB|-@ z9O+t`f&493x9~stR%l%Mqxh~S+>RP?QlAXG9T|mxlJ2N(ox;jnCsnC$Ay+AICzVyW zlTe|=nOj273C8rET^ou{_P#jS|L&`UW16v)mG&P$6}aO|k(bH; zX!O^FW8@b-w*0F_eV3g!8g;ObmOH`rdy$;6*^hVN?@|x;Fkm{G2ug5l1dBU3g&D;W z>AhBeR385cVKw_;w?~H=jzHBVtw<%|UaM?=<{j-wo^Ae!kGP7jJ!f3wYj8>4wAwuF zNyQd=oP6YG<1%qv{5V*)3z*GjU^)1oyDuIdAH>H8C-An5))uu(uFIwO%=S=EqnG8j!}_qiWtTWoq6Ig8j)#x9cn zEouiG1KH*~*IoXf@;-uQDnmPB=r$k+A92=~TJr_o)E|{i`x)WoSM# z1dIMmrX+zaH7G)=l1c$w1pS|oB6Lj_k`6tK>@m4@<%#mf!a_Pi2$+mjR2PZ)!a>7- z+|37uG-mBdZS>Y%53wk+b+N65MK3GQM@Jp2L`MtPDQjJ>UKL9orGa&E550T4$KTxl~IO&ct(by)yQlXkvch_h{GOu$CxzE9LOb09{aRTuQbuI!7~J zcbNR?69}s*Sk*zW72|^UaFcY z3pOdsdnUV!C*r7Hy*$%`FIdRoREd}iInl2r=>E4duJM2!ChBS|^y}H^*SFGFw%`t= z`OIi>S@*aYbXX*PmIbDN@O!|5$e#IbK@dSr?_{<_F33quj$*9rdN|eJeM@B?qThf_ ztvh8S1=cbhJ?aVpf;0ayLs=8$D%z2+Z@5QKcc?F*#)DJ+14v zk6*Q~e!j4W5Ar6L=S(e5Rm7)5p+nn?)o!kISL~c`b@iy$b|e-_QeI7AJ4)3JZn$jD z2hpu~4qXNfjykG<#=a*=$lJ~IQX5zNQ zdkU~Pe^;A-i(lgJGtH7e=y>60cq z=-hdG=huADAqQ9nt-0>>ZxE1NcraK;P+0lgy~p>8ib$yAH#g5m(MDam#=zBV+^Vvw z`Rz1&j_1(#%5}WhlH+^5DTnT$jYs5`OQYbS0P{zGu)TwEsP44h^buoIYYqpdz4dkW zhUdOf&3ZO-hf@vFsEW~YSw~5G)=o*&SmWP%j&h9dKwM9Of!EJ=^ z<2r}`c~_h&t%!HQsY~_sCX@~l0Q)ZlgpM+Q1?X&z_D|37+KY$-UofOyjA7(d+Pp4; z;L(lsN}=%dNE>cr38<$cK9yTIZ@h{nxXRb!NH_Rb(d}WrmnFs#VXX_~k`o4~o~?Fv ztLldwc(cu=sYO#=nT8?hy?G$kf8xw$?NuoL&tIE$Yj%InU$weCWZlX@%e8~n!v3Cr zw;FVD=z7@S`(LaGm=v`pRM9Q0iglKsED?qEI*X*d2v+a{&#_qPKB)s0wstaa-4}d` zE4RE>_!M-v7}5?>`+h#Ps*Jp-O;9CH3!KW8ANHf)+-k}90ra>Jb^H8sfeDuLpFC+W z^nvd+Y8^u5eFJ}4!5`G;wh&Ly`_5~B?fpSJ=d{)N4CA;_9hH$wp-1gs@Qd#Qs74(? zt5i z?ltIq>b}Wjwc8EGT;(G!@xQ{9a=F45vIj2cb>_-$C!O7*p$v zsrxwNBzueyxtQrp`+3RCo@Fi|9B}$4C(-!nYzTK5v4xt)llTuveW1H=GvZ@bIH*j> zAa`ldylqUD0~r=3^qMk%gI<{k14HBF?>v6InWMU@)Fa1$$p6bVr>2blz~q19 z+g<`Q9v4}Z09$}a((5@S2E4w454f7BQ{+6|zE1eB7yM~5Wp;L3mE(TkFm3|g=U8oaWQ`70Ck(kfbLA$jFR!Vsv%m%87X#8$lUD0gKt<9wFZNmd%-e34KsKEK8k zDP{>jSzSRGNk;u_M$9V%Cy|e|Lw%JN0W@F9-CWo7U)}b9>r37Gl|gk^>HFI#!89~n zm8Clp_D?F}<}Ton@=J8CYJUoAhWpkHVCNUMl;QDz2nh<D>-={pxEXcoTAiG)&l0ly7? z(iy{wewy(r0Yx+DNiY2J!O=jvJYYVKRxTGKt-+1=eg zKE0{bafc)*UBy^wFUD)fHp3D$gH?w5OmsZ~p=c$c-L0cs!VS$=DGR#<&so4Ih`kkt zsLT<6N#-R5L@C>E4Pitc8t$F?2PMv^9RCpRdvD-HrP-awR!~x^8NXpVN!8Q$?J|82 z_rH498Iid$kJ3zD-fWqyT+GCSA8;(Z{MBYM8{=^tWaqU>iEHF+B1a~x9l?yC{&R6X z!3n{A-EwcCu>I-uNm3$Bvly{~?{gIGC|fXpAEwQeMp(&=@=(2QK~|*HLDt9#Zwn^~ zt?Jm}_0WInm`C~u<{$(PW229!DJE7T1syB_;@~39iEE2|Bc8C|+2chDwG-JX9TtZ8 z|E<%V(HHiMhVk#>j%g>s4+@kFG(W(`vGv2zSNr6Patc;~c!3{7bIJ;`=vrecd}{=M zBKN9cYa$avQJ+{|m`ZQ=L#03A4p?SPM}7^=tXfu470!Ao_9em8+Euueq`E3T<=!d} zZbk&W)N!+H*>-bhmi#o2?A?9oy+U(|VR);3~Y%D!fgsQ4q-eWBg@ zx(o#Hrbn${RcouMsN{6g)F%pm32E-9(-~wyrE0s{Wp+?wh!M`EUR`L=EH^Eg>3AZO;Oz ze+zWX*w^_Sd}!yH&X;&uJ4QZ+(7w(Ef*j4`~xbe8YD_hL-J6sD+Z%+mm$Fu#E}(4coRvnQrV# zmY#<5wmEXvQ_{W@CA)ba6mgWTO^z>lNsjq5zdSZ!l!LFE>HxI9l&ThH{S6`T3I%EMZAG+B3N z$MH08?<$|In>YT}w|m6*b~LNX4SMGsYtcpUI-Yl;1Qi@_G z3r}uT&|-m?DnmY!uAo$?lPo1Ce+TRU+!9URV6=Sw!HM0P`;XJ0f2P6m=Q`WU zFzA(2-9#Y%r$>879~8Hm^EgW_sDn}X;Xf)0j`3kWh!>3UUMp%8$Zld~Zk zKoKv%QjgMX7dN)Qz`h0hK%}M~X=guJZ!YPJx{-$bQ2FAeSVQ}2FGUJmuybGvr^Kwd zg8MUienlY*pb#+r8xC*He-4VUKb-Dc|HKvC5^d#2uf+eoSEA*E4LT)i&nB9;cwBKf zvyT+WV}M?82GxX z?iKO7(|>xgw4t3jvKh6cp~w#ni^zPZ+--}wcWWK%l?BfP#xz3EV{IDpm?`WuP7)kR3mdgIhJ1FlC^*?9xN}2D5z9u zG4yAQf(f@uWPscCskO}Y=u-RWQv2vq+c zWD1|AWJRWZJx3&+0{}}vrE`;pm(SEQJfYyO24rUf<572DBHVL81DMjW23lb-oD}46 zJVLqaO?L7b=g*){*b!J!FvJU3plcjBHBg}Ark!Vf-At`WqBQyBUn)yk<2^F`r_+1n zw(go1%i7yxe+CHhpUPE)<_kSyc(eQE0b~Rtp0;y?_MHi`3l}AsypW9+7Ra+2Gm3Ry znz~d(Ls7J8UrgIcgDa+4;@F6KtMbAG=4|%DwC<2}_A7pc*24J-?udZ^-kz)ZM`K0X zm(_&%N28CY(-*1Y@~fdH0|9)lXF5Lv@Klba4SgXTfBxGBs@k)Z5%0?R6j_Py_-b7X zM8es7Eiy5!;l^e8|9)HIEsCwLbagV0GrMeR?vy0G)MCk*F-*3tK|L?KR1F>Q<7ZKp z^Ipk9??>b4;_{}`ac-7NezB($JKZ5{;)ayyeIj+uTfO{-7ed#d3b&iW2B<$BSm)tr zqHk@Ie+zZhaggmyV4nIanhSTTyL>yB60)7iH0R-&o2DOWb(~I~gPrgS6mSVM%DEr)S7!<|M5I9l{#N)uu*p=FvsPxmG(@)^2W&3pw&h~dbC7tVP)Dg z47x#QPSA4UZ##N`ER-8VB|(GIKcGWCt=zm0EKFTv9f{mkQ>FHtqb0P)niOye;FI^a ze;ugG7p*CWPu++1^mJqYSH&cQWF|_ zi;j&r!=-aHaMDNe=iOH>59WA#@p2RRTdL((B%={Xsx$YTr=my zt#r?^5(VnyCHY>XmLnId}XWyqByJR~DI-iOVTG2yh<(a&PjnIl`!0Wc>(f8#N* z#bLw?(WzGu68r5vE><0tR;s5P`+0(SegpwQfegE+pxB{`#%|KZB=iJa`(8^m?%$7c z>Bq?oIw?Cwmh}(N-EzwYkI{rEznm+qlOgBnawbUxRhv;Q^Kea%5l;Bx1O2i6MzNVs zPEIA;s1yOW*6$Bw`Ibf~x3joov1A)3bvS737#9~{2VmrCl`t(Xi5gcvPNrVU>=Zkw! z38ikZo{3m@#gVvV=m!U=MW>Pwwc64f(80=@aeZF%&j_uDLAkdTvg}-d+i8#@<|$guxNTes17dbIeVf$5 z5YM$$Fr+DIUP5DBK&*0UNLNvl^StbKSTy`=AitkukG{g^>w3~>qk^dWl{Tqw`J4Lh zL~X?Jbgebgh7Np+j$PzWe*~^w1Oabaj-J6N`8@`JfcrCUQt0~(VEu8tuulr<hA3xnz9yq2Vb{e6pv|?#TRw+NNk+R^&HCUZmk+|Q~e?Y z_v)#QF?aXa#+c1Mx6zEDIfMMm6-S7BWo1a?A{?Xa_FgFA{3nIioDp&YtY6U-qFMvc zfxZFyV?!MYBM({3VXTrJN-%;8a<%CVG(JuwLl%lk`Xo~tzlI#!F zs7FesV+$e{j;Yt|e+0?n_Q;D^5^?jEfmX1c!=w(JH6H6;^&21jzggHDE=FHH#$gwB zh^jgj&b}dnRKp(uZtn`(o27c^cbT?3bbvQzgD&vJ0K?tjjp@RdI>Zs) zn7eR=H)hk$@WyoR4)1VyuuFV56B*zXZ_FLJ#TOlGOQNj(f9lNV);dV{_3#O`!Zv=# z)O5Y~1cR{Wgwb6A%q*E`uVmjYxVJxo!`1i9;{I7%@bHZbs$8F-cFLM}P z8oIU7(-i>QRVX_dH`lFU&5^)>fA{$?+=U&(a`%0|NFpTLhGKFE{~4S)CNY*mz5Q?C#ldK}7f0jV2b0WU zwiv&bDxaMp8)|=Frg9PR8!E4z%A{5u;RI>`}oC1+0M zz^JZ#jkDsS3B&?%)&DL$q95WK#AX}TVE(frDieune_m03I8f=X(j;`Yx4*Lod!sT7 zdFA!SpxOKFro+GZ0Z66utmbtYH197GQ`J`Abr6CNO~)t+*d zfDzXO)YOtjcSIVpZf+m}R=3yJ#+@ErZQLKSe|KM8CbRy#A>1aE-s9`%QlG#mm+AaD zGTmoi_pmmNwOrMVse(DrYhYWgul4o(OJrLTEI8*&r$Io6Av2=D>FX`%+cdZbvEvh} z>h@4Jep!$0!qx>utJ49?=QiNT6&YOE$X**x6n%kkR}%ou3m-hC|DR%PAA4`N%@v8S ze<$(9f`TA9+h9+rEB|XYpd}N;2l>yvXb~C36Q^aK5WrgYFh(`-kDXc-NMWgX_~6sY zb@pq&swsK1hXD<2K!uzEdk$hl5JwVmv8sb)Hl|>Qm37Rvj3l{OtpPb83G%&B31{j= zUym=3>&x&yP8>3_4x?%Z4)XlK(B1i}e;S(Z*D-E~-s0`IUiRBd7d$U{%`9Z-&B}DY z=_u0d!xa#GJ`58N+D@=+jz2PQ`n-R3rjC-z1mGVxWjg&i!oyj4hi^G4w)U2_FYWD| z?#Oy+q?ximISb7fn7snbl}p5SOhvs=VO&T@pLP~Xb>@?&>QHVh*0&W#6$7}Af5Kfo zR2)^V{TN8~e;-Jd7~%FKsk(6qLb-^n_Rv|4RY_i<~!-no4Yy0T*F~nquZ%r2t z86loEci~sFX|I~jeQF**Z6CsJC3Eb!;=PZJSr}LTHSzudZ zP<)fz?wt+jN+NHO<#$C4$y$;Ghm@?YTpwYwu1=ePlXma(vm1^i)Qxh zutsC%LXPzWG%Vkaah{^K1abQ@KBcuBE7i}U9V`gghXT|H5^7aUSFsfK`v0tdC= z3}S2JhsMB-3`F%>_4+E|nqGAheKFM6%7@^-L)@{7powA0@VW__X!+v4`+gvfZQZX{ zNG<19I3#VBa?8zwEyV33*eR*^;w3ysfe`EP{9>=q`SYBeK z&e0@PYVbU=s#8lmZKdw%NzK+_dIH;S>v@MtoudhD*5UXq+%Ls#al}g96O&p6JiAGU z{?N9B^eSXWF!kx^u-k9R!jQrs$Aet=EA+;!>?$Zq^isWCCL-VnrBv;u@NM0_)=CIY zT5BCXjR98bD(PtNf6%kc@zQD^obAPYw(8USUfDoE_4pppH%W!+|1$Tc*Eu&KFse@cW#Tg58DB^3D5WSP@f zI>#$+>s3WS%C*Cbgho1^OsZhrm!eXj@+qclBU2_E)&{1J0VvI@%luik%^T)j`0s~L z5Y~%rKHB|kfA86s`zKbalB|_-g_WQp2oa+7fg0r>fuzH6`EWWgZ@u@X3|9wP*B?Mz zz8REg@#et1e-G7-3+%^gm!DExR`{$AXL9|17o2SNPuKw&E->is6y(<;xtbKWVMS24 z!=t0oK3Sc;MlLa!(=78V4_JUA7jlXt$!0oKmfc;t?%cJUORn}rsuoBSkWWqPwkcf@P36xg@*8iwdq2&3!k9$6JgC#c=JKt=6kFDaVLtoXe}&jP&xYW|x0}Ls8q$Jm9N8PEt#kga zMNk1wP2o-4ha4F+xB6`z9>5lS^wmdf2F#X=A~l9eiKHOtc&U(LI4Sb+l_yIY;5f}} zIZm7d<2HFCv*FzTA^*o2a{R#_Aa?NSfz@*&yI_FU?5SeTZ9kgX)rdTv=c#aUgZSnD zf3kP1y^++g&mi$1!Xm^LRwLdYkSaKO2NWTSXhA{_FzGCplg-YeM(!-WH;qy{ z&uRT04vEw1RT>x`2VkM8ir5ryZ3fa7e?&;n!G8oxW(TiO*zxqe@(-)k`iGeuBW~s+ z=c3KfMjv9;`D8>Q=iS)qNLv$Ho8hI0Q8KeJ(m4PNgorVu~ z!d%rtZR=X?X9bzgqr*qEX*MeW>wPX1W`(gZ{m=(VnxZbAnLce{e}&kHyr3=1bDM z>I`QmdLg7U{Z5okb{LQsr$K=y;?(r`TmR!bmFOXPB+U?pT@{*biE|=1`~)~l)HPbR z=nBF=g@)YE(PV^f43h8|B!C`Xlfe$kqTJf~o%Jn#)_tN#hnfTBb7U74O&& zjvjqRa)x*78_ZF#e|`5Ej&t0!ja{H(6;mdA6Ct=-417eNb@dbo07s1YjmY11b=p?N z@rf->6-jlA`}?tDc1|MbT<;ns{Ko8N`89jWe~>5KNu5E|Ub6g@7V9w+53E~QT>B{x z*UJq?3!a~`;Z0UvKRCPRWCOC}r)pB&QVXJt9evq(0A<|1e?GdG&0ej@+5u-(7g98V zvNd}$&gMPAvsF3&sa5kh&2VJ+T6Z{ZV#hc*=$bP0SV+e7V0iHQ2STE{oYd%-C&5l^ zoYYuv>aR6(Z@xb32snf^+^H=%&}**J_5gEglpG6#Kp>{!f#yj^#in|AUmXzVa1rH2 z^(*osWotjQe{|sv$tz24B`#*Xvy#mi=Aq3DEgHWpi{a5Bs7h(=&&-Nw|Hnt~6kB{Jm4IrRmes+ENe`4NzixFc&1_*5;B@?s%*J%FPzw#p3+uD@-%Mz&`a`n<-wtm_;dI5A50 z*n&Hw=N95|Y%=WViBn4G?y~o{EisG@JCi^NMhg0g;;UJ{;{C> zw{nN?@qIE!XfqHYAs%{9=hc$k^vtNk+5v}4uu79uFwT0QZVQ0TP45gc4)(2aFBCe24o5;_>uS`dhb~0IE(PPRS2>&kM@rJM^4!9r9U|8DvNreR%N4EMOq@izlByKK%S+ zf4mH@NlS|o$g`RU(IASRb?T?m*KF8xEXAQPuIpdQ5(JZ{9}5lm3(&hPh2K;(3E@)) z8@ns(2r`prpjyfkxvJRg`;@Z_rVi$aYRQT!K9gEf#I5tv3UNBumHK{DE61Y6228$K zRW&#a-Ehnz&XZ+dWc%cqFElY`9>nvae<(qz1R%I*)75c`XM`W*iT4pkOVacSXwYkH z>S9$=Osc1IKL5bu+FC%Hs5l&CrLG%jNTb{=feUGH{>Pl)ce~JbOQ4t$2J1w%9hxc1r_IUzR`qw#Xj8>;`2UrRnb zmyKr8&}BR3fox5^C4>+X0S^ure^(O5LCV;$3|z*>oj6)v))F~FudEy`=>XViU4K-$ zLLTvukmo`fAJUb)F?_4 zyaz`~p@+nSOA&-yAz_zC4hBaR9u75j!B-TTZD(X8Xb+5v&j~S(Zk+*1y5zH3Hd}MU=NFiqt=34N@S2=)Ebc6?&)bp%Uj6) z=h}D9?tF44?}_%h@pq#@M4?8^wGph(&?FuNyC;M=N=^q;DWoY{(DXnGYD%YI=tJU-B*)J-H@afLx*%U9vnJY)rUh7`eV_)N{OA zFVBohJ&ohQ>E!|>1A1QJ-#ym~FuCVW0T<_2nnRZ>{G09`a#;?gNVyPPjb=JWnMaVo zLQyWSeThuE5Sh$9AhC+IjR(1T?FCR3mOwEKAgl+aJ3_DGf5_2t4)p!GEaEr+1UfmW zJASRM{zaM)z$oJX!OT*cJ!z6zgd@!CPq@-fgaWB6I_*RHO8ghy$925`*N!uHd41Eo zh&pS0yF^_i$Vn&dKs3rBL6D0sf?#UT4L^ySfPN^(Er-XqUTLrgc4#xD$akG#R1z0K zeK)WY!#TXre}ccv+2aE}PXf=;E@0;Js^LxmT!o}f4gf)BwlK2TG71iiRwuz@qnMR>pGuafYXlGAx3m1De-{(TZwr)0O1f1Q}PIDpXBLLBdR+v%xbqWHgD zk38ZyS6*lSf7;&T^y&=+kvXL{%o~oPzN48Vvmt@2odFhu@pFKy*;&9_MT%I2p%Q?= z|IdiOc1950VM^TBG@uX|4`dn;u7AfgU@fhIC|K-AY+Sr|qcTDh#|(e!{Er}Nt)%Qr zUPrO)e~W)1_;PS2=8CaMA0Hfj3I6`lYQL&0cw22(v5t|G$X*Tc13NvV4sh(|D~Zfd zEki2j;Y;4P5&@sow|Meh;snGa83#Ks za?6a`DR&RU32irMSTj9vl-!4p-X)L2m)tjbxRsF<+KxH{lu4puNuwL{I1)mUCjm0< z_VkMcQ(+*2gCcB$(Tp9#h+>p7YT4knu^JN>e`yr|nEHDK~7};0* ze+L3>Y%r;44|{HfcC5@P^OC6$MVB#YZIh;*!1AoEsI{l>4aK;r7PJAkXN7ABM90i5 zqQo=R0^n8`m4-k;5`E6%K^1g!A+05E)!==!i|Z?#_aDPxf8=v|@0u}W#1-{c`cYr_ zyOo%AYp+}SHgB!&8go4Yi#dN;UHP-Ff5yRYHvZC+5Tx{9;1kF_8m&mIsUq7^XEo#2 z*+^V!$p2Q#d>2i2zFO+$(&z5I`2-Cd);G7WV0$BXx8(f`f!PFCSiA5&q$je$3ZJBx zhoX5b8+(seo(V-OyF1IF zRN+SoVEZg;mtMs!l1uECOxMqLcV{{rjb(%JuS$qLal^rC==J!^`RWW_Jwke4T|xhm zrs?L89HJ-ir{`IzPT(%7FPWTdf7UPrXjvJP`MNZ|1|nm1_;?gg-yef)Ba=`8fX?vF za0@2cJ&QP(s$W2vRK{!Wjlt!xuu%jLo6Z2aS6^+<{$72x$kW=zoYh0y!=?onY2}bP zwcg8vxZ&N2-Jpe#5*T4t4l>>ydpG!aUX1=SjV^|5CFf(t|e?F zN}&T;5i(!H?q@;KPAU^GLE`f1w#H(WHr8$c)F)absGZsO42IylR~waBV=Zdi1l!9C zv)8_>)^J2Ad8Vqigq+sPk{%Y@%jJ`1ov>-z09HA{hy0TK8R$>RP#_8x zPphSg43dO)%=ror6A}P5fA|-!Xrg&x)D|3QyI?h6N(Qbfe<^E4zCGMh2jPbe<|K?|!|q9lC#JedvaN6ylUYeTiFWxWxKlsl*FL;hit|O4C-!f4 z#s3o2>;X@J{4u2}?v?J)Lc&9wN2bpKcUsA20+Nm6NDc*8E-XjJe*xuik7vWqwFask zap_}*oW-Qh{WICrx&IlJwFo4vtaLuMRBt

    -(+&tn%;WCS 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 BqOt%0 delta 218549 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

    (pxN*vAer*#DM6DU%k{bHoPIRUzQef@=Z|A8 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‹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

      ?L)) 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 u^BNAPREDQI88Q$Ml2i; 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 uy;4Sz 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°7my1@>M+6>53%Y@8b3%bci-b@}bNP-~ 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 diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching per AREAS and SCORING/TAD-210 - A2G Task Dispatching per AREAS and SCORING.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching per AREAS and SCORING/TAD-210 - A2G Task Dispatching per AREAS and SCORING.miz index b82f55ecafa456d8d6f83d71686d789195de7d77..76f3baa6e4f0b1cf8427cd2d30a09a06fe01642a 100644 GIT binary patch delta 219413 zcmV(xKM1HdP$@YSP)kv%u*pJvyUChlfyKh#ZXa{z*aLVxJn#ugPfvGGPj}Bf ziIPh{PWowEwBCOEZLxQ7aI`IsjyI2Yo{OFR=eyr;(d*%{z~q+bh}U1U^6aH)9*M7_ zB+7y!P7`q)52L&Ye}RX)hRvvjFmJh|{lLf9>_xc9Py; z9OC<*xBAWhG9E;E6^3a2aneIpZ6Ol~-a)ZKB)GD&B7O+6I34FAOUFf=L^(pm=fgA{ z1F8!Q#>GXNi7yB7`9;x7lOjt8K!ysLN5yuQrP*GT=fQdOe?@w|odjotC~WtGK^}D! zyY1^D3wnh}`(khB=va%G`wow5MbRd@p$Z?m(P?G_k9r$@)ZHKcgb4t#O^o{V+4C5Dtf-9 z5`-$nWA1*Ie-6b(QH-9w`|e;Itc-J@;iuX8yI1jx_}%B}XmX5|UMAs(Q8dC-+a}Yq z-=kguhOxw^K1kCS1c;|f(OJZ44`^5!m*T!CCZkA!#9td?nFuVSQ6z}6ltslj zO9Z1JBm#Scj5fa$PW`o2<$$^%nd`WcWioH}ze|y6qB2FL7JWj&s+7p+-U>w1V z7zJ^b>(YcNiK26zaQP`y2kG%U9--Yg-fX#JL4mydXR0mPKN)B(zac zJSR9<6jZc-j?xV3{~XJ7G=N~z%0Zkg4hHc}bebciTQQO}iFV=jNa5MWQk)GsLI7b! zg+eGsf0012>VpADoxp1jeBpfnq&$(NVCutRloVjy!ytrUk%}xD4T4@I(m{yIAiaQ8 zMFu%FODxDzolVx5r53p@Ku`>@mT|J|8yliUWLjinP!yFNq#jJfRhqrX1=<8*Mb zs{XR60y%A`vkjGN6`!QkkR6MvN+X$6Icz9Qe}g0eCvPem?}#--Z2j3H7TTsgFiB(1 zfQ`0n*B%&q0i}(jL6}2EB^>5;gfmKn6jI`HG9I2qnf7n|fi#wjAB~fb<{_B{p@*toDgO-ImPax-+ZTI;4^37tDB7~fokj8hN0mp1 zf46unZfl;hO|7M;Sm62+C-FdsB5_6CsR+6R;vyK0BIp%l*vb2BYEhWVlPC@0JJkm$ zz>7l0=_xgtPRv+YY2t10XQM(@3T&2ke}HtHyujbNfPbVsPwa@_F-8Po7=;k=fSxJ< zIpo|bH?ihh4d=2O3_vV}5PbtdD{l-g5Gp{l@H6{MTaW#Rj75TBX(E{ftB1ETn& zhjgtmjc|a!Y1gr1u&) z4zWV$t3#4%d8>6mrEz^LZ)n$We>lfLA3AG8sN~jLf3!S76wJ`UsZd=Z75x_JR&<_4 zj%EYwep^*b?{BYtwE8Y^yYNS`B3C7L7=&?<%qAuYy$eK}h`|U4#-_*V{+>;ap%y&` z0HOE0vnYKTMa4X{R{izW_daT(w!e3r?h&F*Yk$w8v%mNDGe_K@W_3i1h z3`bC`Z<4fd=m69r18;Ayf3UhrDwN{92bm10VgHa>)4e8u(EX4CyE8`Q}yzk(rp2 zTN>fUg}4fG0h4577}HK*e_)$MK{yeYAcW5jIj_*`ZIm2XNV!3M0wG3r1)Z1(f%2>> z|F6p2RWeUJaic&JRmjE+>e|0{u}MCxzAyWc5*4ljL73_{4=z6#T}8-&mS~WT~#QAl2pz zQ-Bgc&(EU_W^?l%s_i5QinBH#d7N3-D3S(=scD4%LefPf z|HdPN*NDal`1>72mI&@cC+p%lipYkd>BfD+{zR-QT{<+nsvRaT9*qlv#~?G!%BOwI zmjc=-R$7w!L&UPm0G5N;J(wC&O({&S6jxCM{hX_mN()%+e=Z=xd>&3+L%(^drn*~O zK$FX}CiT_Df-yvFGzAfvMWc3Sp>|EnVh};`fOgKF%@n~5SNKu8`6@WJNxxC)XQNS*NeM7`he`%S%U zz1fpdUK4+f)Rh6r$}?22jrz*oQl8BJ1U(qR>$C>Y^{Ew9`-!D|w>iQ=|YOnYthxAyxh zST29Ch1Cvq_XPbs5GU#j)v~H|^iED7@!9LIK~uc7_YCIZdhswAaO;Lu3R?}v1@M4f z8HjOIgOW!u(H0`gD9vMPp@TlO>R3$*8}R6LfYt$vo99W~k9$Fay{+@O00E9t`1M}b zU+)UCF3f==#b1A|v6S6i+fD`n#D3^~lC6JuC?%9rM-E8+IvU1=fe&O$2o;}NrX;a& zDsjIhEu{oMYANjz38d$cfOmzutw@yMKUyS^wC?JjFVZk$# z84bc-j1&+oR%C|G+aIhNDkyoGiezLEBo!2A1>YqVS$I@36`Xp_Ax)p!~ zF68nZE>-VJ`J|wj#!s#^1S5e=xsI@TsJHsIp}Zm~qp&J?xDv>+$wFcpKUMVMN&tXa z5?~gouBrr}HC>7g@qw|MC0({vesxuZQ``X8W+P3nh7Lmw9jl;aI=Wa`OJ8Qg;;6{5 zCVN=~jUTxxM;?q=G8Q2OQ&hzY+JAollvHf~1UMU`NK)nejOde4h8_CDTdUo$WzEYg zp|0Yvz-hR3@eWcZdaG;x`r4|%RwpQ0Fw??V7$-jPNVe!2wxJE`7|HNSIXImAPB`ti zv}R26Pzu2;tfxH6gz9=cS$mB4OD(1m(UX?J*vp8k;uiA}qGei%DLm6;KG}cLWD(iY z#Ffp2QW@r)D4?ocw;jgGo4kip*;%ARPQm8Xs%rtT>=F#sE}_FGKQy>j4IKqFuElit zq0Y6q{ENC4tL$#B1$iIGwSdv9aV^8R>|RYCb023h+{zA9@_}lf3N~l`F@{O9@R(M;X`{&b~n14hDd76-;oZ z2IdWe3>Gh?!&8p^JrE1B`?cM*FAkm6up5sUd&t#e;mGZSnN=WVa3f6*;B0D#US!hns$N%JDDRXNM5K$FFE5#E_txGpWr|kWgqf|yV1zS-6bgF= zF^MAB$bgDs>!qQkS@(aCQ`>4E5DwixmV1NIDQGPQ1yy((GRMRKX%4frdsGc8AgKpE z!qDG6DAL{CwmW0Z!kp63$6)RP<^eWq*fbCoGizYaZd;kntRha&*a_D<;o6>T3{x#b z9PW>YTm*ovtQ^G+DC3SAWcXXXKzC^=zA&ZkOhCkTp^I-N9s*#7gHO~ceII}N65GENB*`}nOUy-)m=&g;$Pukbf_;T`@v9U zDYY>Ke2#4lKRyHe=X@p!qJi`Ujiq@gz%%I3p(@%^C4lcn3}ZHis;@FBDxNUeorvO| zhWI{@`r`rg8PZ|gGe@3y4S0whIyx{Bg}z&>)SG|c*1|yh@pTmb2#PBwTttJIVO1i0 zy6MMnD?JC8Q@#Z6jNxn;bh6Cb(Fh`-J%4sJQq9)Y$hS;ZdaL8906{FvmZj-e5+NU2&W}{Y#oatu|(kpNsgsF`boDLabt zK?f=bs<@Td9YFdar0e0dLo%tOm`o>_G}D7t@P$hZ&j6hUXE@}lCWxj439lF65SY|* z?}28G)K#t5W`eQpFijduyT!@1SudkTc0Yea_1vN!gb2|3AnH@GD=DHeWzfWHo6~ov zGQ_>r4IG=3vKcH7HOmHt``wSVw(zuJ`8Ab-ocMJg>aj6#v^i5R18sVGF zQjNt^;_Hv!B6S(mXyi`6jsf_H@l}tFG4yaGgqOznhlm@9ZU`H27Y6?hT~!`ULB4;N zBa12al9fw3Zy2X!2d&`TSexQ{s%q$Pb8F{7*L;b{S&%6j`4k#oY#vGyiHYfroT?E# zcUqm=Ca0RIu=Vrfw~~uVt449dX5JR({ngb@eIrGGt1MWK+NPr742CY|s#Y#SP2KVv z?|L6hu(`sDDS<@;{FLBItg>8RLdJgsKrn)lWG>T!g(v+IhiaObmUv2uT85drsSQMB zyoF+q9eD`7)Ybb>g`D^Qk2p^<;&lIyIFAx><_$P6E#lCK_c%SInI_EO?l}xHYeq|r z;{hr&LRaiiuH9%XDz3t!7r@F&SaNehd{aZDJBFD9t@+SUPXF(e#joL~Fo;^PUBvg$WV`4j_2ER>8=QS8f z0A4z@u~jDB*hx1XxzkmAD(eX(hvju;8Vkt#=Sl0jg$RZ(W`X6Tlh%KYn{Y!3x1Ke_ zp~|-yPpu=I!?+J2uI?%s)y^(PtzH$~_v=(a3Ab(~E0Z9D0+e|LT^Y)c>B@`6h(Q z#tG^UD04GiFo3YuBvc!qT^^MtJ4^USfht`b36SY-zh45i#WsH)P*j?S3{$$A)W4i= zk+2K{XYGPG`2mjlI|qS!97qaI#*tf&i}Z5MkZLtb#@HW}H%XCz^k9nB< zp)-5G0fq+FR017}`F9_fVR!;z#om1IJp$U!krNOPH%Kw=$=a`a$S#x2zT~5?55C{s z!Y!ibX$pUqcQ!5{a$$M~F$=;MK+ZiGwbC$x0)t+nl~I8Qjd}S)Uj(Ry?stBNhXlvNpsJB+Gcz>Y~D+-QK>&1IP^TXpMl- z6S`Y(5ElhqvXp|P(1A*0?1f$VzHfGHNUB&1-^zc3RPByGs@Y!5?t(h7?Ff&49g%Us zNh-2quH6;WBR~L|3hXJ~KRBj$G>>CMkkWGXk1r#0Y^y3ndY~xg~X8$MC>2&x2!raxfyUXQ&l)CW*uT219`IPgaJon&$%!-G(u#Z74lP5sv z(HOm|daz3$>Js7r-TErdr)Hq7K*k!3E*{ht)^!?`M5V#weNAM_K44=9(`*T_s)rNn zOol3gTNv9W0vgtkRj6vtqCQ|?zkgl8vuu;cY#o0}&ke!!03j~m2`e+V?Nyy2FqzN6 z(cQ}&UJT)PUO*T_;rI9aYR!Lf$Tg3>iRRj$HV_p?Q#u1`V#@6nN^!Vjox(EJ7Bw7l zdpKx<-g9i%)FnQ?CeO=vN`o5AI#DV728pGsTO_i)@}Yc%i&#P7X%fUunQ#hCinu8^ zoWg%|B=)^2Q|?*83>|~c#~hk(8!_B;&hn{*C3sPCO{!axYYu_5LCD&pA7)C>x@o@2 zYMu$Yj^-J0#u}qLK&LnrIrswx+JA`$-YNDzDL;FF*lwIsraKO)p^h_Z=wmn{bDHIZ zjP(F+2zi}7zlTJHv_|#EEnu7k(6*~H{Q-ZNd;nJ^snh=oj@NHSu<1CEKxtRQG)IF# z6g5^e7fSh4dr*XpC7q*#D>3vcmEj>%)MkI#KLTiVIB7dueih@^yIc!hq^i4PoUAJ9 zo!qQ`4R`8tG8s7oX0CBITv^$!$z4BWgmN994dj5G2V?MpGs093IRG>GkoZ0PvBrO+ zJeZ7sRYr~PIE&FUvpMpb0KOmq5Sr~__MFT^TEjXgR_APH&%2Bs zV$x-QF3b7i@Sk8gm2sh-$-|*#bx3FiqBVK+Kva)IonbGHdf%mSExg0DK6LTfDw_>! z_JH&5hQ;GiC7*^@2a;1qlC|T(QFSmls*VIlk24G$%^m}e9(n-S;2uN%HXaCm>Fg z6Y%>NxM&@hsp^EzdMh6FsMfX0|uqZDMHt)e)^V zz=uD25W%_ygtF=Y53fIfdw2i>qwh3>sF{+kx$sgh@SVn>Zp_wTS=YJ*I>D`f z=yCxxnyz#&z4cb!GK+KcwJ|b~ zw`d3;bC)k{k(qOz(c=9FNW-2Ap$RUx2F<-#_~7veS?H@op^&)n=(~)O6e>$glJ?~~d;vX(!6-+hFgS~0MS9{-bM|W2>{Z2p-Q5`xz+*x2 z_y57*KEXhSgZ~#$OmDdw2q0m4AehtZzc_r=Uhnpv^>$LM7{2rEERxq3g{Yfclm zE!{kF93h#jaYU+t)~)pMO;1bC5C8Wv9xkxFydR{FpHpKOk?Mdi8?4a2XLMZG0e#d0 ztY2ZTXYhgsmvkQ!VxC8ILnp#al=2@VFtT9)Q`|xaAL9Gh1-|hBjCE4C|D&?4Sm}lL zK7vZjMpcz$d->KEz=3aq!hNHE{+VP2cr++>tDm__FPhF7>*0>9F>3?w$KSP}$RN$~ z6wbfF&dN>fX1$S>mm^JOSF5-Yw`Rf7In3%z(rCzrz5jbIyI6UNKQqRDW~ty_bD$4D z_bJ-yX3EZ#)sF`@uBvJlo?dww-MG8$7P!Ni@24>(BsJeWGgLW!?P(o<$Oo@dZWr+X z^wPt1{3wXc5oC6E?-gQR-ZG07Y94v5&f@&i1KF#egL>6r?1@Zvsp@!)*!KU#*@J~S zs|Wu?!zRPPg1iH-Arx$ImX(Z+8G;z3LLq6&Rn2XD6SQQ`5@{+ts?_4v+biy27w z`di1n@wh1AoV*4}_qY;3W-*d=G)KaUX;-KL^;!Gzuce|IQVIdO$tUvhSH{!w z>IeE&|BdyX{9Cvo=%7z$qj!>@QvkNb^B_A<3FL|0AVDXm6w$%fyvXqTN`2=<^z(5B z4Hcb6+u2gzYGBWQHpJYGN}TY$j6(*?9JyBCoG_R>Tb_9_25XbDk2)JvD1>=K4!dzb zYIpFevNeCz+8SIch^;Bi>Z%AKWew@g$_^!a^YIxpd@p8Q%U~3pwZ-zXNB{p>B6=&# z_4IC%sq|{KR||6t$FFm|s2-uys++cQQ;44W#)KH%H^-2jk4KnSo)^djAoS!%rzt(eZ}-5~2FmQ7$DvP8@YV)C z%SVRnYRR=_H;s#8K=lVP^hE})zG-fKnZnSrVnSYEqk$jTuQ&&*y`fA`Z=g5&oN|=3 zLe?0xlixOf=$d-`Q}-U6L|^qKt}7|#LmBl+w7amHWWJ~&rG)G0N(QZtu$9Hsch*&~ zZ|bnkHFlqDR8nQZ^jtap)Ovthjf`qyf(Z)M=)eutT`H2i_z6|iQ>v!=N?NOgWscA40rCyEC)Zkth|TFzHXP-4UX;;bCd++Vo)Fxf>rr zKlg2ag#1}Jba5MG2sE@qLjOF87-z(Jv`}ZePR*!cuC~a|AX_8@AV;shm`4sQcdTb} z_$OC?gHNIM8XBmw`pv_Xc1mTMFZMS#Ri?rhqiDBRC8?*iS&G$SjAXOL+3bdEo?-D( z0kOGP9U(D%=CJr*Ito$h2)J-rjDLi4K=iXCG*Wa)nvvQsM+Bgh|ZdbqPEYSRy$OS zUn+zEsAg#3^#0`?!L;Ir@K+Kdt=Ua7JbtX}iW_WGSirB895E4BS`*PzCS;J6@tE`* zC*3ucL(4Xt7M7K0J|CfHzf~nO0#)l=lgdur66~QWS3(SD0>Bavad9~=o0nxz=Ip$G z3L8O=^G|>a;ZA^ub54K@QQWTVI%BiXjOxmD+pUErxe7tslYvvjdRpStbGY>)c++m~CAe+7j4~H&}bnp(q zA+9W*Md7wc=joJ*6dPWNdpE2+B&%ecCnipq0oQ zak!%9)D}xIx3-wW!)t2}eUWo7uC67=j%n1UyJ1Qz^}Oa#N_urqK?57=b-0!YkyIb}IVO z)}?bA1@PhR zR34n92?E+q1YgL2Jw!ClfaS8@1@4<-L5Ltwfb(}YgrE1NP;oLETep;doFmePFeR}f zo&vgGy3n6M0ui{WwGp)!OTwpHo5!19Y#wd<$I%eBtl`}dq?G)`w6<@mD!wpv?!WGi5>G{TE(RD2^k0-Dmp71pYPe3 zsP9NvA8Al2M1b;fVGwwK8iyV~m5NiQD@&p>r)R&@7h+i*`n5#F5Z2jAYBxJIUHI|f z9_%T`zF3()_qH$MQ9}~m&k;4GT}BsiPc@25bT#OJl$1yO^(2^Tzm$8FbCyra$+gy| znox90)uC$3NoM0AxXfHlt&(WJS%Zd`ns($iQdOrdtWrvSLkp{as)gaF7{d9nR39}g zuws~sDYVII{MBS3N7`UdRo2EQRpB4JGrqV2_s$~P`3hc&aYZtza`7>q(ca1m(C3Pw zv^N_P_0_L71N(cf`cpLKhhL257?Cu`k49+?T%|=;kf#jaQ^ zYBhX^BS+7A39zA20?1DVH=$NPE!{{p80b>r^AxmG`_t1J(3m04!VKouc8nYb)RYNh z+9(K39tCO6;s`ZGAgQsb3XJ>I3z%+Vh@q&^%Zv(S<3G`V?t;6kH8ntO&T7A?t}9bh zDb-y1OG|b-8tT+2g~7iJ(~T^_;Eg`9Y={EQ2MM4|>M6AxB%2ZK)wI6#L}`6Uk5`S1 z_v>LWjeB%)n7|!7S32{Y{k?g*dq9`T&gz8Lc0l#`q5NT6_&RNt4ruI9cXSH>nG-+5 zkwX0Q*8c2&cNHo>@}`dW@Y@4_Ty@D7!3=>!>HFhOqGsYi%VJWy*@)!;l`wY8|816D z#$lvKeIw1@Zk^h_ec~e*U+@A%vO76K@?v%beV1#x*JAh!R7>#if ztC}w%66F%6>d=`%ty@JKM!Qx^F$Y^PBTX=wMbD|>)=YD#>1gd31+(U97PmG`-8vZ@y6V?mOxD(e zr;U!EjJ+C8Q~>mRayeJ01m>cI=@^>Xv!M5)RsK>$Z=4as>OIb36pfyzqe)u{-*LVH z@ute@iLNJB*4SU}RBE7P3aws@CDSF4*V|4TvKj2)^1sYL#C$qV{4aZcks{$z^y z@mqk?nREgU0)kbW<=!!jCDvt=r+prOd6WMteYU1_b=s}^Y}I;(`TJdXJ&Ljzx>Gk% zTZ=S>bH|W}S3Z)7pH70~y$tO*ohk&OI>=%}B=BQ~XLrL*st33z8&mKjqeK3@2GuWD zlFFxY9`&+#RJ1&XnLPB4Uj!cx(HAyk=sKn?g}v^j2kZcuVP5R`iw|SoMLuD{wJ=#`w=%Vzi!PAiSZ*WH3l2 zU`H{kst{LtNX05YtuNWdT(LPi&eDXXw*l~fN8|PPaM$ISV@0kXZ&9yjDeNlW%g+y^ z&`JgXin45De{2p0gi*kOemnhW6kH`oe3K^AWuALcGKR=_Q34^#YH4QR9%*3V`G#VacYK*)?$;%0O1&YW)NkZ%TU0a&vj~B!%NJJ z7&R=HzdsU)ASA|{tE+1yt;^QWqvBx1i?MEsCpLF{e@^l@Wb+>N>~UTNCe%PxN8hTPqGa(DlWE~xeUI3B3kJ*)$kOVfSaf6{axwlp)sN%x-NBu*~*HYA*}&(%jR zuAm(Ej4Jyn>>i)mP%oE|UwLRDDW=92!e|UGl-ivuf44FJ`dsLyr{JBQta>?|&32V6vZNxisd ze{QI~Z}e!6P(N;Oehbm!>x12`rxK%FM$fc;3u)0>FCl_mqsEyrdSFzlAqN8<3s`GU zETbl*ZyD?#Za&{WJ%-=k2pG6~V2tSq7=~sVB^+mgeEDE?6|nHX&TK<}?@ork11G{z zKHkuI6~s9H*XPON1Za%OaPvD``!P&5e;@Swv+Z3X{%`U3w)ii8`gZf^=yY>`>va3* z`R2FV^BB-acQPQXv=ykeJDbPX=^&hK8;JG4VZ0i{c>hj@0X0VLCbsGK2_J{YU(7ZS zKw6%oBp=+VB!}{1%~X7o1$mN&L3ZcTY(>B^okVk(yhfd;WFOwCWSRw)XMMr)e~{yC z4&uv_&sB?KFv~uC3=+)rVK>V*9<<3-S5TguGSqZG)@BB5 zLT+BO`>bqza*s5s*(|%XD6}d$e+A<|6JIInz_)Bvw5E-Q0g27_B-i{YNmVaG$|Z#< zTa&!RdV$}-v*ZoS=nc!3H`L@?Uvy)*n0|>zX!e7W)q$kiBkLW-({Se-_DAza=FKvS=+4$A8zn$<7$rUR93Pce~8KSN(B7%@!W*qV*vb6$?|ZTTn&Eq;|Ne%h`z_|=X>z` zGZf7#?U1S@LOwnl8zwkCP6Mr_YF~bTV>?}mnkR^@fXHabL4se3VqW8|`Bt=Ob0aJ) z{rPOp>^DOlYYZ(a(97)|i+*ie9}J4$*HXMUgvxu!Ac{k*MIk76f4+1QOo*kBTfHH- zdqe)HH>7d#TqwK8!GrTAMG2ISLul9l;6)=_s2%%ncyCsPPcDq+mk0o+_(pHzALuPy zIw7vIRKnP8KTqYvv)M@e31>)6YJ;p6_0YDEKp82rm~Coeimc3;Ul1zR~JImC)* zXHknXAc=&dzb(wwfA4!S=MbbVG$Xxqm*3=uJ5N-Wf&C}S9fWW9l^WMCpG#f}@9rxw zP5%EYB*v%<_u5mg4G6s`u)pv)d;2d@^r@t)yvSqSM?SApr}V~&k;RUV99U~PN{MGe zk7_yd%F$ASF4|g<;O*RXadKG|Q&~&16O>}!%XH)63;H~=}LI;a;;_*?nBX6VR zxesny({jl3Rmvt^u6`8jVpIIwQ=JVg?n7tyUR+^kJG1bshPB@q!nD?2IL=xoFYO~; z4(1EWlUN;c`fnk45LSu4b+Pcx!694O&$~_DR*5!9fBwsAw8XmE`D48$4V#cR#kwz0 zN4w_c=rw%)7&`NuO$FK0Yo=_i&CnE>3fkG4?%kZ0wh}E?572uwsC$~;eW2MC7B(qs zCf$w7SPDb;@B`GYdcbuwtZs2xj*hmq%-Z?K(&j~3nqX)9vh=!n8iDWA#HF&r)<#%nFBL-*86 zNXP`0R3w>dd^T(wFw(&ab)G{Eg!&aeCdVoY=dXM#a)?ogxER9Yrc~mk*`r8HNjah_ zN}=>bBv|>j{C(E`>bFI-bh~dj4_FV|u-_NvfB2S{$`{?5Bzv>D_@NgeyAbNK^fj># zVRM)<40+tP^7!kccmS7%TJ1I>vpEPcy}d!^UL9Y;$ZYw+*+%7hZ6bEM8+sGaV&jm& zP&m_w2h|wbiVo*DoYufOUG0H$xkmNZ+oY<$O>XI+mQFj!uVC_cCi8kftLh{l%j3i# zf1D*Hm?$vF1aCPH{lSqLvS$11!e8Ac~;>{C4*oXL5=X~jY+@s8DZ1iJ@<@dTTIYq$Z zyOCD|!+>I(Gs%EW2&wm|QW3)JX;SO;e+T%~QAPkq=VeC{pS6{#x47=rq`p%9rH?$v zWPKyUoNi=r5p-nTf^QUoo||h#M&jU zz}(VhfnE~lx5PdFX-9g0%)i|q1^=P+590R-p7;+m_fW2n89!rWXi0$nm=Hve3Yc8;@J(AGFZSo0g4F65Bd%me@ID%oso9iUMlId}h&+*Os zC#nPdXMLvMgYc&QCt%%@E@Aj*2WVQ3;%t6N@9Nne_~HT>yF;w&r`f5`FsVmzw+^MM16wfMjl1eqqq4$ zLcUPg{XIygrzl$}3R1wPMxiWk6--k<)QS9<4}+Sn_h3hmU^c%fN7fhy=`RJ={&;|g z(mY9J7*OtF@@o67N_@3&K%)y47OTk-_U|w^{Dpf}_(wLA^aBZo<+4|-e`xg98~xld zm00yT!vL+wVP&$GsgXf2zF5JsnN$i-S45WAg-8S^@jC6il<_JDrUp3NsA38E^W2;s zRtksYm`gK{X4+II#5HIMQkA~EtTd}`rpYa;k0J1v2LZdYV6ha5@+(XD3jv!iC_xi- zD)dhHB5+WzD~MHXu6LQSf1+`jd0>k%Y)*9s6{5|!k~uB0Vl6Bejb=R8e?ib%Cw57p z+x~zU-_t^b?r(k?^Z9E}OY&5;v{-L&J&bw~N?=2qC z`JfLcI|a)5z(D$qeduqR_ot5##)kPVe!@lJjkPpAXmNtOqXLZZ3Mo$aZ;|3Ody$kw z##34o^p-jHxl*brjuQ4?cdwMWIor=&cSza=YYY7|`WNi@@w2-FhJKfYJ>3OiJ!{ue zXjJTdZwh0qXS*!ye;!wSUCO z%1MNO5r=-9W$nJuRhma;N0HIG;4e_ZQY7SQu=ukN8cE1#>XXq(%yvBlsXQUwicy`n zK=TrNZ|Ioy!K&zw#R}27=#R%5QOW>3dporUuB^a#{I*Q@f4a;fkH|G>B3*dw3Ut9jPtN$NtI&OgS7vL~{v#^( zC;#eE6-HP#I{pNW^guPrq-4VHE)9KgpoBUi5{!a8z10HCJv>=OCIiE9Zhir3v`he| z98SX7fA+hI77eB9Qyz5+j$qaazDFxT8Jgx!s-*hvL&3I+Am}@Hh&7KZ(Z3}a9L!kz z>46ig=L?$MeLrMdu6vbz300!v5bTF_v=1o0N%dvOb;q{R4?}knjHbW(;i^leNzRt- zjr6B$Qpxw~tlC~j2tCA|RX=K?%#(TTZFKMrfAoBn3b6W7bzcknDQ&Y0We_ZV82FgY zgnq=;+)wMuu8nx3k&d>^$;P=;F)->gA2#L-TcrE8u0e?XILv-IZIu(ljl!~!ky2IT3iv~Z zf7{OkzvfhtwR*0f@Z3WPZau-q($H{xLN z@n2)4yt*2-d6$T{j}I6365f=PtI;DIfAk4{XQC2siv-^``n(x$avk!iy)%3ZbXK6W zw68eH@=Bz#%svC~yv}f*8=ntJK1n>eSIqd0$)nMkJ;xUbq$S`C$@rSy5tU!ZaysQz zsbX5e|BFj0N;$89Xoe>^#mR{PS+lapX8`xT7%4EBmoHz6y?K3Il+})~$wI6_f1jDn zK$sn|FRSb-7e5g1%i;>en4zT54WD8|#Is<_rz&<|%vZ%5z#4*gLfE+dmQUf1=_&Z}3`d9n`Hh3|8eSFgTg zpR!l@=nu7jg&Xgymw=qdO7PJ}Ij)E1v2=O@cYbqGn@L-nW!&q<7^t|Ye?q9`b)6{w z?mzI)K<1@zhT=rNM#bZM&iNl(P+Q@=C)I^8@AouHA=;VjT2O|fr;%`1RfKP*yIz%1 z?1S*aqMox-2yci)`I`s~T>))TDp}8Doe=uK5Q@Z=ldf4J2_~S+#~F&$Zcrz_sv9q? zkaekRm#}oBDYWBNFhTuzf6zsRDO=idP8x3uxfUeq%c&R&FmHpNU&d~i;k(hyZ=3~+~Q|PEgF-=hstdk4gXJMFP2}HZ8wwbGuTM5hP z)@UIyc*YXSqY3aU-01l#vJHZ&zQ;7QAv8@GXj=R2X~C+7`9l{2e+XgmO#xk|A;(<} z-vHIg=P%U{^90o2R+*z?`4L#HF?!ZcTDTP~1x_%N1FQ(w%8U4cyjInaOR8Ss{i?=0 zn12Aka`F!==lN>K|0Ysz^!fIqo(ru^y z+hj@`!+Rq#Z$@-FA6;s1Q&{gJFRar43_Wyc0){fi8-fGOS8E|Z%Tiq9qi=a6N(>i& z*{gIw>ff+{gcH^@zyW9SQx_N1r3a1*G}0-G#p;Uyl}`{yf50ZoKjHsZBCA-zkvI~6 zMvs)FDUKg%rfQ4DjemJ1T=-Vm59#5e^{gsg#}7dDYS}u&C6%uGb*}e5rnLf-igYQI z*T3|#%7>~CC3oqYf$i#?PP2d{wmarHm5NDoMN3?gQHRhC6|D7aPCVT6rJefcU@7 zi@NgUf4}jBhtIWbcp8FK&`Mx-bG-~d{z(IqxPtUI9_vq#>LF7C75){<&>(`GLmH6i zlECj*D1h}7=jX|I4AX1iC-#qbz+sNFSu*AG@;Ee}W%<08IMH*25Th25N`n7O5yW2o zHi4SJhNGeNq#v~KsunmYm`$>A0tC|RDyu<&e^CMd_oJti>TY| z+qd4hewx$~IL$mltO#XH3r~MS~w0Nkxy1CAzK%p{QgdfZb%T%f^M|T>c%Xq{$wVI@l8|YpRuf zHZii}gEMYFV+*xmQhXKh21;*Kt*x<@eNiLtCdI?3cbotB9c;mO=dUKZiX0SG7?3fF@7U?`kJf;s$w78e~1oP z@JP2h!WBrV1CA?~;r`ePX~m3`l`!-Q!fH>&e1z~uvJ1Etc|Ylj{65kZxi6h{!P+T$ zp28S{?Q^W*HyRixa(gn(H3Z|twq^&(VI$EQwvku|%Rc}qK-Rw&G`kLpoZ&Y+rpQ0K znjP!mzRiwR_lRZ(1pc+n4j4XPv$M>bO@FVWH9f8!S$55~nVH{bIzUJ%3TT zVof3;%aU4Rl2$GRwVFvd!sYv+XzLcY2sfAafDlc$0=e?m*4`AQTw8;t@p^A`Kux%U zRA514@yaZVpPWFpS;Ssji^V}QzUK8-Xc#y>(*~$E15~v5PduEp`tO~;PVyY8@MxA? z$&Z6L{v({*#`CBNt*`$P;s3awC4ZaoZ{GiUXc2dJcbye~u{jjK`rAtczGH!GCLEvS zB)L$^q?Ah1)NWJoX~s;D{-2d~Qx>1I6w8*3)iN~MXJcEy8IT$m_O5A)IJ5j3*wK{{ zpkkIs3mSWPtO$vm{Qx)W8Z>w6)+Q6?fStjN9`c_mD|F(kS1eDtOkbmV^^J?X> zRI@i=x^v{CuZIUGDaUhy0cf7Zy26F7d3jR=a#!=q3OA1sd|inBHzS<>&TCQ<{}k6y zpeeT()`4d2SjoGhmODt2wax|1D$s?1u?H5S=0sL(MQ2=QGRbSTbA*7UnT4~B_f7{0!ba9?RB@cX@Q-|>O;6?!8F zOvOjw{o)4U*QX~R-tQb{d8#kXSRnww3)R5Pkd0*;F+oUl2y3k@)d&&V{aXzGh7l2< zkFfZz6}*=r=sQpW{}nNj4<4fJ^h4lSp9 z#(2^?27e?D(e*=hW+-%u{l&PL&S$y!(T|i)vHwM#iV5f~4n#R?ielbM1DtHE-Mf_s z<)Gk!I)8ZDF;QkvR@6l4izm(=E8T%3T{8WW+=7>OJG6TWl#7FhNaPvJmNl3u#4^(s zBSF*fK$I4_H)G?rouCgW$;c;Jt_uCR$e=fzPd|Bv#_`RS%w?IV?s8hx1QNzkdzGl> zK|v<@oEQ#Om9#XH;nS1{ggvF~jiGbZM~Qwya{pFM(=LiKTg0rksK4LV)o8_Du01eXa*6#^&WLS(y)^YzBmyx2Wfb)D^sIs zm@N}LM8=qedj%sF4gd0Sa#JB49z!b%G_KGBaXcg^ux^>bw?DvT{luGM#Dj5Ys;|U{ zyfR;P;gr_tDr)HV%BrTm!i?xrIyNCouB}{B*94PAnmEoQ(WPzJHQ++39rNp%V1IXi z{-}uH(1&E5S;%5Mo|jc*p_$#K#JUHn5}OEB10%$ZPPhJ2m@4HnCAY<#2YZF^N)95; ztuDA4liZ~m_+zpvN$LW#-LZP5f?HjNp8P}J#QhNPw)icTxaAr)x8c^hJIT2(v=b$o zjTw}35pn4gYR{(%RjB%HOiy; zmU1k!&(r`wc?9$F;P(gb&i41t_U`OefDzZOouNoD_GygCx$RvR^V*i1#AQKB>AEu< z4~a`2X4ttG9#vqwtP70vdA6mX!b=47XR>UE3__qW^38EO!UjopRCbo+pMN%Sap>LA znLixE9I;2^u@Gge8|Af!Vt>KkZ?J`YkzO0%+L1}Byh%*0GMhl{>yl%`0m_v~Gs(?T ziCvT|j53k1o!ZeWW9&FBU?8YYM=>$CA~VTekoK28iDq@r(}TW&>D*R(C0k`N5gB>K zp7wr4A(Z&G#Lc^9j7QX8Vt*abI9arT;>>#7uwNEwKdBRgVZ~x4o#X_A5)3Rj7hECP z@%ac(YtgBzfuk8Uz5h>A(AKjmXzKwA!V_;T`Vs#B>3KQrb?(%`Mr_E`%esz*ol2wa zHzE^?i`WUL0ERsx;p*99-BSvH&Jc0(enatJL6Q`a#1wk+6i;_c%FN5~!nGaxl zGYbmC3*=wb324?#_%3F@m#0=84hyJ0(2Flhvo3!;q_rf@H0uHWlroQ^S4K6+Q>{4R z6jbRLj3ldOtTkS%G=Ga8N}&l(2UE3AW$lOpRgliIoGv?q4!a`qxB|!2nH|TdRfUFz z^HOL|&<^WNy3+xXJ!Wf+lIt!3%D#i+bUQ8zxI27}jIYSFh~VkF`xDQ^_-q{ij&E4n=%8a$$nrCGCM(JHNms)m-E zIwJ#93#8*I5VQrP(xQ=EDPK#GmQ3C7HmkT_rg?yDhHK3U#WOq?gdMM>9=fe^kY|^6 z*ca*0OC;1bpnn!<5MU<{oHC$OWLv^S){Yw+V%>x7DBoo2nm6_Zn%DBma9HG0g+jPwS zg5Qp2SgGirU0kaNdk+kAL^-7;eb&tlC8{zK4Oe9uI)7->GetCZ&Zblg+LrRdr{NuT z-}Tqn!5H@5ABi{L?7jQ-f%pav$)BA5VQtM<)I0~bIK2ga%8~_6pr*xmj;dj)kqT#4 zcx8)(W-PF=^8)4=vU=LPQx(6#ROdMF((u!5I>64lBXe!an!NuHFtET+5= zfQ$7`FMoA$N{B?8NyRAPaBj()hfmP50;6RIbTa0hYc~b={q0qC9gC0VldQADEy7QNl* zqkj~hs<7YG1!UgQxB@jq; z8nXV$`(GJ8%%zKt;J=>UNMX(LU+hb538V)onp#+2ak5q*%gLm6!W|P{|35Ue*?$tD z_Z9HpZ@>A2`1U}&J2==EZ$IpbAIDoFj^jWAhyh(8m=n@D**}5%I6oz~kv&%_Y3xwL za3#m}ZKTK0--5B?OezQU7;b$9xI$l2VQ0@TF0RHf%#g_^&Y>+yt9T&*jgF?-CrP=6 zGzYiPY$YD(OlH^<#$(19ykO*HPOqZy)KGROu@_{W%=jg6V_Co5?pHJH}l0pl*yM$8mF~-aY16P zMyzsHk=<)+eX`yH^+}dy%SWLds}8O?(lz~Aw>RU|H`m!TRkZnoQE8;EX}1yLP+ep4 zmy2rYWp4N%hpv>tY;*QqJAda!nuEDzpVJrlSO(xXP#J}3EW)u|gb1+s2Vd*P#QjT( zJ-^&0_zOz1ewjfqgD-lc&lX3fZZT6{^K2kiSvz_*h&Q`4qu53*Lt$JubLwwYdbA!? zZY=C(RjTN)`te#6Z+{?}KEip%8H`YEvo|Bb0e%j5_=989fxjVbX@95fq;?uRE71SkzL+nBTpW$Us9YYLp_*#gK) z1-I}&)M2g{Ae-1kO?Y&mWR*T6gRT%n`hErPv;QnzjeEsc>QK$uJq7aBA9g;Vf{ybl zR=|kFv3fJ#%zC(3YkwW0J-E#GFR52ZzbI{@FV*S&1;2L%`8DI|+lb8fO8Kiey8B=E zCW|D&;EPunq{)(D!b0eD<{B)~V74zVFTfbOEVFn1j$oJS*_&?;PQ8mI_U_!apybO-7?=gYYYC_4i|=bgS^uf3w0V-RRrXM?dW& z5l6RSg^ZdN(%{1Nv#?@zeUz3u;z1w|a9qtu-ty7Y<}f1^KOAEUVI>Zm^^S!l2wlFw z3d2%#?vm+Qi+@cgq_7*vx_F#yCsgTV3Uo_blHXFz3-46ZBr7GIAC}2Yk;mfoynn{E34)%%a5~FjggnQ6t@PCS zILY%O=fz5egOe=R@h8joP?j1Cg7j@**Kn=a5u_XXhM;gB;^gQ zeAOJ56$2z^wzdYOO9+>UB~P6@Qtw>Xj9*F&I!3`P1w3Es%Z|W!_qC z!v9y-5=S#CTDzjd`T8X8xWI*yT260y#;>@Q>2j+@1vBBauP)vo_;V;j++?`xRPsI@ z+g@2ey^2b>{fl}4;F$d!rL`r)C9a&x%o}@Xk0^BrDIdb2OaIj&kI7t4msfjMsSPNA zMSm#0UG}L&a6o$=op9ImaC^@x?4&G4?{Yswaj}iF$rlsH9;gtXG7P54(QybZWX4;S zCX7cspiKrk7^4$)mTz-y`O} zOrFK>D&NY587DUgTWJ;B-i$&|?9qC}2Y*CGM_-8S_GkpGshU{I;6&!|7xiDjR`+W$ zEf&()3TuanL2PE9z#ekomyoV`ktmtsE}&Z=h&8^|ORq`K`Li2E0Nxt$6?M^?a6qyP+***aI1}SYGz) zgnS=S1Gat3{|$0HWSnPGgD#`;GJIJ{eub;I%Zr^=j0VQ*BK9`@1A-@4HGeMCw+gtP zB~>+_$x7XFq}u|;XjtMNEdjJ~DNz;tR+pvF zTOa)L*g;<7gVE14iDDE|$|){LSD`BOy29Ska-}#?>r_tq&mplY-pb^&d`4AZIrLy` zlHqcs39!xR6Wu3l$Q30W6Q3ZQjKy(LQLH^Hatgg|W8(?UN(_Fz_hJ2~!+*$`<>X@x z?ks4(Mwk{lhOe#*{2hBUdYy*K+4mSO>B-e+3$aw4klW!ZVb`N4OqmwN!}^+&aZ#4C zg3MG8v@2B#_TV&y-=ledNm>+rZ_WKH0zFAQctM`Gf!a&NDDGg)9(%a<$5jlg9A`Mw z|MD!GDW3R?B&gvBYH@a>SAQW{nJqN*sYaf$d&z&qkyba7)5@ng56bVPs&@w<0rLXC zPlBs1hYS~y$5KuLt_rF&f5C;f&)Q&ZV9Op^xg%GCh^a@Krrj~Sa|qW!J%qrWa2^U~ z0=yIZ#fvP3UtfxHn#Qc35$_YYcztww_DzH!R6o0xFC|(N-?d^;j(@AnT~{v3Wr21{ zL{2eM?iztH`Hm!J$%@=xup;YhH%**@{LeMbPUFF1br??%^LUT}ygA()J;(rh)|}e- z{6*7JzX>;TtHh&e8w%KEGi@iU4!&kpZQr!!e+=fi(f}2rE`RSqe%yu|aOda@S$heK z`JP?Xmam7mh^g5C+}oNpTA*-y$POuL9L8Xl{hr)c`>V{E<)YN*v2V5OWwv}H86RRs zW$E+Mabq`e<{@RyY5`r~IaL?qlzMxtdQ3Mt^*^mro-iJC`6PZ;zkgkY(6aBB(bz{5@#@@%fVagK z<`yL!yIMlx9OMK#EGfcrOWnez>VtYky0e>uSglKW=%!~k^6IAKHZfkIwJqsCt(jp9 zs~*|JoMQ~n-?&Z|Hm>dl@$0q*@yM2tO%|HFJ%`2gS;XC?mI>yf&l?MI&jz5)pHsap zZaNF?vVY_7;hU*U%7&Wg6L>zxZQMgui9>pH~pGxGTj?uogSQ#>`j%vzwmitKEBJ%*Q#^R zKU0UnpzFs&72qfM(wqdD>(nG4bIaj{)8nG3kbfRM03lN%#Fq_6Vvu0bB;86ojNEGy zE4o`#rYHsagj7zF`Lxz|?P*YR49UXh0wkCteUZ@_&(f>~W)u9Ty^5?Zmd#2OTd`-Z z*a(~6=E;n~!~n|45c(W69?vgsP(NMe$ZawDjHzF$ry7O57{FXOdM(3CM-|C=1%8}< z!he5T;7@YQ=DG!HrWuw{$^+3-*{j@8eQK({+BuKQVnk7 z6a#O7IqY?gMJcr@r@Fh-x=uEF>huQgRSUaHQJ{2_L5|?uKZb*DGQ4pi02;Qxe$w^u z38%C~=I*7&JxoiTBY2D8tyM-j0|szwi+>Y#HKuc?zju2yoetL6o~#H)2LSZtGv?N) z9%9=T!PUWa0aemTH0WqG>c9{&p_yCFCRgWW6Ps=7EG&Mj5TFhFl#P!za=l!=fCiE1 zu6q4CRl;qdhb}n=;*PRaNt82S0AlW0JN-X&blO})TQ?vSRfno#Ny$?p6fnD|JK)+&p5G7j>rsjJ5R8Q8!4;Uj~vCwG{lE|JZs8t3fG~>w&@X z*9vI2vxfY(>`n(xr*U{Q;|-k_>N8B(E3eeuN_*lZAJ;GV=mK4g5?%&zIIuX8*himz zluwE`^Rk2_x>?9c#<#sFO+1&McYgxzKw7ceUH}xXBS*h^6T@^8&*N=HVkMuVx3HXi z1uz@?ZFu;}T@1E?fu-+q(UVQ|M7sLDqVItS3J~LBkkdAVgWnG9T?`?Fp&Zs)Q9ioH zbOX{t*=B4D{5H#_t-B4(>?-V-|4sqJBP4tx3lW_s)I&M2%DRN0ypU^~F@G%KXXcBW zC#zS!|C4k8{~Nyg{${oF{jH7a`x`$_T40kZ4!(c0XU8#Ys=E_Nvo@(-O& z-nKd~9{k0w*mMnyl(5V>H-G$cSY76Jl!aBMADj4hsJgBH%(~n9r`FxFn%n+&sJZR` z%$nQ&*Vo)Xs|qg89uvyF_hF1 zZJgCVXnWx>x_`vBC|WyP8m&DdMtiX|L?hp$x{Xce1nMoH`{kRd|9>?-#@T;nhtU?M zojtb0SRSak6}R=w7585hq&>3c`Zu=iXRfpVqVVh~>kO6-`2yduydiDz-FAFSrCK0N z)z<6ht-*r@6=?go2i4b$dso*B`oATURxg&$S@j8c07})J<$3S8AqW=MH;G(#v~Ztb z!IAF)(ZaI%or9$j!++!EcZ~G(!*)SyYq)10u9Sy`1h}Pb|HIpZQ*l#DJP%Mg&)4av zA>8M^O>?M3fw#g`xI#0Z%9Qsp59q~i*aK1x)sqnYUjH|8{Bb`^HsjyC|Mjr*D*MeL zTvX+iBak;Jm}S)?ONVHGV*Mv*P1*vYy|l8@3Hd_!7?z zkj|=_9v2i`?dT*YwQOvI;yurO1mMjj_mBY^-zR$|9Ha9wbAP{$-u`J6Ay&3&DH*Lx-&Y86ydeqO_NWv8Gn-TxF}O~G>9c)2J$a+0B{VfSE0Es z9$fCQu(s|`{tb$6+x(W(=E>2O<~%7+s+4klsE^qaZkr>Z7=sa&>6Ma@?6VBv3p9P2 zI+lbVnjD;hAoPjEjJEW1)U9nJ7Dsfd1*RSO;#z)RhwEX7hz*7jJuK@HHG6mYRx`#o z0e_ZNiA>{V;ukk0J^pw)xr-YRo4Wn`%C4%YVFcSl@1+7m%R2sVLD-Hm>NF@Pqmvo& zrgLQ(wl59ViFrGx-u@ZBJi(jOe6dI)Q|xxRAZ}OM@2wZ_{T8ue{sa-I4_Rq9YKcL(LU9J zz2&#kY+^=J@duxbG$F`$zhkJkzOG_&>4_D?O}(LFA5CeGKKyZs0SN{tJRq@}QQhf? zw~xrwzQ4u$|D4#hChvAA6yaZH|69bbkx5 z@)~!4rjN8Oy5}=tnf(W8TTtx{=gAmMoQrFF15p|EWR5JRV~IO7>_dqY{a$;blPK=v z=5O|{SI8Jo?OFAa$QDb#$Lu1R$2tDSa&JcbS8Q?Ddl$EDazp2CE1%>2WLC^`<}bm( z(#n4#^h=V_6Oi50?*kGVDA4laycm>{x!(B%=Xwz@9y0M0Fx7~Vo=~0ToZD|D* zm|OGZ?~o@i_`?@96OSivr$kJ4dYEzs>-45Fa<1u#0e8XQbx2>^ZkDcgwFuNQ;bwH< z9EGn{+{oa8!H!+_T$wbh!Hmqa)mWRPF$Y~R7bd}8&0UkGwjzHT?D#zdll0p&DKl@@ zFn6}vQzMsS54OL#UGM%!)vq zzu&%#SM6P+d=!LHmsLTGVk}MZDB*=2HR*vl1*8c^;aZ_$Ybc|}P z@aU;Bhs9aIXW-Fk<0{#7vQNlH0mr>8+Uiu*an=8?%MyP`JBsFPfrpSpuMZ&EqxW}h zvt$Z(w#w$l181kKi^a6(+!IqOP||dl6U_vr0_$wkeeum;?^xEzjB?zFJ@nd=<952! zN|^Yj&#wqKyX$pH=lf+6GV7$zoUg#6>jkiFv- z(oR%SFDrk=esi!{3@iyLAXj#jgy%s*HvVzYT9iEA%u1-j1Em@r^P8lB@fR=5YwV=r zZ1&QNbrF&`pub+;crp8D|xtJt*^A@(Ys++|5*4wUG`k>ex1ciSxFq)Ehluw)zp3u_SHYr`p_&Be} zE7LVv(iSUCq~+%u}CY0ns4U`-d~W$P4j23ETD1el=Fo9 z9Ls-d-ap7A$hU( zQF7UsRNIss+HP5(N^J2a+*|dQo~ua6?26lq5DHXqCQsD4+H+_2+})6dc=zI7i_%4&R8$r6Pc@0xQ;s~ZA@&lIk+>;IlemKwO1 zdo$2rD=Kr3NQ%xXryrk$eXG1SdUKh%MEUtlPXPz0H}3G2Lz&gf={f0Cr-=ptH<*9< zpuo?Y?^#i+?7eC1$8CNkTx_8+yX&vcSY=Wb?42~S#A!0Yhr=IrtJ8Bie1nc%L zeVw#B1d8o8=X!eJNBg|`z}>CcPF{!rFM%T6V9NwfY+Wol!)7t-+|Fb~?)UnBe@^`_ z5IwaFKofh5SXWj7w}dsMcIxit3o99q#9C1gi~SalhAi+gMSo`ZK0QwC`a4pnDq5 zHil@qQc90{o@LYLSNkl?z}>kcA>EOmgm$4Tb+Ac&(l^@f z=A^^&S!>u0(PieG?F(So+W7V8Lr{l}N>GWuu!#$*Ive8Gb{{1GTM$>5e!FUa@?g=g z?7o`XqH)c#MqjyJ&bd*c!U^}q!P?~k8urR{jvJJshej>DlVn*eU}(GV;fp6kDF%EJ za*bmDZGqdTBj#ihnlQ~5J1aNRhQE_%Mj<B+z8n`I=XL1TnH4 zldd+y~}vDUc+xj$scTmfYVQT&ev>n#gK*^2i#!4 zJPBJL7BPSAuNPT!p7Q;aQBXoV#v^Yqj}3-*l6%Saq*b}QD%TCGZns%@H+}ame-Q@T zS{>~x`|WcJpa{ih z6vGfOcnItw0lKr8@>vb5O4Tsuv`fgS*mZGurC$-mZa)B`P6_-j0nFjjO_TS<~JO{9v~YhkoQ#nmxG7)7uq%I<)J zkGs4{**su-gW=4{?4qK7OLjDTwut?$*5$S4GN1C(buK`!iMdYGw9{2Jg0@@-4NO+m zvr|beCOw7@;pMVp;??6~?~7at3S5D66%IQ$lyR7fK6Y7adb^BL*aXI)U$YXr5Q3Lo z^Iw%^W0=;Ki#Vk%7yppX0^v|)Goi8e*v)F4MRHV5I&WKMIxnYxz2Z6nu_py@b6b^- zR##RU+U#@cxDt9hPSe2(-M)U6i(67JzVza73%y#YNH@{Ofi0vq^#?7W++ldy0o{;5 zQY<4$v?-pM}JQC?KkF;R!gQ6WKWm4F9XD ze$CaTPmC8e^(s1l_gZv*;OhWcQZ4CB)=L(FZaP$jjJaQh~N zM+77Zueyyf{7(;xM;a zKH$hvHFEzvFJ|z6!-#$7Bqdj)5t*vsLG(B|!E~#5PR5BtHryy5iP z^D8sLbx0C*?x~MY#q#mx^biXA1th5m!x>pPhjw z&kTQmAzKP+%Kx7Z(dSZrWzna#OBOux2`_k| zVKC8~;3tkM{S&Fe7t(J1DeawHcv&(nFBU+eUG^L(qKav@s1Xmp>C_mIh;!lSKBPK5&8InqhVu206*0Y=99aYM4!E7d zoN#L$;9kSmc4-LNBvdoH2dAAYJ1WNGBj>r}2lwv64Mv$#H(YmO&ERS3#ML(T0+m|( zVW-p$43M@a@aD2~mlgRY3+2vQ*3?{ozwI=aI%#l6W`)D+Vw?E!%2M7WA)#?-93N-q zB${?YKPlSqPXrGVN0{)8-$~OHN0JI>C8KH3H&BlNs4Bh49*^JX#6`n+Ju>~Ml<;Ae zA40*v7QLGq7{IL;PI+=Ou844*S*HbQAPnRY6O(m=&4i*cWRFUE<3sgqHK)UWfU)kR zi6nfh&%@T;UE;5Pf@wVt%)-JGTp;r|+Qad^^qxO42uIml0~J$3Yu|nNTsNhoh%bym zJ|Wie*rpo_now%#2mAe(;H@>PaPOPlApo+{KTdi16;d{ISu$kGU;t2^H_1Aqzxl%5 ze>L~brX?8hyny=2yrkQndBJgi9HHmfiaslsjcYfv%L|KO0{#LW_h$;c3l1}yVTy74 z467=el5X3cLwQqD<5iONrVqysC9|?Da`YO_Qo}#4I?jsccavS}@*O1q`4y!}PPVWl z+1pCCyFl*sgM1!^m!O3A+Fr_lSRqPs19;4a@D!v1QZ;FU6jw&mz7e*$dimJ zX#CxhfbRXH0=l<>fIgppFI7uE(!RdeZI9S@laIBGSeA>@t+axTqJfU*-FJoO>4y%4 z

      Q3ITHKclo|J|V1|}K=VK1_w~ZKXI%n}z!V0`7 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

      -a?39g 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 z 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‹G9qA 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

      4EKCjEC?8;^vo9R&)CrRiW@>pdo_ja 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

      SP7Nx+MN7%ikKoZ<%{9Hkp+NyVS_hn zCjEcwd{*Zn4lZQrIY@x(6Mm{HGYTG8(>$9} zJ%_oUad|9@ zZUzNSqu&NjDK};BS{`YyAH7B=-10eztKff_oOeGtxcBh0gJYb^Ty4;R0rg$e6Q9aE zQNNa%fSqtkJrggs*=i zx_adG@DcT~G%%PW%Z;||Z6*+hEg(L+aicZBM+~qPOB9*)9_)1`iK0@Y@_vcuN&f{C z--Esa_*8`6e3xX-jeBFF`DC;~J7A0dqd(rP(|xTRva<^Z?E+Z1tMC2^DWU2utQ!Yl zL^+WUDjuL^f6r&hC=G7t!n(i2fxmxdgJt{ak^kvy$kBe)#rJEt4LEL&ZUzO|LAhJ` zXk>ZcgY(;R$KS`6tSuV2U+R&{E%-k>{?aez^;}_mR+@R{GUcDY6KN!n0#`Kv-UmEX z)moJwY}Y)CiyygyO$=TqbWmc?vv|2uP)Ik?YPpV z3ww+TYVhF@599~G29yd&f=+*ZpL`8m2MrjE?Tz?=(xCo!+C&pudkvUcfF8~*caem* zd3hGjx!>-#CmlEP++Wady^fAXpzd61UPTYaAC& zBw?({S3E1lagwCP`k3%APje!GZ1mqEMB^^URQ~+v=)plN4dGW)c1W0le<1a1q`7x- zchj_-Hpj8*wRm2td0c-zMGbSL*2+asX-yw&ASy_{mb0J>j!Wj+^ehm_hTIC1qw_HB zk~(^wvtU(tiYU(k`qZ1bXWJG3Wixr4VlGP(xk#jc{ls@CIZ)id zVRyjqcbuPTeCmSr=Ps7`Da$^vWsgQK#MO_J>}O&Y^m;f?XZ?TJUfbmGbm)7TH|;2; zC0klMkExs*DiqhL{*1L&Hst{97_3$(i5n$^B=fNW&6rWakz-Y0M}Q>_EV!uL^d8<24a9#>hwZ3GFlznrk3lAaiTi9V%tMwg)Q#! zn)8c{qWl!6)_;TLG%QANo}IcF?tASR(w_dH0zGS_y?&_%&X5}RtKo3C@zW+oAO0{F zOb==lUv#gWW{bPC>PniMUm<_mj`!m2QmW0aJGjR%(vU$$C%X7Vf~kmQI6%w*G;AA0Lq1sqgHZ@jC`4ytdJ!`bP6|BU^|0 zf{xXKuW0v7O$(E`9J3D50^jrzQM)n)?;{H!-!obb<*!9OgLpJl>h;@qM59_>UhQbE z9X-;H?B=-@f_N*A0W^+pVSu-yI9@(Vu0U4e&ES9LZNQn0u1X{SN8RSd@zAhy#U)%l z{u+0w1M8q(dr@6)Ux&AGdDnJXTh+bQzGZc<{o9vW^_-0F(jVv9bk1`xajoTB{K>&* zhj)*@I5{|uvT2uw`-jJ0e71l8z$`WN-*85<6)*$bD3rZlz>ahSke1HtX(<3|O=Q$I zQ65t+ZcEZ%4&_SJnLr zx_N^d*v;)aS+|R99#Z0aT6zMwvG$V65y#{6VU!SEDQM>jSV3 zM->r-e-hby{!=ojmW%YDuqt=v0eTZN4L+gzdhLp8YV_L923wJn6^b-4fcB^7MV|G( z4ot>m=ZJ0@m>#mYzr32wU=|&19B;^F!L3MZ>|<@y5eq(#iw;5@1SL0gmC`(Lj@^H& z+>Ir)2?m4%v?d&T836Qs9(Ue0J4B2U^o1F!h_-ar5Y&Yg-0s10ZRN&&#GX|LP>c?? zbyhj;U;h2zj?e+BMhHOia(vwQY0n6ff=POYsSI9jb>ghDRLlV(jJLv3S)Wfo=^@uo7UfXtf2eVRn})h$(mS zSBA6XocCV?S{9uymS^2!l1M9mX2woG%gCWSB7y;HDD;;4XNxm8z?o2$Z*G6RQti-C zvM`iBO>%Y5mu}v8Q+j~m;@kRLVxQ>FAntv7#hZA<=MQ2iNYYzzNd7GQ8UEnA^n>x= zj7T|5_tvfW&FJ-Lhj{HC_i9^xLe8wxtkmi?(~5ADMt2>mc2(_1# z@!8M>?(McQ=*k)bqo_v<4QzklM$`{$VWsA%r<-mN*njp(sG+XB=8ey^l+4ALU%DCh zn@Fk32+D-pS`$|-h+7P(K3K1PP{ifl7{2GyUHKu=I=>-O4-z_yK*bB1sI4cpz=3vs zmXQ!QikHq6!UXnOx?9R*1Sz^Jpu9mdCI-JzVCao_W|!U2jG|gZ0n2~-jqE#aK!ioS zAiR^hR zwvKZ#hfopzx5~>)%Y*?sE8K{Qa)$&`=?N&w4}V!EKBWY5jWE0KbHGFj(Sec~?upvJ z>;%(k%cx!VkW~a|;W2-e84P6p#PlJP_;DyiG1O=V%wD9OMiJP}MyUeHzEWoGy0^Eq z^-1f4~eXTu6FD0tdaa!eD>J-ZJYqN{S&~V7hWp^_6)VI z-5cd*8-~01*Q&iRSlhy1Q1GaUqOn^@dMqq&#C40uaONbn9@>BY^R1@Jq93d~WfA7~ zJ-8FZQOL9TS(dxpXCtzdh2NNlQnG?P0?{P1(&+(Zu6T)z>C9qp6eE>oQ_WvdNgx9e zq8vF{f=K0@>R&dQ_Gf&R)0q^TFw!a(SKfA05Yc#1%M&j|Zp8pZDCD$u%*wZNz6Zq*`-{=^y8=X_aX}NM+A^Udj;u5ci1%uBW^gT@uvdOB_MeJrfr!gM*ue}3g8+Y$P0N62;jH*(1pN650oNJ9 zfVyq*9`ctzuVAvdNauQ4>uSpf^weyc$G>=09#yIk2Gu%u2uzcug4gCzW1D%k%?b5` z3C9C4p+Dr#`(DLIQt?+*e8d&qgKeAlH=0-Kt6g21H0rKhU9!dyyyk&5xX(`V|Ewjb z?*y_an$~~8Vg}pQpD!k|U4291WtcT$;`dyAxa?w`t6mQkCSTE=wi3s7p0haS`jezv zk}C||kEamU3JL9}l%$4>|CU6yx__|iP2k-Ww44* zgK6yT)$y5BfTl@)>>eURUJn-(67FsBc{+2rZTEM_ll}3O>g`F|U%k=P?`nlqv#GCp z%F2IU&u1KA>pAT9Cs!A|`rMn3W>C+g9(ttmF)H-`!mahd;d1lA$^OaVT}N|#aqAz5 z{`WQ&NYE>hW3>}d+t=Tu6{?z@|e!HOM8aIrivP?^YNs+Lhs_ZX5NIJCa%q3oQ z7ImX^N^Kxo7WHm^b9DdUv2z6hh@;7AYW;sARauR`)l__7EArEY7z|LyF60=tgkrb3 ziN^>@-mpo}p7ja*`Zx*Q^9p*GzL8~)my61S?V`2b&8BI*7`i*P88ZO&QSqEsmZe$2 z4Cxj_NnQ3N)wq;s`cK%u?mc7DdJ`W`n8-ax>OqBAE1i*zfOt=HG9l!~oYusLYo10{8ySdr748v*fH8W`029{3`{ly-qX&ifTOnKqc z%hE+M6-m?>*q&V^=QK1JhnXCT=KPe7wJUP~K|sF0PUDRM7VPl;qhThaIXtwkmB7@hj70{XD|qJ2ml;oWBWvZ?tHC*0TL)0cN?}Lo81fs?&jk&^Kk&V zia+bexKl92GPs@rZambMZ4%Q;oyWAkDc>{ISC2TfBs|2D{+fb2nA6Zzz*K7ooMSgi z$1IQGn6R#pr%2r@)>RoQWmhhPG0Ix40iPWo;?*1lMsp5ET62J45b8Q<2I4IVTf7#3 zS8403+vwT|YZ@&jVJOK_Wc;fQB)@LS<|XuYV~mh_s00TTisA4=O50cRo3Cu$9*K4} zFur~%{FQ>jXV6{0su8EQP_TX*JB%B?tae5RvIZ7IAW%K<5j9%Y0yvVc=W6XtEeaGO z#t1n@zlK_(uO}(nees=q)gTT7S@#fsFKr(HJ&;6b7Cki#PI6TAg^2+~imxD2sMrO# zD5Rfq{fYx-7#|VM8);FtdHKSfI3`|))<0#Igx!Z73_ALWT5O6ItXv1ffgeQ14;Wnr zV{dYEmf$W@ZN9Kq8)Y!8aONhN_%w?sY+7I-G3vL$u^}IS`4u8? zC^rBnveEJdQ*+SVb-Y`i5myej0NJlTz=FBsc>PUmDP!}H0xv}p%67;Z0Y5hGM`0tF%J|4j35 z#x$!<>^^Cq8a&8E2Oc=#s$RjK_l0a=eD>?t`^m+y@A%ook;88B*C zj)9MVssu;fwcu@CF&U$>lD|Lm`YiEz7cYKoDvvhhPtf1;f_>?KrI%LXX90Eu zbXE}I8U#2k78<~kuILUdpdaEj)uzsMVz~X6aTtFj`lFT$d7LLq6rN1WkUSL!4U5q+ zk7Fie+_7t$S1Va{Nba(Np}`>sL<0oPGe&FNFf$bd0CS8_1Z7plNPP$>blE771+`<% z)81k&w>U|g>Xx6cBU6*m0&qJ|Y|kCFs;Q8Vs*KiECz#S7;dO_J z!|LNGc>MAkPER1xdp4z-H;2zCP=kL|&SWhRLwhQm8*sGON%--H>ot?f#Mpy(*03Omx)oj&c^c7tf+X1qDv zAQ!>>>WOn#86uwsbx{T*9he>n_ACRV>6yw5Ko&m=)EOLq*85B!>k7q$x(8FBy@pjk zBhg>d1n8pwvsO8O+35UrtK2QeKXrv`sLS$lE~Fe&t-1|VK9C=E8^N>=Fl?acZ3DED zO%QM1+>m8oZl=rL!Ycj3#@W`5Lu%9!_bN-(HGKXn^~RD%mo{6*$`yWKO0!US(e}b&c$ zue~kfNWf&*7P1!)zYSnYShJis5Aes0vt9+TqH5v+J zkJ9#j+VUoUy!ScfNqbTIw*EZZ*w*zq z-faWaGx=%#O2c7Y&LUe+x6`tLgp?>ykZ5>9YnmZ{nlo^GBQ@2^2MWvD2q?P~nxGE} zhe(3tojLPLzZv$BZ6+HAzrgRc|p-Jd_y=E3z; z6H0Q8E2<{>a?q6>b4I0=@0#J2{&$hbqco*Wa5?X3$jMl0=dmztzxVGKwRDwMad1d1 z7Hc}4W>c~RyPxS&k+&izg8RLw*REfr$DBKVm`n{2u*^4c!q&4vA9^iRIZu3`Qq&!$ za3K#QN@^imS=>u~fF&Zk*c6$aT*w`{n1fYz^jdaN-HStO16!4j+6X`^?=}CfV1=>n*biP1+N-RvYbh+;zccVkJ3m{VG&_4;9w)(T| z!Uzms+1epasYYgb)EBR(G9`@;fFK(W)za$eqxi&u(iasQ%`ieq9+_oz-!xpj8!fL-Ohjn~39yfz#u z*8;9BLF_{3pBaQRcZ-?Ey5xeGNd5!G5PzZ^GnaHlAILQfQvX(txp9;L(WT-MH)N03F`+G!7W$5(| zG^uV+oBDdXO*$Mcje6)44!ZEIw^eQ~txqSy_gyhrzY4os|5(|})Ej_*<+oX(FQvHs z+!@e33~1gNkn<;a%;D4xM8DifBS#mbuRDn{Cc&D4^Jqml^O}oIS6GD%(~)de{C}Dv zCI?1RgR#`Qc5lBd?FS-MmtEw6A7Xy{(X~;XH=sJd9;$PoN?`}DjVX@kdR$$NmM5MQ z9@c*16=6P#5NN7C7svg7P64~uaR}mIUnw$6?GdPu8*f{v6ufP55d@5%Z49(SH3<=Hyoo?~Iceg51=G-GmfqS_|ISog zAq;Qr{ttGI3vl=vp$J@4rPeKy?3x1TmOEZ0Txq#Ig#VUdZkvPLb`NpeJ;1Gox78Kp z$GEi-ZcW{JFwCtPl18=li);{E$-Pxv^YvE$B*~G-=YlrLQ+NH0<5-(DpI{4&cVB#A zozZWf&-wxP@gv87+Gz?^nVTv!&&`o*TR^Qe@q1B}{o|ZJxl;ektT%g+!|*uEW?z^7 z{;2r7e3Re%lkY znTf09w|%WlBxz1a)HgR+2yLS>7OlaAv1mPrf^_>F*_33kPQo|#qAWY8DYRHM&!5|i%D!pGwFU4i54D?R}ca!&_|i_3V#nR+eK)yWFryHwvj{Z zivMb46T7?CvT6bNx(j#xOLx`93rgt%?yNy8j=QVx>(}z?AZwTP>L3g4Lnj&8Z~a;g zQT1f>&qZtar6Du?7sg8HEH5bRX-0UBPYE-mhaJy<=qoJ15;jZzDV-)42-=?ew%_$x zKHA4vYe?H!`N)g_KF39Y`@8$9nktXpm0*UwP)Gb6vjs;bGm!W8g0G+-+j zN3YeRto`~R85#<$!8OvbmJq9?cY*h|{(OJW2BpBOrD-2|HG*xlx`Ov>mfmW*xQfF@ zzBwO%OaSpZtA4NFzK5G1fzmTY2>AuqY+Ku1*^vepmqpItQF@WO7l?5l$FUj$y3Ee* zGZEwGh|179q?d}kSgi+Sggd*59NYvja=*RpENRwzC|4H+R#s2>KxZ@kEz(ZBr=Rwp zQBmH?dCP+YPt{U?5+8>$>XG?J8T4Rzu0mv!wzz~8mhGIu zESQ>#N+ceFWd>+t*~7M0bvh*Me^%VIbjiW!)+#UpV>WF*!`})ko z(_uk|7(6g6E*wc>ALwR>M{syHE@qQ|@^Oi??6G4#Y9DXC4%xyuhBpYAjJOITighCi z%$I3aOkHU$<{(k~A^z@Dciap4*;>4v8Q#X%1djJpYMT(Pr|IqMRY5Vr_jl{?>}6|n z_rZwcvV&$eG@=$GOD2MHnIi?i3ZfUuI#R~ZT9@HQcy8nYxD70_E~k|b3;(fyoW>-& z2b+1j`{x&qS$i&!ywZ)uej+YEhIQ(vSj@n{ecX4LNrKxGm2* zZV~~`9IGHgyz28IG;hnoett)lj!LHbZJlMeSvtkYnFtm2GbD@>g-@;7}B z-%j@0y)*F2>fL%VRYlgFp2f|74DrwhIRcUoC;V_eyOKmA)|=<81}VojmyUUbu!j!F zIe|YQ$agM02%b&$CcB&h%d|zS@6D!|x$@+(!`d+$!yjq^lra9Tc zhWvFNUCwc%zu~3+BWI*S=n0x}Vtd3@N;&pE{mC2hLz4Ss9k>N8kYYeDCo^n&?!IILyVoG95jDMr-dhu%7CEqY1 zAtAlNAlfV9yh@qzlCGA2mwoy5hEH$V!U#m$1k+r+`p_rf#LN5gy3K-&KJguHWow~< zaN|(sE1b7vJX+q+tVTbjr+|xmqEoFoOn1Mr@kXf9Hr!*hlsnDvoG)Z6X6L3}9F8LQ zOT8sB_u_P2 z)c4>B_2G2>(eVe)ytZS2Nyq3VNp8pzU0%P@!Un5^Edg8;U(mGX&LtOLv{isY@JoI1 z#aVyk`50(g!`iEVt1(_?2xxCr)3pt!b8r>*G?iItzfBCV#As&-)yyd|5461u!=LHNE_7V zq%j3yaSS1EA=zsi%lRI|wm#;7+($*K*)3D zL4aA!_{}SlfB;Tb1>k89T~(q*K^ypZ_&w~XczJ3{5+R=z?gc20DxrFTzOXl$jhza2 zEMcED+C)xRvP4mxERTlY-%bb`Bu+MQH%!M@tf@)h=mJuQk2NO@I2{azc+HKUyrO8k z-@BC&ccN>5k3F9%#J5PU5mZFrJL?}-G^muMt?LV9S zb{%;M`f8LG<Lvea6Q8SQ4{7jrw;6UKLw8&n7OoN zVXKQz&o53%YtQpBtH6Q*zoE@S?$M{`Q9m7je;1WyqK|2V^C_4F-lEVlyThvWZ19q0YQb3m{3A;S?s87-wAv1x2XR20}W% zGxo;`dflVrjX1pUW*LWp$ZX|T18#Wx!NRE+lBDKrT&zyCRi(*0RSMOb-!H=yVUl?h zgP9Z46LKGq4HJLrn}+@g8M@irjP&w`4oPXHnWGigfC|`@0cvjqI0y0bpr2*e9Luo4 zHs6s0p;#wa5b84OX-?Ug=VCa)Tb1K~+)+???E@B)nL9D;M($+xJi%EyYyyuTqukzL zfI@6!84VKH{LU|2m5cX|&iWse+wPOG)aS|y;c%Q@q9wP3RTN591*6M3;l~Rh^l5m| zVVRrU$AW7b87h6|^PRvv_S=-1r$P1Hh&+*+m3xdOXvq`zMl}esyx9+8I*rAw5U@$FUM`tS?CcsbGM19p1Ipeif+~o8QIdM1nuJL0Xh4W-c zSk^Ek6SYj0CFlfDEGw~?(*Z4id_!98Q$JX!5{!Da(xU-|d>WmMUCD}L4eTt|n5F4= zo4DQ3V#0@ss%DT@48bGRbSmpqAG|81u;{HMT==6itnz#4sKAE(h!`b<(Oj|g+$zk; zm+Px2Ww4qDtLmGQ0pJ=?Je;Ga35tOWFQoF2Eo1tvVjJ_;IWdvJEFtlKZTL;2ZX@PZ z*gPY#b5d;9^zqTv7dc;g?W%b!OcBlmEFFumdyrV?<%9mM>`+Y`Tsyd8931W)ltRil z?`TN4W=X)sd12xTRw4k|D^BMEym$^W8kKzhSIGr`VuyW|{8=5{weU$=%pHaqnmU1L z^APMFWcIZgeKniIji`Zt$$bWgDP=VyKipZ9SsiiK6zwtJ7znCQF`Gg&l_bt*$^@B3 z7w}MsY^(9tRb1cG840py!Zy=9w^OIqyU}*-KsU?5kFd%iYNSI=*p9e^5We4Z_0JA z@?P|0#O90Af)sU+^8r20Ub+}$X5kHOvfccCOS?h zOEV?+(+N$w^Y3_BMZstG$dbtSaU)9L^)MZ9o!7QwTKvg>aLSH?oUua*yRSuel006d zzOo(N(SI=mdq2+y1gQq>l{&CD3D$NU)-IKLwF2t{qN5LM=d~Iv`o8l<9TvCvS_RhO z&sQ0(EaRz#RmbZU77HO*uLBl=x^r}7iaM6BnqlsujVz$bzL;bM!u#%(JeyBsvQm;U zmczp;<^Rcl$~~dWN=_BRh5>f_>mhqPbwB#x@oPkL`t!=pY58~0{oQ@-`1I2_`e5(u zSn3r$XF{jupnkEhSH;hZ8%igIzW%|EU8EYO)h>t+*!~S$@?l%K9J2igI~-{X5co?w zYp+jt(9;@zC6hm+Ct~P@qlFwO#(Fs(w=K6dOx2GA3-}2nWPQ)G+*D6s`^w2+B0e`HTjJu zQz$5ZT2z&5O|lwx815ifH&HMD%UTMpQFS1?PGO}ppsw^M5R;HddZSnUTXR2^($%wXw%negnViC|j zQEy4^u(926!b+3PVuxGfOtIN8LDn(ZfNL3l0-S1srUS1W*3m{YgDL-cmfq%LQyNLm zQDZ=9!)xqkesakW(J%=F0C`PoGFzU(1Okd@5FF3Ws|KW9lGG!b_39o)r*@_M{WvAE zvPSX_cCxjWdzhMae5kNnQaZFcg)_0RH0AHTfBg8(#@bk(mgb&zU{rHUOhzIMmiOv^ z(wDl*x}Cbnc-6NXfvCF^(>|cbaF8O0b}V16+~UPl_Dzc&*tg^WF zItf%PN)0sli~{xumMZ#yLgMNYL~D3|2(40DCfHL&OU3aMKL3T88LJS*A{!ecz9Wf1)v}@>j;KOZbESZ$&lF#L zr#l>=Q_Nh0C(8e}kWOb3Pora_ssWaWs zDRxyHwJp2*bx#kIR?BY zc9hUrYDK95wTue`N=tXo$S0j&iE^GDw>WxWP6Q#mgZtX#h>7dsRU?%INZn)V0JvMm zJi^q;LFH>!Pm(ZwvblMG!urfjcw(o3e8yn*dTi00cf;DW-ydmVjd8Gw}W(qd;2uEfEUlYr6Vy%6DeO)Os_#MFs?7G-X>UP{DO! z@+hbI1F!CEzzxOG<;+>M=Z;plIFoW(VLssug7owTURC+`mk6R!D))SH#n*7ssrnh` z?Bre!L!ksZ+dDWqiRhgA)51LX3h|3@``-?DNcBw zkZHmSD#WJFBjnvhdP z@UQfrXV?gTaoj8d1#N1n&FGo|$ngRh0&xF;+*R_4Y3Tg>{JYH>;))^Y{PI5nShzCP z;1xQK*ZRtwdjphmMquv>lYNkrbIxsE4875Pm;v6K3WxD!Iak_Ig3pr+zsGjqZgMgV z@L40qm4;a^p-8_#G{GNL3j%!$ha`i>X!uuQf$5xoK{`MTEFpEcJPyqu!Y#VYJ`)s9 z$6{#&a}4Q!SRjYhlkhjc`<^$dPcw3+p&E$vkPT2(G7B86*qg5B$2 zzK+O$!mt#V>uW`Z#~&^7(rUVbg@>rzf*EiP!!4`y5|9%WxB2a3>X+A1p6_BoBH&|I zbt1&VmhZ7&>n98XtqoW(jr(an(OY0?@trrIrV}(nij1`O0pzyJ(=?!`R0zX(JpkkN zAPmI?L)LFcx+j_@|Z+t&CY9oI&BW<8Xls-V7}upjMr4uXX16gBSs&; zJR7^eh^|4;cFvsZ2S!5L;6ohXK_+NEf_C^=>G8uXV-#s%pvdF!SbMwV=V5xyH;9!* z6w=mKIRbsu-P%e*4MKHw(^2|@YN9uBf2=MfSxjdY5F*N}Phn+G6IVjykhGS{ML=zT z*0#r$SO+Ydq;i5*3R5{`B3#r{bQdffP_yRY~XKtW`2h zSR;YJXfz|=SaYz;ek86eyC&vtMNrq2TkQiRKDrHUgEY(v>zy3>Y!*R?WmEBR7{T>| z0-K~yaZ#a56>;~@lR3DoskOZdnal7osujpM8eLHr2dIASliO@% z-TXE~O`iCw$_FJI4Biy+JzEAbV~Roc>iVrjVaKJSK{rDQtT&L;pmkY;ru5Bt$eg8P z@3k-YdF9q2#)LWNia00rN9T#lpV5@yM#%;f?wf9)#?0TT+}5%>fN$Pq-Nk!l|fr6p;f`K(kyNbd<87eW?;Xfs|6`EUkU1?j7BN zF0PKNmCdSRU$8j9(82kORxirf;sx8!h;!wvM5{n!y&M;rxZbydSpLf%w=cP0GF=4z`} z;w|w#ETJMxz=GgZ#o6Ot;G4&%cdSgg#C^A#zOeuC5qaR;#UhDF)WK1eZ}ex^j!B^LKMdS1I zZfN-{d7acduVIKp7hN@viVPS`L^;eMvThG#ncfLpB)F`ILv3+!{ikELO;>p@qZ-ys++Lz@V>T#5fDhmDnYQyq}Q7 zpCLXH{oVx)5v@a(f4~Tj8=%>Ycd%?CaD^FyxZ3fUuN)SCq~Wm-)aTiVFHb^w&Qulq zf{ou3VZX|FSjj z+=dai9dS`cx4jE4NM3fu1$ngn9t{>D@Qli0s2D0;(R!*ht`>a(M}uWHbCJmv0daD0 zSQa^E(lXzF5g9ToWr(Utr8c^=xM=voBAh^Z;IYUdaQ2v%p=xPIIRjW8HwBynu?zLp zQX*>0pv<$?B?6>b7C8VDd;i7O1`4GN%huwu?-K{-;HpT-GrCX1S-hYQ26WKoybIWT zfF%C(xnn>6G%O&z!PJ#;5hPmyKiu2zADw)1LI3xEKcH`YX{+3EQVd@w?WJL_d`mod z5Zwat0_&d_hV#62qgqi;$_d#6F%7R< zxU>j=VihZza1<5wrhp=2nGznUoT0o#i9v2lPEHR$xp;DPc8KypexS;2xGCA=9$)Oe zN0h%Pd+VS&Mf6}e!MJ@!fAWdA5Q7M0FF)nAUtD|ctRzgB&b~NQK@*zk7=S>IjD)no zOnSO^MwcKNtTvz-0r?i4@}&&+p){EySdcA$-%Js)ZK8;|v9fadvtOaET1glrP_!-}0I5wInEsLj?Zs-w%{AVW zUHP8dm-DH#STls8x^aha!;ZLedW=V$>Hvp@_%sY+iO!r-3^9c#FL865_M)5_nE!Qu z-T!snf1<7{;;b$HI)&rfT+#>b*19`M10oa2yfohq3EX^>iizcY1A^KKOH8e77_{;Y zRXwq2D~g7qUo_v+31u{a%GHXVXK2`6r0id~)%4z2z=la0IjA~JD5kp-s#w{s zSbkMGQb*d89)jEF>D;Nb`g&t`r>U%{>HW{jbE)_R6g=A@n>!(x>Zb0edvb z8r*MV zW>i~YZ5EYC2HV_X18)KRId(8kckICj7cYO z1MJ|kGOUHQaU^XvZ?bW0WhtpEY1G+8ZdVI}rv75CB{o=~R|#~Ne{ZROPX83kw=OOa z8&#e_Um8>mW1JNv+=tWBe_%FUL@{#yM&m1SsQ1h;DKWwTCuwqKI1pP$^dpQNB+{>D zd^uYgN`0uVM|1k4eqieTB`$EkWPCs~so74sA~vk87)DH(HFJ#GFnO^EqOV(6t~p42 ze(DqTLROw`y)m8W4MrhEmF7x(*i%pkDP zYHZlWx9Z_|7ctWs@^+Wxy|N_lRpe=|ciznHA_kK!7d~R=)@)<;j9iO(@NgpCwUym? zc{DL5$u4k{eE(3^g5=XunAPDf2DwbuUbICuvaIdt8Bt? zvh|R_dT(N;@J274luF3fmfi^2+G;gZt9E>~D4H`1X`goL;%aYCSP@5;g-F01qdns* z8%p!$-91U{$;QXmS&s@lprWd%zdcfhQCd|hL@Ud-Q{6jSqZ8L*qF<^xH6qHq@#*c} zcmUcMJXaLuotbHWWp$k|Us#_1($3em_ZRyo$H#l095hlPe2)lrG+j&Vv~-ocMkt+ zkM4<=eVh5exHfce5%2-fIuU0xF6(B0dA&(IjDfz&h5&hg^2y~;eVoj#BX}AM7U!H&l`BM@a5Vkd~ddCsBi#L=-mM9Tj4XveZVON zKte-hXw*%A=Zz_GqNz`AF`E9AM=ug#XdNC)2*0v2pk2G;0BD}VML4YhVHR0#_`1Vu zbdczI#3B&bNVm-~2eP0ax>d;?n+$?045rG-!3jNFBm*bBqV!2PCL%|%c?yGlUSdDs zOC#kw038Vwi`^6Lq^9s}q{|{5yuI|iO1uwsJ}3YkEgyr>G& z-f1sMl1^#zK(G;2&@&+h%s?B#;yJ}%KDsHt&#y(+d0XU^O?( zj5GazSyHZ*&Qz@cg{dL4QCkvB-1JfM`18moog{_P(%gl{R7I#(S-*NxL$fdxXxGdu zN$9Oqqc&8ec>nNMX;BZfi~3)M`d@_#s8IQs%}W1kQX6PeFdO}^N&Tlask7``F`3;w zpi)%@`@eqGM!%Bz*jCSy@@wl`Qc?A;7KQ$Q&idD{>e3m#Q`g2KWS-FKCXNw4a(;Q4 z-5A|K0iDO?CoOT;UY%>N%<-+WYGep&)rQi;`I@+iu2v0G@xQkAzqa;Y*Va7c$veXP zE7hik1qC?T1;o#9efDx*lROWlH|=b1s5rgy_t2d79!68z`(HC!!N@wAZlM5EyK46vCIcVk<57C z3DJvWLBM5%;aD#Kw9-%>aKZcIR~I;H)N%EkST;C}FaE5fcwxA(R9-EUs}&HwQrtSd zd<$cRFZY7H+Ey^TB_*WoHICdJc$ANSdd&#DKgqIjw61r+Sw>D`1y2mFeeDPrhZ_iD z6h}`eME2qS$;T&Wi9>;E3sl;{R{=lYiK1maIHL;D#yy~!ulR4;144mnn;rnL;J>^F zbdz?PZQO&Oxb}U=z@cEr0D#+#!5103b!^&$xvMQ**supcAvQe#VCh1eHEN@O^@%+m zA8viJk!a1zPyhsnr8P3&DRYGcUPctv@?G?V;bFHpoFGY;L2lsxWsrRnH(UnS+bR7G zz1QxsnW6acsFD4e*!u$y)v zceSMt8+HLG#MLeUuJmC=7v3ZL;^vHWNwuW|8#5B45L-q9T;(Jcg%79`;IfbPCJjdd z_H4I!dV-9zYg*B5#B5)O7+$k3Y6=0^uz1l;e4~84P1ZN2zLv?llw+d+kB`RX5&B@?F$s7w$p}l^|Dc z#H)qdE}oXrR_@2c)>YrOsx>r1e_z7cw88(AP4*pTI?yHX=R0wWrd05R@eoa+9pWeB zd*Yps*TnjqB+u1Npa{T!;Bm~>=wDyo7ys+)hwgy8@g?&`BiT1I6bfuKAy9Ssgs9w< zG?QL01}?o3YwCCxV^wfG#M%Y1&G9om8Hotc;V_r!xEkm(VowY%F)H$U%*%GGSuiO7 z)>bf>F|N<*9VS|1Zs|r~HmHP;kwTu_P40i;&%2)H?HHH5Ghp9;C_-UShyJI7);Zr- zzn+a`sIHSNA!_SIc(>vAV(V8{Y*QMMU6LdTOaf43PY`UqpK9ouKNZ&G(11rmhG@Ql zz^53;z0oL?=`)#H8Hn3X4p%xJwBZASv&?+p$x49tDM)H@iHkAGw8AE`k&;2 zT5wV{BeU?l1Cesl3ly7^7-IA2YiQR6I($Opcm9%^?wY62POnJFQV${i$OXW07LG|tevaNz zc*)OyHgj$=f3caxEm@H`?D}ilHiLtFBeppQAWuForz)RIB>hj%J~{g2{fpC+qfh#_ zS~{AV=H_1ZMGf-aXgZwE2APBW-rm`XH)vd)py~*ggxMv+STgr>B@Vtj(kK+rM)Kx1 zZ(hkWgwf;;$U>DslnU=xGFy_Qf&rDNu?$y#a?tmOldDm-2jWz^R-1U+K8M1cS4S#d z5cCd3R~Q($NGk=%gU0dpxC33UOJ}?sbOpU0BfTQvWXE;W8Eq@~S4i&d)S^K$EGObN z6L7V-J{kb(j}&7rS>seL+SJ^)JiKgRXFpb};%%tGa0(LziPv{5Ic7brJW2uR)dhBc zjllQoMc!Y1H%dNuW49KG1WN6QvQ-s2zP!)c@vzgaU3jV0QBNCtlTN0syJKgq-el!z zs|@G9*~nW64$EhjuXxk>9+SCr2j6Gc#W(_Xf9OPRSnaELw2*aW0?D?ABnG>d{2hqF zcswvMHX%p&z`Oeg(!)uah7-`Pu3A2SuFa>!UGoOcAF68mN4`|ne79CWlht7V3)8|H zmz&GIC7;$hVt!@YT6fjE(`{0D!<$U9@ADrsSpmCCkp-|&5&L3MxgERD1lH?I-H5*& z%qC6^T4&fB-elN_8`fU>XzZZ_oQ~~~DG8|v$-RMzS=uv2Yiu=|D!g^`}lDP=qI(5*UDv5~98gRc#yq=l1>yQ;i zTPfv9=*b${z=R3D+S^iIJv%7fM~>(z@}q-*ScR_(1Z%fe{DCB^Tlo(IBmEbN-TIka zi^n!vZ%XP#&zG~Mco^F28!`%1*$b}EjIQ~CAp@W)IF@d5sTt`N0B_NMDdu5%b>s9? zk!Z?bzTt3DnNy^KuvORO#%Nk_g8pMl@Mw&Pg5GIGgsNY@z<+Rm+LPE|T?S*DmG)H2 zk&h)pNa^t}rbxTiR3F-*<&%c66iyw|t>|SBdhg@T5I<}RYF^d8zsx~@?R|BDai6sT zRown(oV6K;=k*>8h}y1ywZF2yun8aiL4!^o1clY=h4U+8_2NL?U$}SAx3L#)wum@~ zK`bIh(qW3m_gGi{iZudQ`zwWCrqz0ZqD}8T{Xc`(o57&wpSu8{A#Z2FdkWf8tE6Zc zdMgQnMK+NKv;h3iIvcXipR)w~p~DZE9RlVr2@ueiS*o!(ly`>uZlgfIxs zej++Pp(QScP8;VZTiZVd#8l8q-b)K3Ex+#6sov=s*Z{Vge9T>6og295Gw3#}8}Io*+qqEH7s97l6b0%^d&ar6r%30=UwcMZ+I{{dl0zjPB* zkaUxOIM8X~s#{FBw4x#?_)Xs}=`qDhAssHi=59@Mmqa4{CLiuOf^~zZwq7;$A zs5_v^guLTtMQuT05zmB3Dvdsos9^7B`TN;_<%FEv^FcOxi$EPQcm3QYn7!zwI;g9> z=(^tZh>%?Z8Yn}TKNe+vad13QdL)AazVKmefp*%Qp4@_ms5^5_5UV-TyHWNEglcVz=v4%K9Z^)H&uHhGPzUbalgb*|VSNQhrfn z1C6{+f~QDoh)^Y(Ee08?jMh1WfDDFLxKIJrzD`>N0?@~jqx9-`_KtM9nHu&RW_X7s zTq%T*yGaKa3N6s#C_@Vj_iUSO8=7W+JJ|#%OnEbgN8%Nbtkr6@_GX*zH(I66RFf!6y=!AXg{5((5>R;e!OrF%bs|7c@@m)3Wcli`_$yY zyykF|OaR#ExIKJLewaWu^EA3Jb?4^6`li*N%dA5W(AHlms3UYNeY$ge`iVY&{bYR# z?%hMiOm{ZPO&TrT{SKfljEtgs$ThI~BFx(GpCOo#=%DBxRr^U*BPC?Sa!_f-YtQ_& zvyR*?K%AE_yN6^X31!Ivj}87rWhQS9FBWs2kaEp>U@$o6!T)GtbJaMa8b@U{fDfzz z|Fb5?527$x&PDNfl;&5n`2NO!+rkhSE+Be(%l*r)gi)E7X{HjV!DtJW-l@``sI=%x zXq#XaLBXKaV#23i6+Z+TtNF377$t^I0Ee-e|+$KT&g9#pBgP=vK7WO@q6mBq*^Dg%?GCMi?(p5h)P@;Zkqq zHPmn9Z9>eca$<$>XaWDc8lOy%JVH_Llc%^mqiX_rnjytBWn4tf;x|}SL|J;NOl8Qt zPnPgP&HT<*pVF#jiEXmK=r1(ho>Iz(EjKMyO^{*@wz@DPS=+%8H z1yZhAcJ3OznYv=u|FXdR*Uc1^u&-h_6?;PWxKl-% z^;I>PrPXioNK`RR`h>=&czpI9h#+`Pfiz=NN-$~=)ledIQg!ta9A;IpH%ShEgz=)j zV|{8)#@_~iuR`Jt{Ua06VseX$ckD3NXz%UGY+Pi}2cA^RDlV#){a^mKn#57UYSys9 z^gj*u>BL;=vKG|)VS@W4>jAw7;X^oZygpF6id_#7S^OwY)`s~s0@=b%WmRymxmIz6 zhC9O65{=SHLWczY@8U=7;^3b9#D5f^t4CC^-t{YgMM9vq+N=iEF+3+bCa5PQH~?ip zn!mQEu?1zocN+L^E#RLNFhvRrpd2_%w+~s;Zf!50cN;4PPPsoo*DCg}Od%rHS0Q59 zFPRDCNUdvb{?awTe=Vr;|JHz~Z~?=MV*^DSA#6$>vqNt;NBcdEDFvKdyg6RF)I}l1 zvIk(~;CT@%f0r|6@l|al@F%wg1%UIPl^P%g>Zks}MJmR8l3wx5ZrdsN_Y^_4SriMB zEWZRk*Iktxxs>a$5u61(?0$z$vA5t%eo%sE8I#d?O&;;Tj}ke0`DNdDh83<9&ejYy zy!`U!5mJXDh-9#dSo3H$j(((k&S#trWBHEbJhWYpM2mN=IeXEYpQCpYgx|CB#aJhoDYSR2XdWaawcnxugopKGFpJZyWb|@?w z6^l@_2KA{AJ8#itJinvWlm}z)C>UUH9V+0mGnb#~0nLClAq5g*K5?UUIx`1yPD?Xb3T(fgg%in=U=7%{mPyt+;>zl_i zF;7;mZ`L!sYKd+|kiaS6TZYpIap$qQCU_pOfBk{r9?i{aZm=&#fL^;}uBtx==0wv8 zkV*%%l8OOUM3eFvN!>{9oui1SQY3DzNQ_#1HG?sWCNH~+za?$pcmI9%>5!+btLr)n z>)x}I%6>a{?#fy<*V@H%!fdL-B4>N#sVqdb^I7yGCl6fV>&+0i;rxQ`wB!=0#3hv@ ze@V#J*qJ+Uy-zurK@bflmcYFHxmRYb$=)R_#p__w&(<2XTKT>qaV3&nn@h+3;nOug za)m%j_4?g$U%B90S-CP;K#SvYqH+eZNS6QdSnL;3jbj(0HJ1Gfp|$XLB3}c=YyNd5 z2%u<6-|Av_hdWM65)0NDO##sdXAk7Sf2=Ik1s|=-A9ve;>3c3gasYQ8D+YVDu+cOH zFBGYBxFSGuTtg`L@^i5^c)5*Ic>3}F(T9g0Luz=K(0hf3EDZOr;s4Fwa9#f!e?Oa+ zPNUN~V2I|=Xz+W2Zv^lJ5s*%x{+nSEJ@e-N$>BZWd)UA9UB?IzyGi4L7it)02>%ez zAy53qjPT|e!@C4C1?m09a2lB~ag6W3+yyt(u*5vuF*ffG(_2s>e@fHNufWy4i z)V_=C%I1sgXf$j~?q%HtN$IC^a9W53)w&=wO)zbw$06~xWb+`-?L7W|GDfs#u%t-u zhbBg0{2{ZUY<-P)5&sa*#|a-%0epC0D>L$u!AdfxXT4Y^(-647ijoFke?OltkuuJ@ zA$%LV2;wy$NeTsZ87#+eBjxt@-+pzIcXlfsu(_U0k*=2h3M{I7(b}osm*)#<`{69a zb?z%T#^7HR6OCsVlgs5iA|p&Oq*g_b6qzsILzCiVlI}K`Ynm7{{r5BEV!kw&c2b-8 z6|=cz+!JFSfOuR?NuMv$S|v13V|-PInM=yS5IZtLBC@fNe=F>RD4x-YG!Zx{ zgHqK=lDfF`#%_Te;}o%ax0gRF8GDQCZF5j(c77Ke&CcieNIxQ>ziC`AM-^N!uo-7T z4pDjpq>RQvBs319tuW{*hcMY$p&Rew=xghRnG`ii z2b@+4Z`k)~icoa*fAmoas0gnFCddOb1Gzhq>!;IHf#%0%?h#HCd+sdGKNFsnv5QmL zyO8QuYyMn1$9*GayTKIk~IurR0*8^cEr78i_Rg5sv=eC`l@( z918F~$LTU$_*r_B*(?wzqdo^`7+FB0GfNBrgvA_=Lldz}5IG4Y43cXEn?~P9Q$Bc0 zA=BDNW(cV@@E0M!i2-3e*XyO^DmMGrAi^YS=DNINe|7l;z$dV{`zd@tr>FS$-LfY} z&mvp|fzU55qB*o^dWRQA;1Zc+ur$+Nd{NF3QE@B65dg6demsMj0o39IgREzFAnl6~ zZg^np!C^RCmlH_ZpT{4f?Hs@Tc5^i$c0^BO@TqJXz@)VKqJDWkl58-emz38!8`R;$;??zygPtskTdG7`sACgOUgKko)m2VQB;m7 zUU*PMPtRYYQwQ+DRLzzL)7+=W@`|1y2P5F`e>vWyV#*}eA!9Db6=`1l`0(K9^n^Z0 z&=DMflg08n4C)8rY<9Qv;)@V@F$!j`I!T~i=T|&V9)@@;)4|;=yqTQil}GdCO=<+6 z#dDhE;>!rbDP%K!d#!rK85{Y5`wge&EnpbFH9=U*d_zZ@T zr$xGNq#IigSD5(d|K@b(mMuSuWMkt-NZONbM!Nrcm%>BGe&nqstV9^tK^&zu~d zruzxO!J9N~rx?wQ zH2Yi1f(-J{MHVl9cym69E&#C{(M+rJMrK{tYk)u72x_UMYjUHi!YcN}8@%QC=@obQ z>>nWvI7FC_W0J*Q!6@Vof+o=dQ_UeJQJ9c-nl(qO^1L=bfO2HZ&ae>a)(Qk`f9CBZ zx?TifpUFWM(Bo%zWmb~lO0|Z?*^Y(rcvkkvxyC6`Pe!Xb;`i2c+0Uj?YGX=yV?o;Q z_YThB^O~$(Tx^*)v!O-IS?sZ~t?UY}7EZM$UHAisR&pkb=`jowuCVFQN2;Xg)F^~%A5s%>Maco2W(T8_&v&ru@Xf7k+B zfT?=o!%Dsb1aEO{nYVJWr7KEb(WTY5BtF9C;X9-iy~UW;-gM=C+7ermlKDf*JDel46;*2L&i##&|dCjFH$?9Wm&Ey9xs{_H6z zV%2_fop%Un`)@K!cc$cWZ-^9)r-0wuqevsGC3ys)JR5|C2@GEGf5ipeC`>tUYUiVg zh$tmM5;gHJ5*a55=(Nu1RP8nDYhiVeuk<-&R$zTsxZGn-o1E0>XzY{La6XNbD4*A$ z`JzndAPXqg=@rOux)XecEyB$eBnXjFojF9j$o=E+Wisat(q`~hI74PI)6i_0oiTyi z<@^>nN}7Rw#YhXNe>6Nw14lM62;)0qiwO-07`oj%nn5sfvZ&JlL1l2kwYDDnJ5Gak}top3Q z@1hk&hu_odXP?5re9}C@y=aArW8;8ILgpkrxWa4-jM6*oe>)tYr&9}T@idgH6AKz| z6NduaTbAPs>Y~D0`iLW)2GVaY$)PrhO;g~Uh)@)rCJwGDx%5^O`MpT`S;rdc{YN?H zvnGq)49e7kzeJ)>q>L6gOh3Bbw4@r(P;wAT0+;{C-`^%6Qe;!>Ce2v zxFX59&(4UUfAv)X%SSt))6Jo_V<7TLuchtJvOX;3T&+!9SV~s}e6zD`u$0ko?iD${ zXCnwy&`;r+dh9Bh>Wr%as2X^_2LIE-|LRxQ3`}kw4vw6u9iR%b6?gK$qz&JR@hpy~ zQ8?3E0Y-R;j&w**BsRkG*~CgmscS-dme8M8sJ^aAe-nzTSh~&j!Qsit{yQ{B<+oBk z6)Y$ zj*8WKQINjQe%VxARw8{AE!s5AX;UTH{@|f7ize8EhyAH+>eDq{O5!psdIJd6j=y_TeQP6`5EWf55BgIEj&!62xk30jm)D+pAJlTws)7 zq_fSe@eeW1lgCKA^wnh^tjQ(c{(PRpTUSJsqNxw1OAPvD&Eiz-H-}T*t<2nn>d&38 zB?b1OlXJF0dj#LUfV*xH(|vD$EMG?!Yb!nAPo92$+JOM@Fbx0%kKON-lDyTfr`7jk ze=O}B`0JXetp=qPDq;qz)TI*g*?0Mu_9_8wx(ZZC9%nJQX+HV7>XMJcY+qRfZCz2a zG{pJ2B3z`(L^o^zKg}>zS?-(Zg+lSjTCrxv|Au;j;kQRw%iV!q`Qe>x zuR8#%(rp@tAMU^T{^3DTM<<&%1Igb5d4CsAW(gD|(|ED7K}QRngQF8eXw!a1$MEl_nOoi5{ngm2=#zi5TFQFy=f>bC;motI)Fo@_QHIG= zpYjf5wI;hfUmuJWTqsv%B@f!6sz&2U7$+kS1y?h+52{M?yq9j%)VuB_fX)FIIzJfm z>!6bEkwh5wrihQiPJtdmTs<`Bf971eax=kp!F+kLA0!hzF(1+ibc(0Khj6x-n8T6A zLz85fqZvJpe;y`LgI?T*WA_OJ5_zLo9T8XO;**H*^HIjbwdQzp5YOZ(JY&)n4)#y? z1M?em2g>K~1~gx@o46Y|xE~Eze0#iyi-LUZz*WyRq$*qB=n(1|-3^ zsC1Y()I5!DZl{=^)K4UsoEchbS3{NO7Zz>xi>yP`bw?9z7CY{7BrcI&m}ee z+^d#|{dkA2ZJSH}^9~R4d*AMl$2cF#(O(T&sG81RrIi~2&JH9ge~L}jw8WiJ>*6ED zEIgTB)TPSKio}p)7_EAjmVSCA(c(WlkyazHQcUSpdr83==65%%O@xk$4ki<7U zyWvgJvlkWtKKp{2f0@n>=58L$Qu{EX#%adM1Y-)Q>Gf68 z!!e{b`k>ox*8+Zi=!qwEdX~t9S>h84e z>JCpU{RLf4hTlQQTIx3}iuVN_Ihf380R+_-@f^qP0PdNu)R#s8o9>lb(g=PEUaQuP zdnZR9<5Fmre*gkdf~zJBbhA#q$Z+$ghE?<q5p8^J>eL}lGZ_1riZ z6Vh74qT{wNK`9niZeuzTww_x6c1Ux@yzu5rc0VOOf4RgpC70Bdoc~g3B8io@pY@f0 zoQ z?AA3xf238tep=~qI>5!REO+6mms~5oPYqt;V^;g28cm6hS?!0iTIvO=yc8+VL1LjT zV|S^B(%ji4`k{YYqK;Cbq3w6g8J4Qlcbc~Z?mg9#&>Zh{Z02Td;%cq$ZrLsuHN^dz zwvKsf8Ph`HUCuqqmuo4f{x}br8w44ENM(Q_f4?TJ(X#<+mA!5tq9Pc9JM8e22&uS4 znHVk|af!_%89503h&s(B1XBdrNdwg&Pb&_=|9ms(JmL~MHnCoO!V#EIt7>_AOFqjY zdQQiLOJuS%O@>sa5K3IH6VW9R4}VHfJBr-3}!Jjgi8KvzZ> z`47Fhr#)!VXD@XxKZSw1eT%N@bSPb)M#nTfVwqB}fA~2alinc&gVPwn^je^4QKHv@h)(h#LWD^# zJ%k=q3gJN?h~^pbHSom!JWjx7ap5vC;XrywCW3kzP4FsQHF<2KXHN6dZw5-Bc+rCf zG6eDaR+c$L%73ZjvDhJ$Ts?hZr0`9FRU^6AuSC6Mh~q_r99(XjODQ*225uW3!nP zymRwaU^m!@t%9p@3oG0*|C7O9e_e&3x}W@d3gL7&sVO|+4)f}=6(q{O{N>#h)J@Jy z^|Cj>S^-qv@zr4{@^`UIx6aAuJdd;=$0IJ5y1XLmlr8ydw{Ykh{y%Qey*~hV1Kyd> zAVAMW$Me#T#0sQ+e)$=zZMcjK#2WO9%CWAgTp-8;t6q<%?jL=O*+Cy2f4_h9)*;jHDtZ)UF+05532_2aI{{=h*1p6`gQZi5vXF;z8Pldm7 z)wJqeM=#^OUh&Mp{1DzHe^O^3UspwD@#rFrV)Q_1nzqP{3dHeQbQfGwI>9-;MF1*3 zj^?@U?NoK?Tl=59wSV%-NwHgfM8Bopu2KZFPZ59!J{jDf&Lnir)+u%bSV(j1thA z?B_et6ngWgtI4$#Eyv+<5oW*Ni_ez0i6#Z}Fqy^UaQ;?=w+`6lABD-)b^LvDeV6-o zcavPpParT!1my?ef8BL_`yLoaavk1{$Aay{a0=`0-0%4N z7#H4?yBx`rXa;X{y%$ffuO?C$1K|D`qEoq|%WyVbUP{68`U)iYW_Y&5M@odb)3eDG z8u32jmJ(o8cT&r19f5uO-aD z_RYI8d-`D+fOs1d^)YKKI56+x04Uy_aS6pYDZF~KMrjnf3vwqGzd&P4xat)e_({&m zs#j=`h>hC$e-@2h&8#DZ4#jA(j2o2LMTkv`@1>dg89xV4bZMtf^tY>7$^OFLejw6G zvEjr|FVwO3Wi(pVL03c@(Zu9H-K82zk3T^-;^X6b$`>|7BKxfP7hDz?nKaeG!qS#W zPKs57TwG~zLx}EVIUMQLl?iQxAk^kpTpmIwk(QI0f1)&;?>mY zS(;I7e@OcMOO5>N744!rwD4TPQfc!(j>f8S)*^?-SX44Ts6a)mUR;{%gLghY{^TQ* z&j02eou{aAtsv_Mxs+4&aFc7U>R4*K18E~;XWec^R@@CE`L!$Bl}fqo*Dmho_Sf!~ z*=QR@e*8MrHc#tvP~g=6YS7hJou(9k*2w}mf8}AOc5(~Og?UPeQst^4J`3kF07w9$ zRayBI)^CE^z8_V01-UR4cVg7|&BphLG}mR*TiHMuwQ(Mqd@nuDhD; zD0+FWpG+wq#?TrXzp)jC^EI-yi63Pef2Ut1eg%D0UWNK+ldKEB_>rWWC$f|69MFcC zMj>}*I3m*44w!~rx%q{GyVpqO?>I+zmb=wK1WR8vc|uAF+AiYG*D61YrssIDC|rO_-XE+!E6-4s`s&!&M)+i2HgIT17FNK}H#VxYhR64~`f3FZw zx#;yFDU%TjGKOH)dmp@;DLp;T?d}V%Z>5&;F+)qzNQbjs23d4(&z03A9X4JhFt?WLGNY-#(}f= z`_!65e5$w{_IUOVMUe$?2Kqz?f6v73?0i5?w~)Y(V zCER$55Ar6))4>TwFUEM`W;{2MJ@&pRt8UD<%}x?_(4Gze={!pk`=0xke}^+GGqTfc zT^Kv6HAEXIMUe$ZkXCzf1O+qhI>qX}B(TuF6to4Q&yG3$(9@6JQ=gqiwpu&uc1&?~_n@wA3AD!~Cmp;E+i3&| z+YU|{TQ!UQ1q5obGoB8N?yn;r5wIEN)&&>ol9hPNmL%&>$WIYG*aRi;Pm8F|Ti%@C z&3N71p%s@Ed)nJ$MZJbybaTo1JAievGO)Z8>YHdeT5O>LwwU{Kgk=5qX}qtyI`{z3fkwV%JN z-POK+t<&pty1nMGzuWG0hP#a~Yd=Ei%Y#9C&@^T6r88*UH*(OO9CW)iXmQ0ML-+f` zeiMuELr(*DbHLqUe{0aBT3v?ijs_hlBb0-o2JYp6`<$bGBVb%Sq$nlFNsvOYF2+Ch7_KiJK5Ei;{dzuWF|alg!H!L-}MHYH0tCUhmvj=(jUN%Tu!_%&Yr}k^9^V;OV1H|+KLm4h@41UaSb@IMENHA_WETmIWDrtf zEgu^Dh1M1t$zXqlHA*V%1{T>F?ZWVAx!(PDyH7)pL%};a=urzCR%^vE+U?~0NZTSA zdN_nRmit|x`@>S`ULLxw`jMfbgQ(Q$KS{ese>wj{)+;O8J;*~3MlPwfz&Yr+9ll*H zb48nFKFGCuyEck6VNL7kXYi7G)ovKT@4|%4VikB;g;>&d_w}e}!-F>hSnW1*Z!7qb z`0+VSqmhG(Evwb-mnlZIU*P`|^QE-)4Qv-Ykq*gJkGrH^WwtBOgWcZ9axcK9TD#Rt zf1ZB3zuT9keU5g2RK4T@=H9x>S{UICGwj$?ree+#csweb$R{Z?1pJb?zIWazGCy8=8MD7Tb> zyWO%-NiPQtQ=f}*2sp`PZrd(HLk%bGQE8ZFkQW+;BUxnx8p4C5363zM7P&>6MgAzR zF_47SnyZ()uw=0rw)=Uo3&M8wGX!<3r(J{}wen!Q;%HkItJv#QT$f7)L@6Bwyl5=dl!@I4N47mI2?8@;8AN> zPPvx@hIzJKwD#TImT3NPRBEwcudN;vgvpil8RAi;h6=pqMrS72Ros>ue=5ujIoYm& z843)1-Ibse%a(jScMC^(@qqW6G1<0SsKUwu)U_$X6j@HOt@Q_14s0EwNI6~Dvg;2b z0tM7cfFY>1TfU;b0&Z`<0GICe+WOmr>!qy*gFa=0Nqcw2U<9-~))wgiq$op~Js3Tp z?b?P{%XI)Ktd>FlmJiY$e?5?>$Sgs3bi>NUI%<(z^q7(h_V4yriFF8}FQLxh;KP>d zM8D8P)ZS9uFF#Bzoajm=u*ov3HRCx>&7twZH zX&@shl=jMFn7wwtQ{2Ueak!lEzG`;QCJh0Yfkfmw+Z~U9CMP&(e^G-?TO5n975uJJ zeS(L*F2Aga5u~^{0Wf3MGl)t4w2Jl5Dg}O$(9^lOtDcQ zVhApuy~KpM46+wWqG_ERG(_xN(BO%dL3i`eU;^S=3T+5CS4Sd-FxNYvVcX~r_KtSR zZ5sHSw=ggacVL1)e-oPlhNCTTd=D)!3}543+-rtha>O~{V0b5ycle*wNf8QZc=#^Uv|+j~&| zNn$un?R|BX8$dNo=551;)Ryns(+Y+z94}k5G7EWaRzONNPHjslYBq$bH)4&Yt_0^= zSC|t1H7*A#P7>}3lV)YTcye|TCTq6ulxf(DFMt;%53KKW?1wJ||Ko(&1^`yH<#JN& z!l~-|$-eIre@7!7GL47yv?}e=w=&5x9>uK{IEIE9tzDV~Ibg~wEcSrK&}Hp{E^?kZ z)Ryltbe$v&1n%GiDh0_RvkVaO5Wl!%0~*F*b~%RLL3?6Am#K?(3UX|%u=36C@vV<^ zcU=?gS9LABnFk%&&6@Kgul)hdIx#FNFWGbLX|}Wqe|rolb%G(`-B#r&8OIP|E6QnC zkc07zkokvF7eD<{ik(TZwPih#ReE(!+96Xxm^!7I{ay^R(ZoA8W(G9OBe)+K8nP>& zx#uQyF)3_lSR+Y>$7SFgB9P5_QTU-t6S}DES}`nXDt)dtHlS0$ZPPAuE{3sI{-nw+ z(pWyre=*|7#rr@rOT^NUrpYt;+#b{ge9ErP@RN#_?MSE@9`uzs3?6BqwU@?0xf^;kl?7hPe#&Pi3hr42W|&||4Iv9nMsZOkvjk33c?nz^kl$Sq;TLq|NxT@=Q_z6Y(_7Gqac zT~@)!R}BuF2wiah8_;RZa}MviEhMFRf96=wON{DI|GI5~s}PRm#57|=Eo=|e(D+ImtX&&R;>R@LV z}FWMd7^8^`t0q4s>e_&hg#KkH=o~Se+G0` zWwtFqm%@th;M6LtI3heG=Nkk>m@a#P(R`DQ3jLi;VfTi&tBXeDt$zE=%miQ@P&YP6?Vhz zn)Pe>Xo%Rx?CZc1jsJDJzfS++f4D~<7&sv6RW&5`iKFrw>J9nLxp!HvhL9;$s;j=? zwmWv@CUjD}XjgS^7iKWSNm{$=t|342gy~X>%Qhs${mV9C0!={fqB+)Lx^Z?98A7dAQ6RpcCWmqyY^Z zLWlQtVTK`;HQ6$Jsj7nOH%=-806@Lu$gOwu=e1$g)$dmV9C<)!iwH9Fa6U zxL(NiDi1t(h}V*f49jDP!!m-lx6z zt0ZoIkl;TCp&-tDM)%v#FBomZ$X)&)8E28^tVf;X6Wv2 zbD%aMW0)iUkfiQX>M---(S@3PP#3C}VO=PZZe==N7xKYqeVO^m?ylr^A>GNX1G?0O zIyM+PM%Oa7jZz1t4CrER9n{SZY*4ijvvfxsSgo(H3l;Pq4|KC^9MszqB&5@QMB+ZPM==43a-;V!@k0zkf`r+H zhm5U&zrafP#1~6bc9TGBVSv3XhQao+8W*wH#r#pNhtY;v5VzmUiWqD^OLCBND`jts z3eZKif445OKcS0ke_dp|bdiPY!s}gh)P}7vygT4S*d{0&RxLv^;XcZk7&%G?Oql#G zpvebizN%$d*4sm>WjbQEyE*W|5}0o9?nG)7mK>?3LAg;MX}n?PIGGWl+S!xTCM+*f zO#{=SK3Xl<5tE|cIRt&_<>P_5jBFejOc{P-^H4I(1@;DhK=Ywq*|sUj_9;? zf7a?lygj&3iH!nRDY0qT5~YPSR?Hk}agtDJ{rSZTT$aS9p=**BS`zH2tC8mRN=tNp zHqfu!GA!xl_Ccw)8+~jrc$_rcz^7FlAa6*oZ`%hZ=1u}a;$tT1<`%!6PQibs(}kSnJYeP0FJ2ZZUbeq@S+IE7pA*k(&3YG* ztp&P2WXaSj%#NvTkQMjQ##@GtW5I-Lz<#MwnDtWIK-=vjX6cUDvAvBeJsnuje+N2R zwhmf_=)r_6L-@(WeTI*+5YflEQGcKgLJUK~gsnw*3E5gW;%bE4ebLvHe7f6MMBAVg zM?i!mIX)7xWb~j!CyI6pzfpOR>;WbsAi@$J50Sp~`zJlfU6}aUKH_JGiJ$EyerAb( zycaA~ux~j9-5&4;)hNsjRMQ~)f47jv#LQt9@04r6&{dl-3s+48O}md)3wD4p%fIn| zWKBoA_Ud}xtlPfm`u^@d)vZE0Rksc3RU2)*W$2K8jUu0TJG)jl3h7(jHmGxL#4O)l z-HY5%ExKX{Z$SMSb+RtTe`9@n-S&#ZKfL$Z+1)d$Wp964156jawJBF`f96`MkC*e= zMcXTKr*d=`I=xxr&b;Y5R3Y4W#?|nd7@KL;@g9#4+c`w719k(w1lws~FUQ2%3{uxs z=G(HE8Q|jzw)j-mUJTf4J09Ng2;fbxtZwD>Hj%oO#uonid5bo$$944EVA4RGBn4;qe@=!rBmvd$_#trcKpF;e#J4y(Xm0#>CN$V~*fy`6NIz=K=RQ1k&M z7KXoO2KKTF`Rckdoy;W+_-+-ju@AJ7q^XEbfl5p!&M^oBP{2u=yCv5gJejlYFYYv} zRkJu`XwG0eWNCYHe*s22;g9Qhhh_-=V`-Wiyr?tph>T~|O83`Lc~J}=%PZPWZ+ zXM2!l*QlLVS{Aui{<7y<%)fN4zvzq@B$`xC*MhC$0f$d)5bz1Dj37-)OY1J@E+8aJ zTh$yS`DplKq6$IEhoqYBosG3V?LF8Y9ppj<8vfveC|*LW?q1Dzh?fN+sIt-Uw_5Qd zFlow%&fubG*rnep zNlJIzDT4G18Hoti44-9Q2Fg$s4C=QS&@YUB&H*1kxjOt6N)WG>xjzs2JmX7u>30Id zkz2px!plJ+2A1(e1_+ISPmgmPEhTl}Hj!#;B2VPBe?vH$p}lx~NFp~W$}F?34nILs zZNIx}A9l##Z~%z`RPrgl_KD~WR3t8%Ft6eBitS_D7#xnbG=Q>+1tj}Ue_yi}S%n5i zuida>f5CvktGtj&fd(&p;1d(PHY6?>98V=<)AQwV@cD(>#XO$x?32AVz~PI-l6eiD zr3`Loe{>8#$z*b%;R_Z%_h)ny&|WDQYqYskUii!uznG*lbZ8s(^PijWdFG~H7e4K$ z(%^u;OZ_!}MAuH}+%8s_?DIn6k%2}!!}D!~FWh}z=K&{jL#G2N?lft$ zA^994kmDh9U>|vNJ@Pp)=|ql3f7+vQj2Qm%K5z$LN9TlDI7P^j=V+A$ zd&NY06?3pd!T9+V$$=JO$ANKWPY29Fhz|ay@$l`{a(VTB^Idz$kXTi9I=1~agWLQ8 z)Y3a7Rufd8v9|Er>zZd{C=^dX_%Ac*DfLwJa~ae`E{d zuV7)qy3Ax)j)BS*3!#=|uc{Tl7+HuIS-2QkkQmukjJ+!5v>5P5zaTT^()V^-nr<~@ zYt%02R5crAykTbllhtHbX)L>Jj>&5y36W^X?rfx5raezq+a*vICQ!DIKv|$bnIX_Y zR_GEa4-+WgN1!}VpxhED|MLPBe_;X@`v_D73RGAE75fPUe`xj9l#lN0juF&mC_+%H zfcVfy7jKyObFqPN_#*=o)-F6O$3RrD5Nb*OL_{zVWFcZ?;bLS#Vq{w}4vGWtN3Cf@ zxTs-B#w#7Wjcwa($li3rkb+(Z(s;|z-X*=F#~6+7^#QT8wFHSZV1X{Qe=OL3wY)o} z$^xaz_L3?Kl`1o(+RH4tAekmw#wE_BUU-4aj$e2odMUbl@4>x056(aO@Z0DD>xkP9 zrZUrZuBIx}cHOGRICp6m?bU5`v%o3E!`tYsvpZe1gnfed?%cW8Ma^OwU9Ofl*9dqO zH5V7l)pWMFjDBcVv*it7e{I)~m(z}>J?gKgzkIVx7M#)$QXP?|VyFZe6&u)P6m4)%G`RwxXS`l5&e*x`H9lg-b3oP zIMQY1Z~XFBclGRB_docRfOIMTgU78C5<2;Se zfPkjec;}=!WeeTd*GYFel5#^2rXz>eK)&_r<^tyIvi%+XfYuxOa5H$?faOFt9q@p1 z0JqP|MkDa*Ur$aqEV=l}PHnui^{koCepa?GLEgN@PHJxEf9se9ChgMlf$SQs=BSzX z-58v!16z)oADY>`c{p!1bMGvFY=3B1adf-9i7p@sYr5~E$FzLGNL#cH96Shrcimph z9?dS8z}Cw(>*tRY#+weXELyz;^00+2)NNztk>&bvx%!TX@I%J0DYskYenD(+9^5L+ zy}kxFzXGkzf3D}PgGZ_4PrDXrv3*HDShd&7)mo@yw%+QUtwCdtKAUwn%{-1ix?ayN z@ZytZ+JJ)3Ke_(^etiB31d8|1KYZ^M$p(fN+n~Ou_?}y?5rMghS?NAJ=M_f46e*>2%=awf=VKwcCcB+R{9u?VI zXb_z(&`P(I&e!c#_vP0r2ns?&1RmbZ=2IO#q2uQ5w2w57etbNGlo!@u+73t988o{E zm`Ae}0O3BUm8Q0QL@a~YcrBS8!RQHiO!P)bcgmvIPP+~MMlG~{`r)};X4S0}o*q?d zfl&jUe{89K5|g8zrle{pmQWy=&K^B#S0K9fP(bAC8;)Q1erjNw7%o0T=(}!L_-_-d ztM6}`DNIe*>KCA=ae;o}7BJ1){T7GR6%bhwCE}5Lb<6E?LEXgqCsv92#mx%Y2T{74 zYYavZ{URy;XEN7Aaak~NC z_CEyX_dmLicBJFEUp_XowRR2o;ImMbXl(lDi zN0CeWH^vztqa~KZspjde<;rPIe=&tm=3~~8%-}hY9H9E&secKA!Hi}~_qdaI`P-7`A*1WTqnh#jucDm(BsrTF>0xg={>3vw#CIal<% z4U{$a#kcM^fcFaUsPt}j0kKgI2he2JbqF$5t1=+zqHQVpqlJ$R34>!^q+swE_0FKH z_L9~_m_HS2rLX8PPWGn^f6-?>h@oe~=Kux<*+!3PZchFdQ`f+xnsRp>wIx}5U`IFw zFjbIxgT-Km{KT#H! z>M(T)UAl<5B866I)vRyPHY;5ITQ%3qIeLyjy9Cow!_<`(n9Qh5^PCu}SDZ$QQYNEu zbTUo=R6wi0o;w94F+Z(?w0|D!HpEMFjQkO;LMdGRr9*5A489W8T--=HC-ZDn$R`Er9`hpz?2A<2$>Sa0zp$EStwYd zStQR%p~4u4G#bg|niecsM-3Pi-UfTdd;_eR6OK)XvwtH!ZLM4drqht6 zYES!^`NJ96dWj=ApmEyd4f&e1B9A*~5oEk-EIWg-?5G}1qZq3N)XcdMkA+C#qV34P zX>=g}?oaf?+}%uHaZ$KVo)d#LpddOBj4`LW!o|KuLZtu$?J(A$TlXLHQ_U$c1TlPnTt!r5JA1uPTYNF-9EvRbs@U%R0^~3_9u;?18WG*O-2l^lL)D zsyMAN`p~aBE(;7m_zOrT&;1FnRSt#zw4dLC)`7amQFCzAJAah*;48)MC@!kJt+AX; zXH<=uXYu&EkAHSI7wFuNZsy>lob5|dBL9I5$`Ecs{$Dk+{tj&cuIo2nvSbdbVjkK8N&R+B8x+`+7=JhPWCVZ-KMi=q(I>4+tEI*7dXGV`83`OHt_Ysp zn?>!!Oqu3~w07f~A;+5B>=7mOdP0d4mKBTk}jnv4LNcHpCFBXp^U} zffZ*I<7^ah+3_kek7{457x~d^>YWc2)L_ZW=_|Ab`tb@v#ZPSqH84<5@=T=f-v`@V z1An;cNpH6p*YXjj7C$ztDIRGTZ7MM4z_W`H#(y9y5k@w*+?lWSOjYsB9C!{b-3&!D z(vUW7sk}`}rM2B{UWJ#i!)K#-lQCxL71?(u1aTVe;6&*Vi7^%rZql}v%5CkL&)R3& z+Lg1|^%wWGFYzc$JpfHbmKrrUU&d`2N)dY12z5!bCL$_gAZfFgW#BEY5OC4`6RxB3 z3x9B(;XYQGfRiN(EB|!2xev<^-Bqd6>UW!0qi-PJR#ig6lw@t|#Ym*8C z{eYPdFq44)Xt#fO%XDao&9+;itdBl1Rp4=4X_Y6@FD8mu=`tt@BQh6`1&`l03 ze!$ED_zw;&N*RX-77`Bw3;)~|Sf~L97Df^CkG~z8GGvxZX?9bIt(9c2y~%@2t0muwZgmuYXRy z@WLz61F`-K!mMr<3w(_St$p=q^#>uX?~gWb9s9qLtgf)OYq=$ADhBCcIG=(M(Gc}PbFHV}eKIrM%Hnsk z=)~H%q17}#6rH+iQ^1bTq=>wkUz~X^8$A0&n5Pi2?LM^Yf(w|_2Jhx>`X z?bQ>*%IYY7pvv?~4ceA>_p4T!>dIGl8^P;)BJXurw^nagP|v+550_y3%>s*#XJ9FA zIP?Oy324voU}Xgc^N(5$R1G!_R}8lHg%e%J3O@px=#^@?MBn+8l0jMJq1W0hWH{tL zi`fdH!=D--UIW5GJX`hNd4G&H55a1AaRbF~$b|!16$4$Urk?OXc)I9JhZRJkK{i!b zylf{~i%!l}h5~L$HAa}zuAE|E1Kh3wyu!m}w2{QD1@!0Vs|LpI)d&sXS=F0B0e=@>A>~#aFX(54 zzwugOJR?Mg-Ll1+yIF`BAA=#yT5VGkE&iU-kqQ*O+~}#-hP_ym9FxZXJnlt*5 zB|4~1CATU&hne0cv3|y+I8r^jx;?+^Qu-@Ui2N3oTb-QZ<)-b)sYME^I(c$okcy*c z6bpE=78w@s+I5{@Zo@ z6f5ff?c(Aw)PIj}7j{5pv&+jrsi!>^#O$1Pe+fU|e!C|}+=i#wP=ZP;N9t;}*ldL8 zMh6W$+hJ=jK{lwjzz0e6&oIJcIeNg*bEvKr>i>eS{V5fvPn=81tSUO)4;mh*B(IO< zuz^rv*w5KDVg-7b&;K)e?N}ZXFcco7W`*}(ujM@l!+!%bwXcfy91aiQ=-Y4i<>}x7 zalhcvPLCNj_MUB+f#Y92-}u`@$KI+|nEwNsJ}7+bsjdChbWjM{ldEsP-Jh?&B8`gR{UT|!?YgSbxLuPj8b|+%KH!NgaqEDlzUJxC?5YxUnQ_=BPn9O7J>5g zWBE#xU$e@`vI<8K|8%jb9=Sc6&wHgaRKfa5+kds{OtD=BPO8E|BW41wx3qltD!0Vw zB3GBr@5a45cbj#CgT!?MZx&A&x%K7|uGKs0>5|Y3McX)kRh$STm5okJ^*gyzdit2k z?P#~0v0vF3em7e%cXXZe?u${%V8Rr{uNT=cbWGxle|OyB=DHe0DgW7C{RJ0a&=vK< zo`0^&-L9OHxQ~IcxKAhw@MC(u!yoN?W`D~t@J`cN)pj(#_uJ1N^_YF-ygQr2j)0R> z^yCG#>lyw75TL)xi$zBY@EIvSxf+zZA;w>|CKxF*Eup9g(T8dfO*_RhASwtMZu@|W zM4j|{ZB7`6=%&rNr1n!T{BSPhn#Qe!8l0O#_U1AHMC-A>Z z@aQEcz3B9tEP7GmjNB-0-6(GNK=HF1#m|VMkKi==22z4DdKu5t5G8KDu#fgj&izd6 z2;8y5Xk%90uaRY^y7X*&=m5D1Hh-5*wewP_GxqMHhcb!Rt>^5Y{GZD!(FMGT*6b%08|H`+|7kI~ETexNU zHBytQ)Poeu%C&DUkQ#hUVl@wezipVziGAP5$2 z5C?%z@W7T%Df%QzqnG@goJKG7Xa*AjdG^r-K;j;2Z0>EPsvE8b(aSv5PZ3Mo5DZ{Jb88cKILd9ouf~H1HWD{vi}0 zb|HjA4w1M5EO16}O%4hJ*xA7&+c;X#TY$wikw=K|$OE$5` z4=TsTFVu$IppNq5qSjFAycn6l$34yW&rL4cnw?aLnjh2-O;7$7GC^CveSrCW z;G_+i#2cH%OJoPn<8ZFO$xMd7yPVpvu=jM&rMX}&JUT?ZML)CF;)HBzF5>9vcY?yl znKr**3B4y@HVRjV1%InI3`VdX!`enz+Q4Vkch?M@0!&6RlH8}Ysauc4$eQ-~$ zp6S)kd4nex{ry;F>CgBnK)qax&Iw(!P~`6TdBAlb%EvEM{3cW1Nzw4?cu3hxns9iD zJ|nU|tqhUkkr^mUxYc1o7_$Tj;lis!<8v8~f(}|8>ZYjDLZn;&MW}v1r@_S-|uR zxhT_`1lEMpdG~(IuE6g>rv2c<4UjOi85ro2B(WJfn36YVW(fK3fF}yVDHUa3exb;v#fm$;ObRe_Y1QX#Y#WwG6k9KN){17@&gc;ABYBTdv5ctZP^e*dw!{u%R?7?3&d>hc9#_ zL?%t0Y;>j3Fb$h~lq68!P+eJBL+cpdrcs^a>7ey_tz$qr8BP3p#{lSqn^sYYPL8&e zqvMuT+-=M5u33}H@&3HyC!8uoj1f_MR-{c9M-;33ii9!S2z0VE5!Iuz%rYU_&L0%Nl&_ynba( z^25>K$c06(JW+E!*l0gwvJaTVw|@)Ry}Ac%nfmtr-vzcr_5R%lc7JXJ8!A1PHt5@v zAAim!4S$E>GGve+!4NqTC`0bxnzB2&sO(m*DjUkd*z-wMK?4)~52{MgJzIMw329k{ z(W4+)6KA(zkCwOv^0DmzzyOA@tyABn^tyT-gC)&%9-&k8Qub5Hn)xD|uQWnknUf>) z#~Ma~xk(;TYD>D}gt{%d%9t|h&>pPY z>!AE}O7O5nN%`1lDUR?BS{Bg|9yliGvLHgebW-MBS%co{l0Adyd|g&FxZaB2a#z6U z+h1f5z+~AidKgqs(^S>wpPIl{L<7~2%7RZpRmGjH*hN+UAfiW3$b8@u|H_%+Du2I5|)t5AcFZnHgzXAN!6B_K92z3F+?32x~hq^zPpg;Y8y z1&2QcKAt`ONE$L`uP0qHNe0S@oJ$?R@^0s^J`%$Ff+`hQjp-=bqAK zMcRsI-|}vH^7Cm0jxiPzoYV@8{1=xDBGt^sB zd$$cn2z)v&Xz)sBYzORGCHyUdp5N18LKk>=o$X9eoC;pfuiiMI+)Q-X92l zbdKXrH>mM#I0O(@4P=|yH2JEWUCc8S1j*4CAMPLSi`Z+$5w)((uhH4K<$v$TajdZ@ zTcy+d0ztg-=+PtbiR3G4k zS(mJNwA>3+?KHyjBE2rvR)XgwR<0Z)tf@V2e@UCD&rc_N9NhAP3U?JleH3>{4zX=}2C@tCjzvX58b}SGr7lk?J6D z@C9F_d4VtW?SG~ErboKJ5>(igCxO}UK{3sKRp{jEseEE#F5B^3t2!#rX)8RouU93j zd^(-Nqz{~SWM$|)_BV@;>^{YSgDu!aIVGuj?v`|apu=bXrIXIrSV>NL8*64_7wr05 zs{*bhl4$H5>V@L&ln0cY67ACnsH4WZTJkB~=4qGaLw|S|aUA6jvw8Uo8<*{gX<-Yv zKFrQ_%ua&kz4KUtqjv@va%MqHsR>+M)bv|yOaLGXJ|Pe*1bamRj>r(X;^0_phulwA z;8tRHbV-adOe5Lm1?5|EFBzBPoBWJh!O=FQEr&OrUKo6nBl1O-O*Ma3NS&TdI8m@? z{GxHtoqxif4=OdV9%L;9uU^_a@{j&O$ z&XHOuW1u_a(bv{HSLt5EXgCz1D!IZ`RTy~%K=+snDu^l`0;JOUE4sj~8E;>}C{*Pq zG%p6wK+ZMAUjs&e0JTO0JV;))W&m-$Q@at04SylruWYdX?dLU~HcFhStI_ocU~iRw z<*ki@z5KE*CX{8N$t~sW#;r+I($0NoAAxiWIgEhm(14qVy_8LZ} z1Ap+dp3lNv=VEC2!GUdwgSn99?^QU>&PrB_%Gidv9(`SWfddN z5*$S~fTvQE#>bNH0cjH&n!cKJB^ok|$jd~8M6 zaetpphe*~En*Wiizy!r*_Xs}_S3VbQkK12~p<@hC10Xdh6F$eB>t!1rvb;K&(_`2z z=TMlp^leR8e?r~{wFN%YYubMS?Nx-{$rAH-vr9avq0mH7A>>YuI&ZA*&>0LvjJ=zA z5}H&hN@sPMM3U(5KwP{A0|M5DFF+0 z^nO_0Qtv9CG=C|->=l~P0%i&9*G@oZFBUqqTL-!U%h*9Dk_!VEwOzy?a^hByDVCE^ zQuuZ;87iDq_83aaqd~a{yT6$%_UW+|&xQ(x9Sk5-FuNiZ`0@ze&wm+!RHBf{moiHT zqw%GQh(<%kA;iXSI_hG47)hB3nz3Lw5xUoHkrjv0;Xg#?+vo7VFTDy!pH{0$5^W*h zY~hmx?aS^de|)OI6Ywqg4YRiq^N?p|$%;GF04eeyTEXlvQn-P70{=ii5s_p|Y=XOp zfA~Or2k{RIowOYKJb%q#K9*P6l*ePmVZgtR^CSx%fcmazwlCfd4DFhHiVE9Rq(4Q| z7C_=L=IwtGVS$6U>vM!QItC=aCzFZ*0SscdU(dh3LF^}PIY1Ig{?Za|FOj!rHYD>p1F>$3O$zMdNufPUX(l(t6pKd+Ia zgc;93Vw6=kbtOr}zaHp@6*DGR6WAX;4i z1moIi%`M&~OYF!|E5QGXQvkpnFqhF~rVPP&JToIH1UmZZS(AH+NiC9RkgP#>1T0r) zNdjkj_|Q1I&Cn}^WEYU5f4&lJTQk-nH(3w`IPm%TT7Ob3jD=md?y0eV&K^Dyo4Q(t zdq%J)t_Yv{qwRu(t)A@oNyf+ww2=9!%ojTN%$HVj^a=XBSYAe35@s~a-NcPpWGy@4 z)M?cv$~yR4eeqZ1%N<;G>0?)QeTL(#ufO_LQhu^s(U6)fz<9+PDDEaK?wASvf=ei@ zL-ZN!aDSLi(-p&OfrQ!E>j_{3bE`(wI8)9WkNkTVRyx9{*MNgUNom@+zM^>NhV)hN zLZiUeVdDWY?$(Cg8W8-^W4UA)D;qAA(!CbTrGj)5)8(4I2DqBnPeHZGf>G2SyW9&L zj_#t9xYOK{-*LujA%Ukjo+3I5P89J^qt(M^d4F-X0HOjSUiy_}CR)2Z52dGvj_rtE z2aF=vURe0-qT`Gao-o+(@Y@(uA#Qnf zXeX0=S^Qj-mxa!*hyZ#+F}dqvb@T=$xEPq^KmzN<9M3eio=>))Y{i~sb4*>&YRqj3 zUw|wIy_tCf)%qO2P5D9$exI9u_{N$5S z^f;z~P5@}3MwwMU$$rUZlkE>YI2nbkHOB6=6kj&6jiCX;*O5-|5`Fu8{e3igetSBG zchA?)*IThs*42IUyKV-|)*}G?_n&`l#eePYjYS3dG47ffaTh=FH#2D1lU_$s$DJET zmRT<2!+dW-Ja5$cI^6X}RU71cga4JQ8=Bdj`^{MxLc1YkH!`O!~*Mx7sU)4E54cQ?7 z0j$yQKY*oH_8-8?H}D_8>KpMNILsiS=qm04jFAw)vcUa!7eFlk2krt;y;13Q1|23QSgTufb692(rV1Hu{1GcnmIzN16eQ+3fa2QzCVc@|b;K3o_!6D$m zA>d!^5P*PIbqE+_;Kzp6Yv6ydlLw!6KG@0c*iMeR=6dYp3R1|~Gjph^&060B^TY%T zkYGc)4}i3(%i;59TEHbU$k>JQU@x7WT;OGHvealSVc01(+Hmk)S1st9M}HL-b;8YP zTTc7gwz3AH5ej-Lq*ITDYoa*fRF`9nQN00|);!tA{qW^6+5xy(ijxQY-mp#05x`2 zGfN4rO|uGpP^Qu#On-p^>jQQpF!O_U zcDXn&b(%{M9o!2ln~3JS(1MdJf+Z(j5k= z_)?4xI(K7;z74(J?+0aT?8x>w#4jGJT0Ze>_K5F1A%EoF9E&qSN%6Ix5Y|e>idw?t z0nP}k9~LT)`|uM(m)HFro+lD%#EIgdL&M&ry3ag)^Xp{;1%lc$c@YS-96_4JVO3h5G&4*DFRaa2Z-=NH+cJqY1#w&=e}@qOnj_XXWgXH?R%B>w4sZDC8;aOew%F5BhZM;R*z0T|;ughuH3FC0mN)|Y z!-;~y7kb(uNjf&{3SNn?MC-<1i+_9s(c41BKB0S4eLl+<+E>r`lB_$dB8oN?TG3^{ z>kea5#Sh-wfe9u1h@lZ&)dV&yn!{ah0*tv2L&@f2=qk-5^p|0m)oPv>nWX@uWYO`0 z%oB-jMYbwfasg5X$;B#;Vi7YmR?k;?QC`xf<6}igWw6{MKsXcHgiNr2`hO3e=_OW> zn8yYh9L(0$#@LOr@F0x{pc8El{)`>S*$l$GXcyKTDWffe!ZsO-I4EQuGB;bYjqXTK zW&v{cbhFu+3I$z&OwS5-;HAU-c2CNAW-=OmXKu2Xlfp{{Z*qhw zK^7G?g*Yx$31f;U9Ka*~cz-pl+KyLy0X7^j#K1>j8og>I=e0?U+upP~IU|k0ROXQm z)Is*v!Y-l$y`W@8_)1mbvL_(v^JxkN<`*@N3fCsmlGji}ryB-@yRBygdL2>W1mVWf ztj2JP2_RTq0zf(f@z6>`OP(E$O>CcH;5jh*)x0E+Q2vw`&fE?2^nYAXU;F)9Er9DC zfQKQQUKw%SaSI@=1%zq?cSz{@%CX^HLPi#{CmNk0k=M$r+cD_`O5LumP<=o^Jo6-_ zCUu>k7M!#qt@SJrLct}gl3v816WTAGB85EB{&IFS9q4v@8zMsRgrIYwY^6%|(dz3A z=4A20LWi;IsC0`hN`Dp)AYoz@&M7*RBQrA-k`kIE79D?t??2;9u^$TC9?_GCx_{x9 zjFp?ICGU-OB901GLrvElN`T-KW+EpOaD!5m^3Cx^6EI(|V37lqXy-P)fC{CBRF&z< ztZDJwE=n#;Gh57P0Or6H#x7HmgfuuUWRxynpOqIgNUeueW`7yfh(%-#HuwvOCawNM z54A{ZW1a}rgy*wIC5g(PVwH|-z=1i19{rQvvkq%_C3^`;e4;2mp^>?`nbFz!J0zz6kFb&c=RT=wdsXCl1 zNg3ij8f_J^R)4+0_4rnoGBsXfw@^f~sl~s}P<%aqOgK+ItgfNeNdRk}C1}3hN z%omz;Wvp;SIY`nAfl>lA@hYKg`F!-aJ{W9_lwE z7kYWtk^qsSz;kFjlfqVt#nle-jU-;QUeuDaSbyHwYX;88n<{)aSfqIA2~6Due?IQQ zHE9I}VKPkd2|QyE8(cTS_9ZG@k=08}*!A+ZD>WMpC`PWfv=@jj<%6ejEI!I(DO)TI zI*`(T@WbAG4LBEHU*0#*Ay_assI+eZ+6b<`DdjR#rmk8aq~HOMQV}T+3msm}(WqU+ z@_$G%@i;#z+`a}4ku@Aj>mOAVM5)(i4lEMeDslKx4@xr|E_*j(L>(dsT~UiRU)|Si zc33?$Hc7F7E^E83Ymfoy@mL#a`zbixoy*Ga3N6K${w7b5RkcIRpe5#wy%Iq1I^NBp zCbXdsv2TW@jEG6AtFRk}Ef!WgF5;zK&wnXE*SWB>Pt6W~4LlFB2ZDWe?SXK8b1l)b zaaHGo3Ixw6ja_WTWg_KAn}k98C%ykKNl0(XdylN^z)DR_dfsR^TXt8 zOehjZj~^+In6sn;fnCD7@+f}u5zJJR(Ss+OK$E_Oqp3>!(QIMl$B8|t9XQdqV1JxC zPZL@g@q_gHYL;6SUjTcYS@!Z5v-B#fc3yn(v+~6kqgSF&F&!Acg#$K182Od zEYSZvrdB|{7i1h}yUSTxO=nkX2S}J{Bb3H4dGST8Oc0*^_T987p!tJ&dYXMdN|Nus zfE5CoP;J)VO%8q_0%X;9@8#*M$wyy&FvhAxeo$O@8QOEvt7Aw(V$^vKpMNKxOg`J& zKfJax=e=LgpL_r4(;q=8!j&=$`@CN)(K^WA+;n2 z+QK300@3^wmR@x68UdVf!Ywrjpj&8uiY$bOGnf;ztPluyjBIj(4l#5VDn7}vvxG@~a3k25#!FdmTl3WU)+znc>w`Mj7s zfuph`S4xHuJHt4FZ0#FSk`keyb`+oEL( zF@P~NW!V>1d6Lz2fEasBa*SJ`CR*L28Bn*!;ZqVlFhsCSj8Nx8!tz^fp@4N1_j-b$ zJkEQw9Pq0X1F#xO18hu%ly(SBki7(95oNVx)1Zm2TxIE*0)Nji3HjDJ(I(Z^O$uI_ zG|jO2LUTp*O?iP6fw(xM@Co8;lqKN!RnGI@vSxztydV@wM8bO*Kcz?4t}#yWryk;oMO?<$og1tlzwzE=DtRKVz`lCAUayml@39*ii4caoNsEbBoGzd}xSq)v)wMZA%^92y?QcMQ=C$VeeR* z8z*9)VSk4IV9E?6U`$&$9vwPR+H#avOB-MqU^>3Uy_!qn5+@viDZd>(ENkVp6T2

      Gw^Qnbg!`#L$X4lxQ0JfAEEFCH`p6SlGg5SMeiWMJfz)c)Bgey zkpP1c^P@QpiMXdS?|G>x@H`gsG4iud^d`a<5$F^1#oP(mX%6OHQlxUOIcTOAt6@r2 zSjvq|SP&%}d*q-DCOy07ctUPV4tlMzJc6+68+|SrH^02^Qr3I zTWrL-hq%O!vH9bQb2|=W2efd(2kwsZI*|LnRL)SG-%r+mox?2j|? zurBmR_@p>1DL}^-W#S>yhnE;1HoFJe{%#ONb;SZqklZo|E)ZqM=tf<6m)}DO41em9 z-+s-nZmCvW8ascwvAmpHONfApLs1fR^IRMH^KbT!u)B>K_E+we4`gr+T{mFB8@$kF zkO!=z4eSGt*LQ2K+d-4-yGsX!xBreTogyo?b55GH8w>Dg&X#Riwq;3{<+SlO;kn+C zeh`{6+nTv@Jp49!EKpy19qu~GewsXz8U);4K2jq?=7xWX{wv@{PyAw!NOdo;A_Ewx zsg%mZaTF2YOmlZu`CNsKINuN>U3FTFQoOE-z&Wg7@%TzD~ZE5QayE z&-u2Pj?uBPj{n$0h*vXa=U;JrTI1s-U=AQ{4>ePMKMN~j0snZ zJ481a7^pYE8QCQ)`(XKlJyU&HNFSQ^$Hl}P+{1q*gz=Tx7!j5OB*FN?QmE;Ebe=&z z(Wb2nIo-VQqQoat76E@Hk_78#^j0$jl&kb%~y3@G*JiXRYi;7zCU}}xCzl(8p z0hVs?m@lTNQ8C{5@K=GiK|XPjgI?e*7m9*GWz2|7Wvl`(ITs&+NAhCZ&=48r}9KyNJ&+#L09>Oth z0EzLB2yjJ`Nb$kBO2Ft{WtqUFhWUX%UllK3H5`h$Kxnc^=g%(S|Fz)BgE|U#Mz9em z!HQ>pfbhIZ)d<$vxz$zQUM}3@N5dlK1D~B6Q|d@_L+D5`ffTq<0?1llBL#Fc>4F<)ZbnLVMQW5?Q;c93uENEDGBvX?kbqC)IzQ_ET&nxAEulqvYLP=&~5dLOPHZ2m+-f9Rl+ro2DoqoSEd^n`&;;_ExvsrcJ+`XHR`qx%RFAFj zdn4gj6H(0zm#d;Ph6J}nBaVMH-^M1q%8Q&Ls9;naWWPM9wfE{DgrTjI{QMk-7K3!r zgp#P35*eeMb2v+JF=KKKy}OXLw`sxN3|J?T->JO~Eh}38TGR#h#-)9%kk9|z21+0e zM96Knp;nLz3U9cZq3kBWj_CGMI)o~Me3ccSnzG@SIsjlzR~V#4&`W=CnZh~jPLxnb z+fQ{R)!$gYbE{k+>LJjBy$FHNtu{)gbq(eHId8lL)wV!R4$ z^H4A>tw3h5|L&YflQr9uZaEU|it+}za13qn;#GNpTO%SH+U9>mh8tQZR`JD84CYuC z`v3~#HFO(oSXcvm=t@@fuk%I=?ohWaoq_O)d(?*XZto_YRX32iVw<=&>ko&7i(cxZ-OzQ{4s3s$ZdFcK;vQXtdAO+u7?zrL z>SaDOeqW7cX%`drj^>%Twn=0^MzKt&B!FBrP90-TOYZLhXhUux_|0F^i6ZSPCM}If zQM1Pqke$pUBlgL9kx&21^NAGZBQ&XiRB)pf<3nEa6qwf8q$M+{j(H>|mER^W(WXZ} zT}3s5`I`?$@0H-B$kie?@sP69+xsa&t@gxcTqMVJa)240%UK=)8|k8FeNkS>V`4S~ zqbH!$=S;pe58cgPs-tBN%m)2m|iSpH@|t34%Mkus|08GEMZu8Ec%)%fy+Oe8OVAcrG7bCwp?% z;>=&}30CTCGv32khIM;`zOO3VJ$_6%_YDG4&nVjFZD2@VxrvK}H^>(w6X{E{%1hQ! z%krQEUOB5EF~7{}!WVwu;uUG|>>#$OjDLS}40+|)3{>>}+He()s|P01f>2;ydUw~-WP$1)SS#cEKJU%=9y?CmjKh_Zjq zqg-chXcy|Ca%^)q&<6?r@0mIx=8h?%yNm;jEihkR=j~%-*77+tZ_1nlH!x?ArFn*y zp3QEQUnt#PRd>B(<6}oZX7yADcLK{(CXv(@;C5tsR^ZW4CDcKCId}PzTDh=qGk62evPheb1_xIe}G`v z3IdRkT)Q(tuF&wwb!Sf;Z5zXZ$KDmZ_|<%s86o6K^HJ zywleV7;GvX27t^v!_s#}2(bs{9TGnPFg#}NEJbia#KZ@ya3Fd$!L3wS`wg!+;s4YPr*mpQA_m}bHY$IvYAjvhPuj@I zKty-3FE7e#OyXL-hw5<7djK1z3heQ-9GlzyhFaldBtsX1aUlqM2!ze&uw~ubpbiFY z_oirRVc#mEO3J;8H#hl<>ws)ld!Be~R&Gl?w$Pm_9!OzpZX7ms7U#=#qoO7AG0m1Z z>2NybvLClQx-UdiO4ong0C(`c)ZjC^8jr6js4#;${gL?n?o$uNxr~@=`0f(MU8`jQ zUkvGuuC^lcQG5n37m&@>qi~GN*RVLESjz^MmBDTK^Ed2~d-P_K7oTV^fBc4ZI5z_gQ3R1j))UiWbWh{2JN>gcXgJ34>XC#XMU5cB?kUPP-v zWkoPdnwAW0JAriaNj|>zO`Ln=?Q?}=YAL>df|yV4S(g{tbzbet17SvnF5u5W?_`&q zJ7%JHpxYoSt4F}cA(WqzoQ**4|5ktUt4eP+3ZpFle!>2aHWlDUskUf%e z**x&RK`jg>&1qctSBo?$Qy|_2Xt`P~4mgLPhZ)X6`1xX_p5=4%k=&6WE3Q7y+_DPr zG!VIAb^dI+d5e)nbzgP&oX+vUrEAzO%=in_D*5~{v*y8zi~J?BILU3yZyDQyq#BE<1I`(Ch3{#Y}Y@%@8NxTN3bVjpS?$}a|%?=d; z$>VumsIuEQA-Hp!mLXLTSkmGn@G=RQao#`{Ro(D$x^M^DjUEW1F&0vK03*R<3+TF4vStr_Bb3>LCQ&os9 z4JPPUUws-rscl)+?`&PQ!w|$>$`##q@`$WN}rG3{xjhB__W`=HJ*0UXh9j|8u*@DfL8J*6IaGi;^qaNI)Ht_r(mj zrH#a>BN6&Y10A7{EK)V1^@Kpo8W%9EQLsv}$~jErQ*Ht*VtH5uHT%o`?OSg*lJkF8 zeB~`ZBhX57Y}|D?8!6uZ`VK$5zQ4w zk_vi;k}}pkmQ?G;1~cg^r5cBgT)%&5(3Fl)J9iAe6VRm7f4*B~qpZ3&&kp*}kN=m< z0Q$AU1cFkY*#oKTo;pzFtMPyq@LWei1S=eg8k(=tg;ahp4-PtF}{4 z^It!&ZDFkLrTIm??nbQ6K4{vw6Gg6-=iXFA@B_Y1ul#o#Mn3?K~q1bv1=)= zHq#ANJIt)sDKAPYSLx3D}8(Nja3bYUNP#?xLqtp8gM+DC&xh#LJ>r&RMTF$a$ z-P1SnMaZfOVz`ZPk1i%s4RNVB1I_xDb}(Q~&f|<%Nm!179BgDm=Y_I1hvjTIc#RUS z(J{JIp}-1*^B^DU;r+%z?gnenb46zz^E)8)9ustyjOmd|91;||?6iCgGUs%e{pEux zadN1QpTF!Sn8tzPnh1Z8s^Pfl6PzZ}SVy(2rUntbj$o}kx=l48+sJU*^{2qtRvs4^ z6Bz_kA&Jr>coNL^>QV8Uz$Tna~@d zKH`hN2xneLH4Ma!hhuJu{A8SDrt>$f#>DT<8`1EG#|Y6`#<_pb4Ft-}n!Jt*QkJP+ zBU>R1nUSL2ur``p1**@*s^Q{EnD%5|d~rmCwZ2CIRty+GF*Xi650ogq*MCOYNpXc*G++Mv{%_MWU$=+>X&9jpN03#wnxd@F>L^DOqz;_vP-@ z`PTcuupX?5VPO}-{OZB#{K}Me*p(0F9}NSZF+Qkk2kL*6m*Ka)pI}lq&c~^{*nI&^a$I#>o-K!`*-<7VAjW{+a-iWz%qLsmP=Tm=!NyjRkDio;@)`v>ZiHRkD1z=zDFJ0EHI|cmh8UgS7T&5m!x+fMZtV)-l>L| zazFKkgQKU(6Q%}&3vIySWpwFQ6?#}&FLX(_8i^&9`V|`>`1P{@lNqDV*&19}CW_SJ zBK5d9vBoFZ2ocd08tTs())8;^_mWTGU4_qh@A66yl8)nmc?6EMmB}fLH9^R>chC6c zvv7Y21}Pw_(}f)6vKVG)I3wkQ|Wr|IWZ-&ToVM_Rz?^&4;|r(MZr2 zQxuCIewykGv*s{o$2?WIGnY%tMDn4-4hSe6R0*pc^ANKEKV=I)!Op{pih%i?>GZ}` z9dxEvB6O~+PPi3^vt1QKa^GOsdc5m$KGzxD&Hk{5#XsHuy!+_>-lvZq-T(aahYx?| z$vS(-n>x8amw!ztJbZ8;s@ebI^9S(n9LV1Yvis@7z0bP)kM>sRC_Yf691mv8URqEz-f!0ELe7S!H1?fUDX2FTVl<*K*NXRGG0OMBh5XvTZErj`@ zf6XC{TwS;TgdOJ8cSv~Ca3R6X+xJ)@j+i_XSaW`%v`^L|pn$j~`C*BRdB4u$&I{w$ z`NE)Fbjf+s?D-8)GB~uQn2uY?OncT=uD$ijN>t170>xiTP6XO6IwioL#z23j*^QgS zGC4V`ic3&-DJNdMX#@+Xf@;uG2d-DFF(hv^*<8FctH{ySIKz;_dfIY_Qg=eGZQLbD z;u`d2MfY7}K|x4pr)!s4O9FMA0~!yJzgBhCzj>?w zox!0Yqm_qe+5griGg^GVV*$X^XIdWR? zRSq=4s<8mqi7?PPHjwR_1c878I{#Hx6KZ>Hra1nU$@``ajww38p(M4)7wx$Ls#Gob z)uqV-L3QG&Ylt<}i&Ol`Pfo9du-3=R-iyP6^#fZG-PcE~+V2LTQ zL<&30<}n)#L0LO{)tP^ZY$g+KVkA4=k3QHT?22=@xEM;@nw_LC>#G-Vwh4mlej=~! zhe~Tq0#9x^1?Q^I+j6cy+ zdx)bxI0OKy^bv`5(=(BFTL@BhBwM5eXsM#fuc zq7%qxQI0IDZy*@rvPwavLL3qKH7e+=q4y;Wv{aW zk>jT98<5LgzU7_Qy}60aLvWNU=&=|P7r-6?%vmfjOr5NX105Wn4C5e=pC88o9{xCZ z`hx;>CB4IDay0J;ED-AEAUle7sisb9_dm6Im`Wc~h2?(|g5pwUlc>Y%L!N}x8K_J5 z4juJX!eg}Y07{r;o$}7A>i#-7`K9+`QdYP+eXSv}RCAcZ?MX^pgGbMXgM-B_(tMQm z@S9qb@0hlZdxyQ_MJ?fUmWIqH)+V1Z%^=)@R$v-gjlh?wO1@&60I)?Z(Cm~p@S9qZ z@0fNFP_=&~|7Sk#_fz=tWoYrqlueykWu?d}l(Dh1c`ZtZ+jkj1n;6uDAfpR-@?yM; z6>g6xAvUNPwRD!!gvR0o^Ah&37|*_cfX6_@S8EgX`0 z;ZmVwDuT!Y#-pG@+(H3`mU$ZxPN%ktp0`$m6OVskltav&j$Ml(@d!89nH}*UBbiG{ zAFs*_)EA1Xxffr56JsQ38stqqwB`td;0lUKzhBuHr{HZoPERY@KmQ$?71ckx+c(36?=D~pa)eRPq?(Ynh~iuaWB zjjDehF@gWG&ZpGPjtO!>Kf6$(Ta3EU^K>p1uG5?3?(=@{+0oO}?~i^wOf1(HYE-7q zlI>CpA zj@%I<${5NoXPIA~#ZXIICSx<1RJ76-ct#6FUSS@ds$uyCD#NMlX!kZ)ief90Z+U{{(O_FZ22L)n7EpecXTG`5%wB zD98WmRi^O%@8tQvX&}D+DNc4@jUMiQb#S~ldbEP^ctr0Q{1CzFrJqeH-Zwvc0OvxC zku73{5aiz)*Jo)2sT$c~8yYk(dOxaj=N$$3xks-#cRtCk`B6`UhaT(FI{^YgXct6q z3KRAuEKV1g>ke4o3SvF@F+YC=uT>Cj$sX|pAg8a6FZne8LAvYo@?lASz*&>=RbY*PM@I*$sT;k_Y#-rr8%tJ)__x4| zMfHIZp$bhIZzU%wY_HGY6f zi-t6!4Kz*-(-4_|H_xZ1{0xafShg$}-ZsLP1yYSerISVLDh`2>#voEUjPJ9mpw^l+ z><-pRIx$c_Sso3&{todyU;7PC_vUKhXuzfgZ0RwGv>g|p%in*#NGTpMKe430*DVx8 zN{{BBo7P{5X+*ntD{jD536K!6pb`Fe#U@pb>D`h39#!Y_%N#n|T@K4ZMWWo>Py8BH z9%t*9&({}!ECfb-?kW%ohM?3Ena6iY|l&pyX^$DYu*1G@sjbuyB>kX9Ho+p5A zZ4jbs$nQT`En$D4LSXrUPYu)>!XqyNv#}jh3q5*A4%HvIJub#cZ}`gggh;I>p%aE*LkpX>`k&In~6d4SD{!F6UrF zX*I^Li)G=dOKPZ<=`vR!g;t%0BAe?B;7^8&11 zb!_V=h^u0T2T)8a0uorOLlQjy6sDJ~Xd>&ej8SWw_1Tm|-J%F5`9%(ECt(v*zQ2WP&Zc1eFpry}(Z0wkdD5b=0Uo)5Uk*P6tr zRH__I0orNKyC5zXLqruxpZNs9g1}|x0?K<#5zm)gMGs6CwLZ+I**Vh<5tcAS6xbsR zIbD#yxjFvu(c#g_=;6sug7F)V-#h#WoLwIte0*?}9FHDCT*S`~uyrk>J$(E9gT0gF z2yTB1j_|(V_^D)Y$+20b3Udim=`62stz6?)Wh33(T;SbKK_jTL){?h`RN+DRA1ZqX zMiyMIKKA4SB7kwI8Ck0Nl$ZaK_90`OB5Y|kD5m`IU}IsXPw|r22AKTnt)DfZ0JmhO zOD?hrZX=q#%-66NW8~$TF*XC9VDt;yq&9<0Hv?CKp%}MEa>=Ltf9_Bv`HX0!elPaSCoW)Gi6xRu_!=y@W zqIf`MPwa$QiF0~U*$;R)skDx!C6r}LJi?ya3Yr)}~S{8o@ z{UmFpHrN#3wN8OLmIW}Q;F*B4djWkoNcCt-Ue|_U3DcoI?9-78Ma_pBvoLMC&*ub& z2xecie+cTMIINqh>@Cb%w(WnH^N4o-_48DZ!fNS0}j(2L~;|>%UE%3 zASfQ2)D%_Z7kC(#;9rtV+t}oQ8aIDHn8SLK`N9jLc>5Z4W<`jmM*Y^;!8$!J)(Lll zA{5n7F64>B&RoBw$#G7))Gjcfz^)V57a8MfT59V#rm5`^$JC`SZX}0a)4=r>GUwDM ziK$cT9Q>{=kf9HM!k2ueU>s^{=uQb#zyhJBHTDk~F1Sh#OOk0@yOv@iNNImLLuFD> ztBi;CjuJ(ZjnDn56ZGeooxA5kQVG8x5^i=wD-!Z4L+dVQ+n`x8D48z`nI*Ma5tR(A zJCR&JM&nCDBZV=BtCwPuwTacVsH_@%v@4bQdkg&IDWTbEl&$91#Kjpc_c)tBGf8y5%6%F`C>~L_ zqTp*7c6WjgTiPh_DSS3y`(mO$B+NGplTSpa*HTqh8abuO<53Ak5-I#ET1TOI8S?T{ zBt&?x%8TpEvbuU)oN{Vg#sodcYt)u<+E&7sMF~e^Pw!-uQ1l}$2grZ2M@I}$LMOW4 zXF8SpjD@Y$XnZ(5JUgS==Y;qQtrhzr1*V1yX|#2`X{=2gpNna+Q*xLCYkXXz?7cU7 z`0hdS-uU?B@aR)simMpsQ;^feH4dCp*s7f8wAh%Gr*xLZ2oVYw!mRMFE!#9~KY0E{ZLG>SNSc4Y7_6OI5BjzMY~d!p zqJ4Do-r>>LkE=FeT`bcb~H`0CC1?)LWfi?3{N43P%BVhMk$q&s{-L;ttbwpQ%+7*av& zA!MV*axFSgaC+JZ{lbZ8XFP?)N6}m_4ejwIY>Z7?bC(i?n(DV*Eyq&#h>pg-WUd}0 zFGBnH0o+mhm_!oU@&-s}1bdJr8=}xYJiVK6M8sA$X+SQj*UpW(x!Vy~_GZcDqSV+q zm*{nLsB3@dB8aW#?@$acCr}+>q#`RiWxcjj0VtpKY>3bW4>%BH7w(2frG;}FhVu5f z)xW=pF-orPC-_8EG*p(KeYB4;-k^S#Q$8E47n}B7^hgF~3i>4MvO`y|8?=$=7}Cv;-;Ls94Kp4-W6i1RXmh*RiW4RA`u0;3HvyI}3f^5g*4f*4!OXw5WN z)Cb6_0mm(q&m#T-T%Y{9OENJcH{h(O-J*Y`PR1u*w|f zfOKq_U=)L!Bm#_IrAfV6DlSr!YvF%$t5PZ4B|Q3I^zeY3(4=Q;!&vqA4n7#~L1?~% zBWj>*i8tYU3aak#D_;Njz40TejSQ7)zpP&6jM5o?eQxT0@nomBFh&c@?1B~%cQOTg z0!3^B3x9n9J*|rgZ1s?s73wF z{YMYSC-$s|PdVAmj||O2`m6dR*mHhaxLLOZc6>9daU~{AIvr|wB#^M1ujN^ce0Hv5 zY#M|MP*>(urn2qdI0EF^!29M2cps?N}@`b$4WTB1q>Sq@&1dOiM9mGY=fj7kB; z3dQJ?e($SHq6_~j6%y=m#ZgOT^oJUqI1pl|NB2hD@SDTGK#arX@aaN$dUuHmlBi_IT;cB#upsy4EG1EK zYXx8GTHHnWaf@HyZULyt$Q05|RkKqSvz9Ck-Qd9#LnkV zP0OyD348SO^So+uO2U61+?whQLfo>Kihg;kBTz^RLT(fGez?1GXg=pS7++ORpz4ZG z3ZCpTLIrPpX)iUx!&FMG0%>8#~q;gW0Z+{wis%+9J3;pTfz6`g)qSP zVU?TcPVy4kY9*AxW|~z!bC1_18v(#l?U079uqFZiHm7K}%N*@XvLS3`FVFQ*qb+gdu5fU z)<=}cP+!woNj`s|Y52a+l1CJAFRfFtb0zNkq7&Cf+0~Z70PkExV(buZpd6(uG-D;zk3>W7=+op-FeI{s!8>7Mvpd{Y;Klr} z)DQIK{?F=$k#Bap@~0S;};tJMj`Kn)3oEBu$l!oD7>5em3} ztWX#N%@YC^{Fg+4?lV0F5Z}JK4@IXFoDsp0EM91hy{1JSYdhppVgJh4B0`778eNM( z{ln>BKK>jmvJPq1f2(kT1kBQEr_C> zt`9n??>fy3Qeu-H9Z}_wX4nEz4SC&0yB}Pn=4>Wr78mHJlrxKL1pvT^853XQqJ2PpHR)s9M(Vs-3d!<4UiTn9#el^|EgMNL0XlQGL2vC_ns@7>zJTE z`sshC)gd>kGkuk%zc6Lsn+~{=mQ>q`*#P>~-bS~3lY4fyoL zz^~lFp7-b20+N%*g@h!c(TWm$_$cX zO4{`}$Cu748X^W}aDdPkh&=!!BcaGe0N@To#3GCj5UBVb)$xYMaz=W-G8YN9a$OpL%39TT__hMQW*W?xNO@M87Xi9%eec@;x z7Y>tR#>A6yVh!ySOk&pt@@ZLC@E0hvThYaU#%LE9fTP*#%}PTpe-xTE@Z<^5CUl5% zo@q#=wmLKdl+vcsVaK&tfmqET>VtMkWopbu;DvrH--3)Yq&hs1Tf>M2g4JhgwD&)4$#CtjhN`ZPb9uh;r@Vf79M$@-!Ki*REF_dUd_ z?w39dDcTHRONfOH*=K2~zLE8}Tw06Ss=t-Dkp}NI1HrbD&)UrL>vLw)7io4ebDQ!? zYe}0Qy%s+%X>skf_-RRt$I>mYr`%B4|FeiZ0xI@hE(-mNH->FrwrYR0hhuM4#MUX+ zAZutvHy-Ms9cOW)+v0&oz7E>(koE(D=!k8(3?9USS7^_n5mgZkriI}GY!z!0${P$1 z#?+ltxP?rZ*DcnEoXYGeEIzfZ9q>cmlCp2Keoi}a?O3^{NL0i_7qzu9SJwu^=)W_1U}CS zyn}>4F6wlW=U00WzHFdICl#zU1F1i^0KZ7%hS)NLu-%ap77~9a2Ag24W6As#Va*ZL z@8+NV7ceFzYEvdL$|dEFM4^Rlxe>B)HS~2>=j%d26REPx5R|>{+Zf#&I4Rh!yo3xm z;-I6nh~^02Db)wewhE`-cA}^1%ovx^Z5#)C2`PT!?Bk_P8pw(|PzBGS|WRLjSX<<9BOTyiohG}4g z$^oxH(Edo$4raO8IM5e9=+#B6HUQzc)#I;7%IX}jcq>j_l}H)q!7#5$DMFt4hz8YFANcw!qJN|LJZal#H|a^fG| zU+KUjk<&TBl#^CC_8dL`F8svvvILG&^9wPJ{h|;pK%Wq(4-gVS=0U6@6pm1B1s)Q5 za)6z=)!6}q?S6Qmtqd^=29Y_%13gh_HG0GEmC=9iP@nAwRgRFw^8uLcp;vmN7qdR{ zn41S49Ex2IQi0_?&cY%tJpxS8nWdjW7Ywwag!w@>;CDQz-gvrNuT?1bGbtK{7 z(VTx42;`}b0mt*N`Cy!KE+8Yg>heo=$Bmv^tV154hbK+*R%_{FD+>02lLcfK8>o6q z@?1*Two^EduB}Hv*y$v2+utEDcOxm0IF;@f^%XA8&;tYn#4XB-#O*EEEWjZZHy=e| zJVyiH2LcRgKs5OZMYD`oq3Gis*u$aLW88n~$&Qv1gM;pMUa2b--NancM|wD1FXfE4 zzh%ovn;HgG59vWcRb}X^VW6A)PKBuU)54pU0y4l|pqzU{v9t!ByOUF>w*j__yjwT( zG(%c?FTibOM!(Jb51-Jco$VUa!`4{q^1Yw_!~m6RYj%xlSzvyZ6>PS&qDlJdRvdr2 zC^nq6p>WcAP|4h7U|4rPx5Nxu_{)vC?vQceRCmPFdrfjD_tAp9S8_WPvB_zSWxXQx#oYkH*Wv(Ulm8F>@U@}^aH4@wAWtqc|eRIFLa`WL!4E>d00m&Mc^~kwNIB!U~ z$u(jbHYz+9`zJCr#+s}FW$)p+tS-KHp22>2cnAlCEk&T!(wTqSPz6S5 z<0^D4DW`Nd&f3`6Ioc&~fb=q%@J@AJ)Q#EvO1>umVnY3gI%iF%p(VK5baZuE+6cYIlX3uL^5{$)hO@+7K}Ve1;) z8lj^7I3u|1pu%EsES*qCG`xK=NBV~L>$??51wWgwhZRKr3e-NzC$W!a?k3|!G^%eS z^UvxR{JJQsR6~BnWx8kL z)>cgC`BNS@QIyIz^H~^VKYsGKnC1TGPjj@u@STXZh99&ZFUs(yj3un+NHny&uu_`R zG835i0O8e-OU_b33IoIQbk;oU2A*7FaW%tvt(9nv(;a?Lp5k{+O)%v1T}PwusMn=t z&a`oR$|^2&0q%~*MaX{{!}rG13BEC#eRQzGx!_)c6J;9{IRr#;@_9I3j0{|BV|OvtGXu3dMhmPNHDc!EYS5`j*q` zstJ`dTu2WS{whbLJaZ68L-Wf_GmUl7FmQYZSNXmsSGJNusl=w>yIUCrE`}sK#|AUb zg@{G8e3dn-&0&UQ;_l}&tjqWrzNFeDJi-T_%1P4@_~zyir+ccR%x&^X4oE3&k!G7z z)~B$(zIHQ2YW9Cdm_Fy!Q7RU1?4`*f{SH3Aq4S;U5ijdS(6)n|s-N$YdF<)9lm>q1 z4-p`py-fLzO8c4m>E5v7P1)Xzzl-XHP5Qe{|%27#|&#An92faG*tjeK(@aNDnrWKq6B2oz7y35*#g>LI4LisT(iU3TH$18 zSYqYuhtf9JfOaE)806>7QN66ihr6gV^&Wop;v4T_+gOOeJDxsBF;#^_&I%H~d3ZU;Lx@-Hv_fU`?qlKXF=uvM3*P{0bX zD}0}MzYk;3^!|h2#Z<~p`1=Ex!*jf(G`(3qYQ4yi>?KBje*<(2BE*TWq;kT_6CW}u zn+09x`fVHtv>J^gDY0*QoLcSICt9MfcBBD61c}zWHuZio7fte}C(w)) zvD-bKHV=7!>MVcfv$)Xf_`0Xl`<`38@VWIHAD8jBdGFJqecAKs{P7e-jjV z6|@xW@*2r6=DsxS&Z62WKmfVyKPs^1`YpQao52jMk8H#8` z+|JphZEwhGAAQqDXO{mkL+A~Opy7+x4;i|6?T}%M*Y04*L>GkDJ;n8FZ0OtJKZRA? zV(@n|!!D*tPN$(9pQ@ANu@i+SVb`dn1h=k|;1CktZ|iEc2H2;tmM8cH;M#`2z)Fyw z=qIm#@5a{*WJI0Cjc(2*^|>A5vqQ4XCw$ zwcv9Zt+X_6RC`3vc|qePu>=m1VOfc6;skcJdjBmgV!j7{91Jol~{+%W()kIF@_t$HoYkwH0 z)j#pF@~8ZeWJ^!4i;&L?sxd1n2Y2RJjbL$&F|)Lr6tyexIxBAepk7mHSWILqwH+Pwh;+R zs7px~OQdU}Haq_UO@Bm!K`nh^1)BauMA4s6J!gd8Lu!L_@s8Si7yX31>~djo2{Xj` zzWg;;WMP|KUd}nxY@{ICVn9#oE=!u3HFxrNJvGPIYII#BsQHlw9B6BEnsa+m zzd99vPeq%guv@fxo>k|o)owwj%5BxFiF4Utw(A^h+(Xr)=SIf|qkRzZiWJQOxN5lo zSZjAyDhm9FC`L1wg27*ZFK^kK{k%Q}U-WEI>_2C0h_u1?0i_T6^EEOQ;OX~pfBUO< z4v)SX9eud=1&)OtwRiax7x*SS;w6or?}h4lAC=jDYk#RMxc!zo{WNs;L&+ifTkrGU zp_dC(B5PQ7bfq{H8I(!BHMKLea39ngymn6o)Nu}L)QP~V-Dg&R+@2c(fMNbh|UVFU?LjdC%=hb^Y zE+CYL)1m%g0LDacfwv%uw~h{qVQgeTor{c)sIyBr!6d1j&GU<7KvytZ=@w3)+v(PZ zcl=b$8lg_1PqS=)`fZ)kn>t?g;D3`z!LbYoB-hbw8FXg#HJm+>|7yhx0>IQsqxBrA zdk%Ul&D!%@GasVOT9Zz#4I{NRbtTnThIlP(3cs(A z5!A%tR-ldMoTJLf&3LVoqmTAZJ~}$!s^SbH^?zw=oiq&Yw?tvAiMH)piH|IcKXPB1J~WTxw`tw7g{KB`V6G7XOjCY;UycX+b)HY19S-?wyEu}q9m3B6 zva{+^uI>Dq+gcNjUNQvH&@+8gd3tPi4=J-uyzPLIvL7P`YYJkiaVscYc z=@SZ;Gw@Ls4p0=r^n4VP80uB^X*(1{&rC^X9{Jq)0U@xR?T?+bV7VTjv7nHqtJ_Xi z$mzUtzl=T^?H!vcRW_|Dk{xXXcpm_N1qycbu`^4&UE=OmKj4}j7tF3;nX!e$gz3G3u{AS{4w(R}GOKQ(Q-Scsmp(Sp#k1&Z!~<8#m3uu{6n zY5xWg`x5+W46cacF^i%vy>WxD(*GKyPhfk{8#V8wX5Hkr+?cy?L76)N?P7g@9k@D* zmb18*xuoIRjo@C!5e>ub`Rkg(6`4Uwxi5CmT0uTRNE){Y;7L)PR^S^3d-tj;xEEjt z;UFXX{yHHWnAFe&7Pr3)xyfENFX~P;o19>s>b_GI=b-%^YVMWQ_xY?-RlkUvjNHme z^AlJB=fr2|Vh10&EtHg1PH_r<9IzjtnOX*R?O{1J&879oYlkw?a+rD|HHKlL`tHC8 zvO8`0{n0{Yw=;d{Us-OkQqh%Qp{Pf!*s5mF$;vkFYfIykl@Q%!y!V<^h*Mpl_B8%1 zpQRIEZzIiW(Ft%bW7^imo`So(G1Wtr=LZJ5K3OqXhYkv8ZG4=^wR$yw-<0HG-VPtd zQK^3E5XOZfrz@3!;NPOs7@ z(TkEdP*%Cgot}v5tk&0W((sp_SB}dc83dC*YaJ#=E9!4sn_A$1QfDw2=rjA|0oT_r z8(%&TFQ2u_Pf|s{K$VRzx6+r;1A@D~p@i$JhBZ_I*evj8M=|IFk1X2&2bb4^KGGNa z4jam&FMRRIX?7ujUpZ*5MmOpl_lv)N1jk;`F0WJkTfP3y2cx5dy~7U$w( zYZ;XcoC?+s(vKN`EUwP;D$S@}S`*PtLo4o~3uu^Z>GN{i-5)T(?j1U9`=Bv<2X`Z0 z>Ygn+krLROx^hiHfmhoX4m7;_&M@4YdUK9Zl2_Xq3cS4fz7W`(x&nL0)pi6zMYp=q zA@hB4#${r6ZtOQz4fYmrb63T#XpcEydEXvUqXD&L6hpp$>9xaOy1+&8J}@xpJ!f1b z9thB(gGsY(b^%6Uy!N_=jdLO)73sr|uBsZOP-;=JQPPc@hy=;@ArY#tl0X1=GkIkH z`ViRF4tFMz0NzX_MZfPwCAC;7nFMhOoeOv)CHygLPU;^?NWhatKRubeH6}VO5S{)l+}> z2Mq$8z59aL@jN3>ma4$}D&O~vftVb^wn-}8875)RJ^AkY=;>C`rHJ}`MEn491~GK- z7AJx*!BFLW8Y)FhkL|G`$ZT!hl72p*f3kP%&&|_+u%F?M{~?S!=tc-dGXi>dT)6-jlFw@aMj_JvLg*C2PWpDS|!yQa7*{a#9l zL>yIr?{eLK!XUtdNdB~6q}Occ{?QVmEx7`spWCHG%VVGBkW2`mkqSe>UWfrUo~)v3 z6#^|@gBYOtq0{{i-9s>cq?W;ZwdHgS*7%2N81y1<7bEW0DvAYhwrLba>5CE7wq#J%uNzhSJNIOLOy?cDtlO!71 zw0t7sKRib?EmAgLuLgECW4z`B(KrBqeSYZGM&({UJvccua%LU5q3_MPyZ_M<^s7DV z?*4U-JtvU1?7NG{oGWG9r8?XMzgK}(ufi-^h_-_3r%86v4Dj^0&cAv%$!8?EDZV~` zu5*}H-@%GmWizRWx&F@1xP`Mb&|2_|WA&Y#aaT3(+POo=@yS?2?Ewy=hqkYGi}Go9 zo>f&^Lhe4+h597N@@@6R!4K%2iD^I!MAg~^v6eB{uRovxB#RLtQf?sm!}1q%{54Hr ztf?*}4(7K7$|_%ZamLn+Sxzq`F~4eme%{D@45E&sbD0s38Beuz;$u%hzsYd*n^zoV zlkb=xAB{#wC&$0)kn)o(X_ca2lywp$tOF}hH9tq`$%G_LtxO`bTyo|6ax9bh0L|_Y zdt)0%DYyIg%&}~9<64Ck1v4Vwmk+tlhWwZ2LZ)7?k3R?U z^NFPa#RMi9`A&}CIT@ZFjE)Wt>n~3nLnrb5UyMIKI(!#FAJLD~qxas&Upw^co#Fn6 z=tNCF-aS1boG-(VUt>x2Cvks&xycRu&b{FR?6H0$Cm;#Tq@UHr+bepf%yB8dgomC# zPTk_O$Junw!6oSDIIX_ZpO1NIqYn|%t62y&OC57FoTtuAhk(Nlp$Ml_b69a~<7Ki9 zhuKxrs@sZ7Ldcav5xN|b;skVT&sV&h2!LHpSk0xf)PYi=$TS7PFzUvCe%BSgIkK1j zD9IE#qZC)CvM6pVn1C<5 z`dl16cLGwL@*WO^ZH+eGQ>QXqtng|;`I zPMs}%*#*MigYz?pUII^lN{YMD@Kq)jKQgQb&#W1+)R}}L(8?#kn-^YxJpOcN>;04Q z3yf75@CcgUU33?H;8sR{I(+BhpL z=6j@cB)Im>h1vzh<($lzs(L!(eBFK5uPd8X7tVX*K{f_=NfBp%_ zStS62W(6NSsmr4@>b?)W!=Z@$aX|e(+PwM_c40%2u`bUe^&xzSP4K2y@3Tvq}^uXA3tTd zwJ20w^9szTJh}q%C9i@d`o{{FwjW^uD=)()LEBR037)Gl97&Px=nyNlA_0Eiq-W0T z#Q2?+v1=;Nuyw| z0jY4|tv5$Qlb*z0yZF&8Ih4^B#tT%_J)!L%A+VtDcAf< z&`uiy6F6FH=^vA%t(pnX5v;foeO!X-jJ~7;rQt_^Ro^MsYr{s@UHx`yPQs;|c~##8rura{>fp(# zY_j}+p}-D!*4z^{+vSgmbKKbQ3x2oxq?eY|%I>}Dn0gr6(s@p8FGY55hg)W&>)9L*zi?;#Ea5T-hbiI`%p-w{6h;r ze&Llz??@s4z%qWp-|wv`6Npq1@#+x61(Fbd7M6DWC~%s{F3`g-E#9x4c18AWX#Ku# zgGmzDeI%`K&-qrC{VVXIhci{W`A*=Uls2&WbY6hSK{BYk>Nl-a5CG{r5S2z`Q}*ZD z4BKA3*;nru-#+1M_3L7m^fRw`=sW`AW*QG3l!gT$wW2)_K?Cw*IYUD61gr3#g`k~( zZ$9O1_V6HD{E;NihNk_+mc~JQK(`EG6CrM6MAt)Vjd;(|z;y;_0>>SxoUnL{3s%K9%36(7p8nj;t3$jX7hMnV@_yJu$0p`3 zXL8icv0R7y>|mzPC=6V#x9eOWgK0Y^`QG7w9sL5cpspxR)K$%uUwGrp2ffvQX@=)V z=K_RS>ym-9k+2Jf(t3nRjeOc|o3;wJ=U2k7 zrkdyr1=B)M4)TLEh?bByMD*a>hQvwRxY zVhNj3lT|C&Xka@di8ktGhP0)6-kGe(axr906v27iQbg>PLO)7Mw1_S?J~=qqN&~Fp<&iJ^~m-+kZ48UYE_y(+MxDMk$u`ip9EHAyMrJClue3$@eED7h9Zb}O^hE~D8jlDP*AE1Au=-hnU!&H zRBG~885lE%5lPp7zyNUj*hJCFgTq^}75E=T8kW(5TIVTS*6!(a$nQL})+5_leGS-m z=9{Bhi=p+TR<9$KuYpOr0QD|8s`{P9@aSwGuSlQSAD+H<@@sqkcW%1A^^kQv1xn>T zh@4ZjVa)j^cFN9Q^1OrVJ@fc*G#b7K4;&_W#UVWDiNalfHOp=QY2Sl5>=89;S)y8i z3LjT`-Nk!e{!RyP{6}X8O5~3gThIDz2=+h>2?Oy_k%FiH(Uf@YPV^_VIc+&f_|FOb zR}BQ5PP=5JxaIhj%RkF7psDyvCpg%MP%QXLlQ>qP+kT zV7SJACC2T4{Rx;kRsRjCqYj9|7QCMdlekD7mfN&+vYyFc45%MDgzw+Hk7P=G0Lom@re2GV9f zX8eeMN@$eUd__hVB05^$1M_gtjt&+?Okk?u0dLvp6(biuv5H=h+#>XgIV^3&&7q2$ ze2tr&i5>bJx7doqrcy_(`;W>MINsLtm-q4VPW-8rykCoCD~K;6~g72*k9h($wc{o z6a7J%ihr$@YT6T-jpn_<5JqEo4Y}VQ3<1r@{QMaPX$gj4!moUMGCCTA1J>}Jj}BJ~ zj?fw`fl1)E=v!O-E9xCBp%L=HU`wxWifYyt_28R1eZIq2+|P*!ukFD-QyG46&*g!~ z@Lag;V|ZrbL!QHPyW!{X%KrY(;h8G_l+IzyN{E+^2PFHfQpNw&d0U{Z*eCOU^11!V zd~iK_>PfDK_J8xGJC|(4txw9iu;+70?&lxzQj*CC9uaWEftQk8xYAq6MFtXlJV-By z_>cO$Fu%~NN#jx|G&}oV{$L()DdDj;VqR`BMElDvE>kS_h9Gf1?>R7fOl^?sLA3K# z`~npd?~e85l?$y-){I_zB-^xqqO>1%FKu6CF{|2MWtq-)$WNJ&MZ>{(U4rLkj zMt58?h&YU_N0q0MlEjj3nC7r=MTe7T>N~`ZR!PNWE$GIO1{&gj^=6IDJ-}j@mcu5y4okPq{wUemM9QQF>Cv#_<8k-ZD;=>= z*g#&9svOqFJ5f}RPfmc5E%I`e!d09qPlJ+caC*E$+f%KJML}NC7jh(PGzykePbsh=H`_+I6ZlMSU;VE z@(HMljIn41n@{57AzWT@1xylun@&7<6SW(G37&I83oxe>{*~Dk@phn&je-TtM0s3> z;a`Mnq|Q)Er8Top6rjNV)Ln#Oh^$v$stA2Ivxb$c#<$RarCS=)2+WEVcQuN|Zfo4{ zdjb{O*a&}{24rH77gXQ)i-o&N*fpsi>(L)9tUp|=!>L9&S2g6>Tm43e=1sADl6}vse%6VeK_H$ ziKwS6+g@_iSJeBs^j5E}JhGSCxz}}j-CQwf_th1{h4=RYvFznlZAnP=ZcBnB!3?^w zBINthR)pYdJAmdQJ%QFKR2S(gCmo?9Q~AMDYxRSFJVj}iJoo#a3#AaI{XI)hU}5w- zXZ3?tYiT2hLW}N1%bPvlrN-Z+C0!^9(PQUyLZAfcKdaBP@PG^{uVp z1f23|VE7st_9uLpB7V5Ajma~9byUS9ksKsIEUf*}r?iVEcS5LY&`?kT-Ve42Yq)%WvsQeqgw>>G-DmuzjR%s>6*JLz-^tsmWhx4_qfB>4&>xd5`1?C!5d`zNPI z$M1c0kf)E54?cd6_YmGmqv(ofYIso+>7v)wD&4Mn_8V$&qMp7yP`Yb^BbeyL4Rjj! zYj?P7JD<~YGj^mTap3^*VvLFcy<)F*^s@wi<#5N2uG~545ajYbzmj_!&I|Etyl@C0 z|0C72aunwh$;#pf?svwCwOMsvmT>YR@f)E2%^h}ln$2e=`n#myuFH^0U&1(#v&+=O ziIs1&X$nG}Q8m71V)UA`t418<-2I}o*ky(M2FD1{z|he{g~=TlM0s^XdRRv>M)YNW zCQMtn7SHfR;v9&8ADC+HI>)1`6eU%bsuI;QQ6s8c16#)06Bu{`yvkAtNK|_51O9AU z%}aLu5JK3e10xsR-blFYD|S@@m5HjYHNXD6MpVz2Dk0@@+b@wMEhy24mg}*+ZuhZXQQ5Jc~q- zCOMq_F{4r-?ivnV=vs0O6( zL1#ZQZ&@%E8tr60S(6@I6=>=5+YX+d3Xilfra6avkt5>s3>8eu{7YCV;6FEL(ShP3 zWz9JFJRR!5(Jt^Bb3UW(mQH2L1N#6P1X*stRp-Rfb^aY4{ZO7b)M7N%?>Mz;wIa74 zz0_d$2_9_|3xPv+epN!$)>Z|7Qy`mcZILj`Z{l5=*+Ahi z@?y_D5$D0GFzd7s#mi7S6LfZ&wpVf5eH1@5a4zQ8z$l6wLkZGnEPK55kvXM1I)K%< zPnQUl&Scdms%*=mU^pO6b%VRF^D7dQd@7D0BT5U1G5p{aU2F_9w#JA-!~o!uzJsA@ z!FCp#N@j$7y3$n65#9|amV)w1O!fbjgeTJ8d`y(ZoPAan)VutZs*@z!vTLA zh4wWZE%vy!+$DjQhbH@$`--;567#_O8&549H8r$4v(4+Usp+})9R${&!0CACR! z>Ey;#Xwf!D0H>s;H^m%rO3I`Q*+ocwzQ;J9SCx-aEnUFo>Zvk+LoJM&DuG}07>nJH zZ~|iU)+7e=MP{P2Fz`!hsL&QbOd_9A6fqu@{h^cZ^%Fjk0rfMLf$#gJ9sKb_wG*RXKMFZevU5Fk!e)B{EkM|VCR59ZaTq~Eb@M95%YL^wSFV5!C-h`roJ;m(&w~)VaU|cA7$Z|oqq-ET@Q-*aNvHL80Mi=F&3n&$4sPGQS_e&v`F=-!S&8V zcOVB8xWZg+Y+zyZ%=Y#ps2xW;+pQDS@_x|biziR6b*h3nGH8 zFk;h!LK<*e=aGU!#RUnl{|rmLzGuNbdD&RIU_G3F^7>bjJTV@bUNHS)B1+s3)Z9*^ z%K}GQ5AWzz6WBpFc5by(Tr`URqg8|cLUyVu%!1MRu~AYn_d##l&RLFD($8Qpo(19{$EG0Ry3M0}WEP$G}(2{YQ@R(M#> zg%Ff7q3W40!1L*hQtif(INK=y85H^fw9tpRo?Un3)aMPH*_E~Km~`bN=RozSNjc(y zocEaRSsK~xSu{xD{aAjD$AX)UnHgoA!nc}#m!K=BayC{ICB6K1j^0Fw4D2ilCXf;| zcR+AASL>HIF>OIDbeOe9Cj9)iz|DO&C&b5FjHN@ixW`UaedhS@_rV9roE6G`w z+v;Ag-xczN0d!VD6&Ocj=SKF|ci>%#NBL3nNFAzqJ(i#g0wmN!C-Gb|2c%okj>OZj zeQR>|)y?Q*x7-p}pFmJ+8U)p4csDeEFql?6J)N`^^IZT4gzih@(lB5>FKM##VRectL@rkqZ^F=&Z+-QD)rda7 z2b5J`eFb;IUw!paaS10E*xDp3NyC$VN_k3GGgw6=gBtb#=aZh6%xgMES!NxOW%*I_ z#5YvmMXyfHbY_iKw@{2$55tIJl!Q=dsp4p}G$+OR9QY>Nt{uVdI(x`NfVho#WLhgp zNmHWUa8;m&>#;MDCBAt_D7(CWSn4rd701}qQ&!m*vFj9_3Q3ENv%t^r$koS2>luzF zFB(Y$KAlf;bXF5hP}%r6+F$N)^2q733tEL66J26ON;+n`RNK}CBAX~jjb4EH5a5~e z!m26>M(}<UJ6~`k?pMm zj-GE4&x!0_~1{E4O$EQxZcP<3p=MDa_oviAIu@x z)eG;WWijnn;Y(P5D)0gPdT=$H-R{2lBIu3zO_gLRxR@p7{KcCLW1A(nSGRA^_g;E^ z=Z#H8h#j*iqsY~N6GL)X^txmm7=b`!06x`$qUd!1Oub+DGVzbxnYrMht>;+QlWdKY{G{p;^wTrl;~xb$XyCL zPI9yI{K9%pa@j__D51#9+w_}>;~Y=oTFLg=SzT|TNTNM|sKEH62;vMP?$b=4SnSXj zOy9tt+HlDMkU@oqSmx!&#~%%k4+$HPH$`*`XkUEnpL{$%JpEc;e4H1zu;K*Z-#b0| ze22W z$yeXzAtG96cVgY_ZQFikWZ80Yk1Jz} zgLbwzxbHzJ7``ww_~u!rmio(@9f1SB;by-zVA}UZMD3{d@U0UjWc7&D-+DhwLv%=b>T}#9bRG&@lxQEX;0{n zvXpOrM2_^u;mkR#(g8SuA%m|*^ZDuFqR57S(avV}YF*R|U$HxW1meqJoCt=pHS%0v z+q~!aUQe&yrP-U5{2jB(`0XmRx3osAX4tXRVkzw{3&z7iY2(w}##31=V8crRci+=z zvH>gTOR4vDU9nSk_#mKKi~Rf*1JuobcJ5&t=hx42d~n)xva%0IA9ge3iW8PAuV>0K zt{#(?0hgS%T*;9O{$K*IE+-pnp1jtxNGWWcz&1Xb0{4+9hFp0XuS2r_xkmy7<09i^F;Uc4tw&L}TBnL~Owm)n)1{Mo6$EEu zs!nL`G?WJ>dZT2uy*A-%?0ZXz12K1PoZG9=VI4MR4Od^O)BfTmu zw^DUGC9=S&*s@4gSz5wS=NB|@)SZxpTIT}kI5uTas=0DWP3yGMcs$a7=>Jka?Jv7L zk}cx9cDe1f_O9T)0R9pE25Au@`DA)>aY4}-%egM5ft&Rt>dVUJ=`lCs^2RBS_PG3> zSq2oYl?#nLc`ZFSx^O78aXGvW5Ty?owk2)VKXLHnY(F%B3bO7&?9G#9hElo{8cqdS z+mMpB7OyVPdhUCW_vej&IBB%Ncq_mkHrfwl*D}ID9SMkn0z6a@uGp?m)z{za6^p33#(n{B;?5r>{lqc zxNZMUpPF=P`FcmLjsv)T;s^{B!>Y|o0Y2V=7L^!P?5(8HvhMX)SZaY#ss=8FuJk*f z_Z*mewmtv9o6&bOOUX!kf2_P%IT2%FsX-68lmwbL!Vm!23)Bq=i5^O_FPn@A1`y}N zKsX@n-v0&e@2Kv7K{`uYdVdCOvMb2DaLU4I^#$DVAbHn(m6SU22{L>SF_DJk?rcBT z6=-{`D}YQy3#b;D3JjA~=N6nk`GD#Wx~P}PD`5{-M$Tf^?>>6WLEb{Td~T_r(J^EF zKou+wKaQqm=f`A7${og|f6|=7rc<#JY%(a}fU-z4%IZshMQxJ$l8+;3+Uq(ONM6a5 zr!#1dG^me0IXYr=onK^R{mQW$>mH~@GL9f~yevqPgsF+zh|v?$E+F)v>IYbFjr#%P zTi2=|s66;$U;zi_q283iftwN=t6ncl8m`QAW1?8@?f939p1IYhUd@O5>VmTB>^3yd zKYOxCHs0HRoshK(T?Td`^~+THEG;Pjl2p;8UXf&23!*SnjiyUytG>$7-&9*2d6|N~ zs32>1J30N>5bbq?JRiNX-5=wEk{+lP_Icj%wdCgAs8!5!l!{G};IED6YIA0yrU_pp zAh7@F;LCnY{hDxtH5EeRK`ZT1v@sBxu=Wx>;70R*o2JRQnZN+Zdv1wb!U;S!Vz=cT z{js?#+g3AhyEGBewbQIA8yoQN{>kto3R8Xd@!|3Cqw(kP5tFIC@XB_4zcdn()wvye zFFNk8DNs-`2q(**;m?BB&LM3f$+jG@0N9ukb)tHuQ#YtxL4WK~BdAUK)U}3^{OnOv zZ5R4~V;@@4HdSjU>Hv2vA!$dy^s4KSs2_TmKMQ^LmbU}kinfziICp#>4c%B`-i#hm z)s+<7ZuHsk^cV#3X*giPD@_U?n@{I>)F3gH-#s0|3%&iLgF`%Ulnl@HH0FJ!gy5xc zyVR2HBsUjR3*vCFfAY!cIC?xh9Ul!pIy@kM+y_Ua$48?P{HiZ(^F^%0r=zc?pW~e? zhjUgR;@y6l(9G4BwmX$sAKrJbK?12OkeRy=6C7vQRbx0eIZKN}J>qyaqJxfS3il3L zUfnxx?ke&~_^wsMt?@y2?Xp@FQqbI2F#m8QXTjBA?anHbkF(p#^o}dN- z7DHHvi*iA;|vP%LF4XlW& zk{Pg%RsSAX^=Gt{@U%$gs6hrY?i6;h9`?8)S7Oq(D}Bk2Q*mYY;sy_wG1d=1v|pq< zAE(uK{q!6{BCU1JXK>|$jfr4?>Z=k%S|K>s14pNIvq%-sT_MEf*gEEJT|v-u4f%!O zt&`jbh`Z&6g zkEq%8cp3lLzo%ZdI@#01QS?y7>T64dGO{1(I|(BeI+yh5-&CY?f3B;TwHCL?O0<{C zL+}-BkKXfsp~jX2Uo^FU%FcHU^WDsNxuTLuuRyQrw5I{>cYaz=hGk}cqo=3h)16`kJVT)ZFbQcyzgyBCuj7;iX=p9)K8h7tG(2pv$ant0|miv#TYaG7=T}aLCQERzHuBBsi zlr|hSCCXF3#B$XZTE6;4p^8D?DumAnTdZvGON9x3iRE#B5TpaW&u6O@Ad)kJ7;{i1 z+JjR79tH(4r8*QAg}t^^ako(PtpTFQESSY6V`X9WtM<^aRzdCMC}_Iz$-xO+trg{W zb)^4&&aegTNAJup1*|cTgay0K@DDb70JFbZ!x_zmH^h2SJkkn*ziq$$sq0^H8}58< zYbqW7&9_T`r>!Q035}lTnh~1V4tv}f+Sm?XZ1@u^A7a0|`bpspiN87veq*wXFJ~>2 z#i%O}Qb1I1DTtO^?Pbx}DPwe*g`;mCkcZHlHde`5Xm8^93QvJoojRV9PhSqQ#JwFqMXF}N9Ue{!_#qQ_&f?+7n-!6+8;)vye+e|y8 zmkM>IBf}dfA{~+99>I6rG zGB6MbV46S!ZNnsi4zKB`ww!3{SV6K0feF8zeQ3Q}oi3IVCloM`*1Fr>+uPgQ+q>I; zyAwPo*^hYyQJ#nNlFD{nsuz!)jYC@1XDX?-FD!pK4#l@i(x*{BuNr#80EFXk$}YPYy8 zlP=W#_D8JQG?iZ{(JUUt86HJs(^OD@b1jA#Kf^Yg3OZOVcqXn*D{lL*3Dft;$Ih`t zDt(O(k{gtak?>R47H`K5VRvinbZ!k&FGa4kvk8qb{e2wq?cjQw>O}w8C{oSPe`+>V zNbK&WN;0+QD+OE`w+NIcMY{jEej?!oT}D(tlatpdxn8as4j(QmwNs#N1snB$^oUp( zNJJOLr*4%XLr&kQC{@p2;samST3rTjChd)Q)316z3yrdpVGo^q$;~?p61DT@7G=zl z+>-b_%Iztg9_tk!a-~`S8_m*j$a6SF)y6la?L68$(t|2=PUYRro>_0Y#zIlg`uaDR z4NIl{oyls*w)rd%D$PCO#YjGX7Z*|gor4$NCEs-9x?KZ9vTSQ!2x+U9)XK74!?N7& zm^C4FyQ>jvrBJVcLM>~k!gb(X9;n`Zg@-Aru68Gy-N}pF?%b|HKWo>=Dn-!|*T%{R z)wwmLy9aIqX+gQ)4oE@QhRG?ddjWovLSZ zS{$-jd^o4s37k&nzkd9tEM$dTcw7Kr8XXq^xMs%%0I6+ECe*h=Cf5E~h4j~f2D9fN}W}bHN-jZ3fDPKCIq}^##BU}&8;STUGl|xY?vP?RNOp zHPu#Y zb%SG2-t^%$0>02Oe;pYUT`T{hpjLbWx|`S zY?Rmi7cO{TZ;_l^s?>=XMO_EY@gh>2Ie3z>pgdLz)sC_ucn4O^arMhjLYw3?nx2G% zI2m_?u3H}<<(9b?tjp7-(O5J}#8vKjGUm$i(yNoEf1B2;k)4y&tCf_S7F-Ie zYN^_7Y?vxA@`6ra({DhkVV7|9pt?uY=!}bQN7|hjkR4JD@wV>3K=d<-j)I`d53SMW&d6+ z!>PGR(wU7pe+<~*L6Dlwf}P#Nql5h)%;umS9Bv^HaVc8`-2MJjjuN%nb={;oKZyv| zdP!}3CZh6BdQ5M;-h9`$#4@9`pQN-S(rCs4&HnH7gxVa$xsw5k#M*v%lHF;C;H~UX z|35~i+w^~mV2A&PR;~1@kv>g^x9{iZHg(y^zp6fte;xYVcUcA5TrpmUVy=oWE(qP{ z!wx?=q0BNuF&2$M?IN${1Lt+eU;MkZZ8-xkPL1o^up`bFZVJ4Q)^I!2k@3DMdL+Rc|^YA1dywrg9 z2>$;uf1SiRKk%!&2s4g1;r-Nj7#c#jWkhIHITjjz+6(WENx^L0)2*Ljlt6=ROI7@R zkNv7c2{lJ9I>wKCKkh%>ef~xNaMw@IL(4rduTbz<_V@AN!QKQvx)tk-IjF94gLz|< zxdfxxMiL6S zo{juJSV`ATEVUqKe02x%^Hz*N+E6c8VXret-1;i}1KNM|_d2Y52Ql~I=d;@kk z!wuPGe0bp z+b8m{a%M!~j#&*WXB0j2TFKB*2#VEd{W76>oNHO3sT!C{Y;yr>Z;c2%v8iq2JGBy_ z0ftJp3-mOEOw6Z009H{n2-Y83YoRq}yG|KUZ3=}Dhe|lw+v&}JBN6qeoJy%ff2ECM zam7eleV`7m<>}Lu&LtPp`(Rj3a${s_8hzn$Zp}ae)a8lV`?Cz9$WF%${8jNo{q=Sn zQsG&AD52&$fm#XuY2Z1ngraqmUu6V0q{&oR0X5Y#zPZXq6y(L-5qA42H11pZ)>}hx znyj|TTW}ltc(kJ!4sivkQF1pae+;W>)nHZY6MH;bYbXU+Wve2!b0M}&4H@-I&E^;x z()q=;ULf1o&S1zr(k<{WGzsP2=!_r;#unGXR{Hi{A|B%mc&{wko|RndF}iRvUhQ$Z z@Of5a^=hncJ60E}v+VKOj>ttJO-AJc^tMLkg8cPHXM=pbF}g+)A~$!@e@JQR5UGnr zB52L}3m?{=3-&q#e^8N<`Lvjtjs&jn2n3FFZGyqKIag1K_0y~MHI73NEXj3{A{5Ni z@9LB75U8TQb7ulyf;tqau=w1i+JL6y z8-dlBwO|9RS{MEw5bSWR)2rdHcNNd57!577L&PzS%__3cRGLrRo=|RuN?}DC6}aqq zTQj?Q4BWihQ?{>w!?ReOICiwF0kdMqRUsoR!$F{CsOry$}&m+|$3 zI}XJ`b$*^~kfN8f)2#dj#O(TU6L#H8nixwW?gUdm?Ha69xYfQ?xzb9$w?N9l?;*7wbswd@^a~VGW_y$LDS5WG22#T zz2Lpg-hyyza8n@Gm^=~34|4Z+@GrkVC%x<+bLfPDC3|#2cIDEoT)LG@cLOJ8<R$=Qw zj#lwL&_Cg+!kNEiFFf|gf{}}l>Re&3>+y@Pv0wRvD}Qk15B?+m;K~zh?mMkK!IdZY zpIG7xUO~61#)&zk7liRn0Z^Bh-Msi-Q@3Tpe@WP-B$oq2N;wjCD&ZQut&ERVeauNk zLT7Vxi~j3Sx(3-#9;LG^cg`Yo-r9T+jygTQd3H2T)2u6{zVqG(o11HEMFEp1$)qLz z2b-V)T`qb310W@|5TYF|AXLx+rjRVNLsYE<7%U7sTb(dODEUo=);;yMe-;C&sCZTb zf9`AuMqm?zX$tK_@lDqX@+|IR0dh8o$;F$YO484Q8Q^6SpI^a=L`fZ^wtfZW1mA;~ z9$$pPV|@F=#!@Mr7coR^!R-pulez9661@&r&0G%{Y>NsP7n_vIfxh7)Y$5A(iq4FIgJkCUYCFr^^9&2bQf&rSDvDfSo#j)ye-|Zzr|rUy8HtpxdQ%;kWJ_ez;UG)Srf6-)vxsS) zL^Gl0x=*4m`ZoTnE0(JwX!(T zj*10y?myR& zqvm~9H!00vLfsJ9ElA$5wT(jN+$Q0~{r-J&9=v<#_!n0BiwoKTuTYTED&;9j^;g{1 zH&EDGE(kDCA0+NRI{QoYJaV&WbI)V6zZgHrR~7FIZVb^hbY6HUf89OTuzb{YZ_yee zuVql8#4>0Jj(bvRX4DhSa-=KS{;F%f<)$Xl zK~NrSf&-`mun7X#V188Nz)O38;h4{B#G@Bo3PZ`h-^0Hwj&*<+;@l53`d$ze2eN(T zluc}~xExA!%w!WBfA#a4ms6u|ZEy%Kdg2Ju;)p!fK^Eoo9CnHieUHb<5I>?M19y6Yf6t!m;f8OX24`7}@2BUQ z7mTv>6r3e=M{yAe$k4mOR6^l&(ku~J!Q#F<k%7{ADpT!mQ7>H_2}AlB?0Kq}_UiKlp2FVG6@;S8G+p(wm{m?u4QHMNwjXA562 zb9g;<(8qR;54zE z1~H=<%%k0%?;h_SkOWzx4E($b-3$IiC9(n(@%dNT=6j40ht!b4<^`(cbT*ErX~yS< z2Y7*fj;1`H;s}&b-^!p1|9#+Mh0kSkcT@D4=cewR5<;~I|I~<*+BC8p}7g# ze_87gr6&rqc*9j9ixY-58veYfJ#W~ROYgb#*2)^Y0G9NYRHzIn2eom?E~jrL`7TNj zx`^l))am#bgcA|N;V>pk2crkGT0%y)n6D$`t5eF-8>c%x!v}XO^#>eP`20_9AdPy* zKQ8ZHIp$@HjN$inRl_XneK%j^yjnF7f391m&@<#5#qfh#y)gBWRwrX>w5ha=!YyAy z15$D|`Tov6pe0~npgE3lzu)q8~5?qCt*KPJLeb>fQsRc;USfau$`YZh;0oSz%w!hlEQU|pe*li@mYqU+i zRfl;rslr$T?HJ?+vZ1LAb%%T8e^u=CkNN?9WAJI6VD=}JP0mMGLG32`pPEsAQrA(* zIaCODWk4ILZsNqJ9ZG0bwGQrj1lj1h6e;}%Br(N9mh!Gg8WTK}&8;Ig7qe=e%w4=~ zCq6uxO^50EBoNn;fcnGXmuXg%8?3b^I*qdF>})wCA?$5AguYG2DXhmwe?uXsgGC!M zH>W@dHzRR)l3J-?0urb=ZBu-f6OC-d3pGKEz(G0~%rcpuVmgdIGa8YPQ=D3-057^J zHyLN~X$rH3X6p#XG82PTa-Bg|35eCPMwrvY_@YaL|yaH-QEsgi1k`+7UV(uf;$OB_Ht|)ei1J3R+~(0X=wq8{k))CU#j|b7-9J`y69b5 z!TOr@q@5_6;kh+Kf2REWaJRox(9}LmGrRiLA1R{Zb+NMIbi)4_m6vl$(4O}K&82C=N(0Ne*iYSYgj>C!DpIk*l zdDkgQA=)jOo$&o;4wdpjkH*@{g8b7Vrs}G*V4bPjW;{Bcwr)niSw=Go8QYAS>1jm; zXwr%TW?NA+m(YqpWqGX##2U6@X{-bnAG!9fG)_~@u6n5QUAtmuW(~_^XFv~ zK1o40(`T&w;Be$b+?2xrAghj zFPNQx!&x?p1{6Vc1d$pXjS&Pe0QaBnbb9>z@KOKq3I_kfr&CTb}e3 zf2p|(@Cih0N#z@sS8_%ib(I^g1usBwLVRRb7LAH=guPxR_0$epy z5JcU@Ew+jqi>`S!V1UVH6S%v-j{Tc)FU;#N{V@-LY9l;dSE_ zzG;ZHBPhBYA(HbMVvnhUB#88LZJ^|If7ce_9;H(Z*5ae$(TluW0~7wf7QB5m#Kl60 zKi1SNc=`B5<01rB1}!^b5g->zCq_7Af4CWZ;>?e(*^zjEg|=K^ONhdKCl{w_7T4(UF?Wf#)K9g@h+9QcsJ zg^N>LTkGpT#QFMq@J{dqLUt23xxZKXcr-hWCh+|ZnBAn$yAoqQ_Z zl%u;3cw=yQ0YP8M0G~#|N?oM0e=ImHu1g8m*8x{3y!q1?Alo<#_RzTg(hb9(zs=%2 zo`6S(&_5r3+kf_y{|vwW_A83LWz_BMZT+|huSdc%*F6Hfya#zaMRN_%e-L~R`A;e2~|nECY!N4l7l zfk~$^oPrqUp(@5RMK@(*3U*UmM&c>$gaYS>@$bAN%||lks&KfYEf6SyS#E?QbqKn7TzFrwOqKv)hy_Cl!_+$&e@0UlG1h``A19~S zTf5Q;LQ1$?t7}-&Pc(uV>Ll=~Y@)IxIhO(2r)+caqJP9W(&dUk1%&M$`d5@=g(~>) zg%onp;CH31_yU6{8&*_-SP*fs1d*}lq=R5zM#=Bb=fopWkYfZKNr%%4FyqoFdm}Vu z&{`7;iG^MqQ>j+9f0+rrjR6WkC|f!K^)R3E<}CpG0heX%9w86_mC6-oo8@7QOXcMm1|Owp7zvzzg2WLN|Kbv7Sw*^(nJO^ba2ptC|5u*%4{-Hq!0JQh8?uY8ypN|5?0MG|xG#i}s_y|sUe43yZvQoQ+ zP*5s@0f6>(e;r`?1X?(+%pQfSCZ~9sr|3~qgD-Z!+&|dG&c^aJLvMuR1#DzhhFfE_ zATI}^12Wb_mKL`E)OhY_^`SLww_1kp zk`)@pXs0MA`yjRfI3rVfiEaZpg5()Z)zISqb-iH*V_=p~k?0BAUgn)$Rnm`KMocgR zbR^H#e@^|r@mMY}Dq#c>yC3OD^cic+(CTYqttf+y&KPJ8FN~{-1)JWen#jc1|0O@L zT4J6Sg_0-1sp#$G>gvLNgt-_5hzJ+ZG_XM+o}>5`A;mOG*C%@o_5ulzNkCTuCnAMK z2HHReT#V#w9Fx&Au9=FCJssMRi22H-$q=(ff64JIi`c4gG@+FR=>>DB-ke%*sV9kt zzw~$~*WlM#GI$A~NGBeRk^vq)hFXpAKtLu1No4BSc)%o

        ?L))<4Fp7L`{WoD5C)s!vUe)PH*PCMzLJCwTJR;Sms%0JVIIV~)_oD3IXIH{Yxm2sz~_2=Uja zdS8|8xuP@BI?$NWl$~wzMiahZ#(?SEf7W(qmxTjBO;3|Q;sef zx+m;dM@c5E(kXTxhOulQAj`yyif6Oya-bHw0C4Pzy7Y-!7D&&CNClf<;xY7&c*w4w z##L$&qJN=Bk-wWf*8z%dJ0E)1a5fy+tqo7Z3wYZUt6vZk|q(9!96j76aR7o&}XD+?V7lx04Q z!M_1OcCL9;lns9ftpmr3Lbt_=5&JwTcoD%lecZknMLKtOJJjAjtHKeif0{C@{k>p+ zVtoiqN2{R{4c?fsCR)ZRU_^4slgLED zhx34zJPdwFXDB5c&^@&2e;60gM^Sk}(ldmZrtCZsXby=e6k&rrkFyvpdpy4I)#ytw zIJm>C6*A)=*`p{x2yk9gTsw=VV4u6_#OtzMO~XfQ!o<|Th`zRfhX)IJcyJXDwtN~` zWIy@JlK*D!SeqLsVxRdJrUzV79MkrAb|}!h7U%#i)0W4g_$82qGd(81U z9)t0cbKmmGg`u4VrKcz!`g6R@9HcW`iI?A_X@rX8SUp}~<^w%+{G41aa4?MdAzje3 z=526de8n6=y$Z=2h-@kZDIz{5OQE@hkjz5mAP58QRBl%ae-YByG=*j{F$_@p>M75( z05d%*KHP^-#Df>s`*^O|$BCi&BmVt@jK?5>_2g5XJ0Z4e~T-uEl|~Dm#92p3}W~R zhLv>6V^DLXhJvzH={lqH3xQ_;t2x{4Ln0eNOQBkP!{lOkvrKn#J_2XCqiMm>91T5G zZm(Olu#&a7iZu0&^~GznfHk@I4b5pIiQdzY(uOyCW;KIJ>pV0Sdc zi`!UOO;Ih^lx(KRn|OB6C11%Y?xIExLF`EYf4ghW6Spx1w%9;nVAwDwM%3$D7%?$& zqBbcWX4Cz-9B{CQ#XJKeINR)&15fD5tBzCbA- zIk@C9yM6*7bfNJ)lUp`c@o^l^sVH@1uCI%l*N4F)oEdAU;IkX?G^@5awkPO7A!mLz ze~YTSf%-n!16;}Dp*jE3A`*p7udeN>3fKt0sb#ml4A;`#>+tfSBurBZ#ev-B ziSeE@JjTnukf&oM43Fi8cV=-Rm}bI`e?l}`cYea@CZ+vAF+!1@z%gZ^HvBX^4Wmg4Q0+ell_7=tXqr%1d>=0sDWQ_N6GBv-i#~fE+K0Mm(Uk2U zFc+mn$r^Be?Lyi zZH?a`p|_64+2!JTc^!&SxUj%{#z|bzmW4A&Qwr+ILhdGY`JwQPW!@Ksi(|DX_U`uAZ>?xaXwWB(U zJEN^-U-gR!WS{D9;+8z2oUVnh&Cuy$d$ePRBbLfRQ2s^n>)3eEv%zHIYw`MM>&?;j zYo>*4RGXXSqA7n%4o{Z~5>j^IYtW%nYa}lL(cgm=xEoffE`CKGMCC)+e7Oioq%zb%87B zLD01;UH-f6oosI6#lH~Zf0OuU0#2rkaQTg|YaAI6T~OPLZjC!3Ll@E|ynTo;5IA3? zUANML#%Jt^sok`rae{l8C&(1$Qe>pwl5Ydz4^V6e; zpPe6_9G`(Ysuke`Nf6T~3p!fu29CxU=je{K8-VhZl-}gyB&K62@weW=$UPpbpz*xA zL-BPc9D_7(gsomAcs!V^y^W#UTB?zLy}5aalz4Wtx%tiD>3sgI*nQ;{Kx%PaL`e)h zALWZz*xxsL_Vn4ie~Z2C?d@0J*dB&BC_G_Z#Wb!*=*R;d$wi5rSx_0LQHlySj4a{y z>6wQHlJUb2ie|z9GTX()S_co`GI<(1#)T>#AoVxNMRp zpvy0xgs6Pf=k{D)^;RRVPq&V|e}ICIg>zFWh{DwsbbnaYf1DV?w%3h~xQv&Y`3WPZ zN|KeqJd!~rlyjkp7#vNerAh-W`c>b5epn2ch z&=9IvkHu>6lbb$x3fd-mAhdi>Og0WaEgbh<>aOesdSD9zcg~dsL=*&vHsZq#6yOVa zd0M3j1^cuGe-EMI0pa8Q^AotghVy6kjIJG%*;P!@0*ooTV$Fdqh-C;ScXsjc@ZzI= zcz9xuC#`&8;^ATN(f;VQt@lp%Klya@0bAP-l1VZv5`1P(5zu$zW{Cx|LEkp`(Fp4% z&24^+^AtHl9S6%~mc8-4`SiEV42xM*I^4PUi|$RMn^Wj`;ompo_xVT+F5 z@Jd`uHnHBM#*v83$n2nomoO<>`c=<~mOZP;Z0`Aycn|6tv*uhG$VfeqP8yU5x1 zm~V1we*-Q`L$4;6s&#XkOs3VGPcjtT8_68ylO9(Y)ROqhWhc;RmQ_Y+8UqUS@d7UF z(8kK@DXWv5vuH2M_r-LYmu}aBThROuVEOPyUO@`+ zc5m5I`NlbS)mMq!1;;<9*Nf{euH8`9z-5ldx6<1l^caD4Q4m*g3tYXiJ=1xXu*ujc zf65$qED@VFWN)4^pjt)Xhv-)Vo zzR5Wbg4O>ZUD;tXg-(HdOK!1#n{tEdaAMO!sn>Cg&{EMw<^*nL@L4<)N})*6M$DK< zc#kJap-d+vX|z7q=nRlOc3{C~~Nk!w2?gf3h89lPVRX-~gmP%k-?IFH9Wz@g?(1z*#CHUQh#i z0avxl1OsN=f$)m1ytk9sbkECobc&~dC^}Ayvo$|*El#wQ{f-GMw{-=Pm8dZDcCF9% zD3utpBwvams8J*!5b7W_uHq(n7qlxqI>IrYYp(4(nDXf15~H`jr>i z^5|703|Hzk8<}v~#<{ zOW%q+v^sFIen2Zqm2(Ly21eqG!+GXXUgR0&}I$3S21~PmNBxsMrGT%_zi| zxMo?Lz?y)aWlJ1M^^_gUf5PB2Yl0yUjR{on`q66qRhKcfph@j0qMSpwu+-h0yoD6n ziig8K^9A#LHsh5Kayttv`Yz8iqa;Jy5q6@7Q0FjR*`k=<$XsadOzj_uB}+-+yefd0 z7bTJpA;8RJQ{8l?=_KJ*aNGMha;q#Id3Hj?Vd$K$u}TkLA9GIjf1OXmE}$eAev=Jc zv$^{9UiV{P?X$N6+^qlF54Tc+%Lf2dJHkiO@a^}8o+;nIB;`Gl(3?ct76SvQla28f zd2bNF8p&_4*=;l6AdK5*!Ev`apR95gk?WIf9^Q2r-Kk$PygbS4*As2R3z-*AhNDLj zmz}Sy#Z}W)VZ^Yze_w(3OdhidP~rnj8d+uK-YSB6tcl$gYzfcsw}x)ogB^4WQoo35 zQRh@qq2Wn10QaPLDq^(;)Jet@d2l2rx_%g9eRLcg*q> z<|v+45So|*u}`tNdR{$ijmJ}dt>4Ak_$>}3fzuE^CzmPg`$d`TOY>W9Zc4re8J3Z@ z8p_TJM3G4Kq6CR_=aZ!jMVHMVa%B)yGzZ?!(N?NdW*#rOc@XSv0Zl>f1j7(^2He-d zkNnjz0G^dPe|y1eSm)r=p#uM632ui3>jP3z__*~%CmU7;;gO-vS8yE;cP%+A&2>t} zyOG(z<|mc;S2C!E)WlpeT#Mcuy&}oaQ?*~_T5PkkwY62w@vVKAcHN|7tTctxjYo63 zJAdCkiq$$D$ZK~B+Tt!dkiUizwKY6eG-KSf5&Ujzf5P}n1OBz5I*(AQ%c~}(F4aqo zs!gXfZa3n<*8I0l^VPCHKglu-HFBfDz{Emq5i-xyq7+k)cazZJDiJgx7Y{32jw!8- zDGI!A(jBCH(_M{ksO$(Vw6MtC)pXOgK9^PHyS-nay{BIsLa%<0PtHx>?xx}hn>E7s zocIsae=NJmm_9%oPH|3iSbOfbEN8QFOWW#f?^V%209!4M5m9X{zqBzn?<^zGCe z0#w|3Yw@2QADyof4Hdxm_1X;V7Q+T`g`@DL1PNB5E8@*7Um z0h5qYkd}q^BmpRiSOidR(BnnROJtMrmX-x``tm%DjN9Wm1~JoN;SH~e*gUquCQsp- z(y|0yk|T&#;Jn(JQ6A=s*Eo7vjEm4*kmb7H>1H6v7KvI$jVp_J(F7;m6$tU2xF~XH zf7Cu_o3s9Ga#7ZU!lah786}(PO~B>TEGv?kWQX=|M?sH0;XIywkDh^J7fc ztRH|xjillu>Uc@`?FW@~s`o!TGcfMglFM7N6Dsz#X~i3>QknEyhaG&JOy>7P_xmSg z0lJS&<`$mfY3_d0tR=;Ah=&$K-elZtf8nLQDsFx#xZD7MaexNng6qDz^&;0&Tj;=S zHJtuU5MlUyO(u*jmjK&4!Do7;v+3hoO&_`?snXs+sJEI+mPJK zlBP0Z&!)5}>qy$M(n&@0B8u*yK1HgRa1$r#z4Y-%s~Ht7gQ(X@m5^bCK~8V%O_M?t zFaknEj{?tPvx$!^y}O@}Y&+)^WD56cwQW6%k**-9)NcuybBsI4K8G3ke|N;MeTu^~ zfHhu6q@~)oJFYT%T7#-Wqp=>}@v~%iWKfeh2R|l0V$9GhaEdN7{uWyUJoI*D+O0IgAp6X93fw~7nt8{2QH{!)5%Uus^QW=&-qnn7dIRCb%6 zv>A9*7^*zzs-4tge~PS9La^$-UCr32ce<@5u^|Fu)pZ>6Uv*i^1omepA7vD!jwCV^ zF%-TVf_RiCOA|{Cmi2Hj6^Toh9umg^isL(_mL1g}Pc)#4mu5`TR-(y!`p&CUbXS8R zOMIedUs*}BtUln<&{kKQT4@4Ywv;#eDS0$iqoxboG^pTGf3i{~OAouMQ@XV($<7$h zo!r-`$(7cQZi=j0(A?aVd>6t$2uV!dOq+s?t7^p5j=MMnmj^P9h}|uF$HQDO3<8~{ zCcWO?oS?%SG?V^yKI`)kH8QgF+(?Cfr?^^UD=Zsp>@_xQYI2@lqr=8^8DGO%C&#I( z&M0^+@*>Nje;#4(zHv}-W<1AXZ3wMpYsz;w!U|X%2rsJ9h!895zc19>Bb@<7O(fBC zQZ^_OLBf8J*~?k1}L#f3V)Y85^p^0RxL z7Ct-UY0^Xu219&e{DMHo$yJ`<{*nEpIFJHQ`V;#UD}E}a1T~*irefT`6D_O@hiZ#)q6ljdpw)QK>v)_rF6h#`zaoLZM2BVj=`nq>wOEgKt1iFaB5Z)9 zId>D5V8d#+^3mw>ZUpDo)sDZ3ELl4=pkEr1e~K;eKRf=)FO>CIA)Qoa9;Hn6=Wjq7 zNu+>P4S;v{s#T>{y~{2AsPyJv29MHgxeTtT&eLg@&2gr?kU&^G`ndtf4V>L$Ld^;m_kQ|oct-O)HhWoiFN-<%EL z!^ro*E$pVok-7HPKeqNL%~D|eEG5gsei@9Lv7;q4nQP~0Db;e^32g-cKpnfP;kokw zWe_+TS<`bFSg|P?h1B3OL(e65dnkBo(ycu-KBYP+o1rt=hpof70~T0!9Fs|>e}OQ6 z=tzjuEsx8AlOAF8yjMK0yQ05rCQlQd%L>N*j)>GmEmG+O@JYCF?IJm-r>>KJ3dLj48#{_p|IL5EgKIc$3VBkv+D_ z=1J%~FK^mWN=x*#riiHm8Y&d(RDVWVE6XtfI}cVXRMd?MLh|yl0gaeJf58cfDi%iq zOB*P-pxX3+?R#K;^z1ARpKEWzEL@)T6XM-6D;NIFNFnty>wt=BfuQtm z!W2d5zbyw+K8~3RJQyt&jA$9-^IU+bYGb?Z)tw)0^%chVWRAUm^?kbOg8=X~|I;4m{`>G#GY`4;;GqFv-b$XXgy>F?hng zjUM|O-BcUdIw%)(f2<1Lt$AZ=8ki*IP;`hD_@0Z1`jsho7g+}K4WiXj{&FxdhzBF3 z-mrT|FshdFT1Pk9(PQn%E}r{M5bsA31C65lJiz-w6t#>JDu9=GJGh%J;LJi-qmlc= zw|IGbXj!=u60Q+{t*ey464YBW)$P``XBk&kZ6DsMudVJaf9q@Q-_BnlNSbwt@ABH_iKWV7X^LH@rT>325T zFQ>Ps;l8iwe|`$pV+ebHVGU7W{dH{!iI7jzRsyf#kjhfDH3R(g?j+11p zu4C!MzCjP0OH!bLWk%I(g7q+nD?T;oKrDG))9dSGoWfwHH*6euzJ45V%^8T5J&2zr zYI-%c@}XV;>u}T%0rq8xwjLFUsoHA&7(BuBuVm@cL=wRb?LkZ90I%^8*(hF|)aJ98^ z{M+P?Yy(t_5CbWy@597%3~R;L_H86=p}`WBWOeC;0@Huu zBHmiB6^1oy#Pj$51fXKN?EMyn6ACd_2+)$RBpt0HI_0qN>l; zIS%B!o)uaaoO--!B)S__t|W?9_Vc;K1XG6^e<94n1Bo|Ho%eSvULGW=LNGo?{QnJq?a?~9X!GJXsdR^nQC77GQ z*;JLUZM|6U&``2;l)j7$4bPWuUVUxZ0}=NP{T&4+$1p*dUM_GEk8%Iu918O2tpp^0 zf1Lfq@!-2bK=^M4U>t^X>sIty@Jg@)vUU%9wXHscU{+~XY4x&c1-MD0hlIX_Y|Vel z=qj0<)g)nr`b*0AY-$3!yKPOnatDb~G@=Ct7Sf1@%~n{cIUeYu3mev-y%K7vE4O*+ zL`%V44CN)wxZ6ZZRYy=E+|`@7?m^sPe?b0Zz4k(p4)@may^!vz7l}6bjWhM|gU+H* zAwvVTb*C0MY+avcpu~-%m2<^u0tX$#EoCwqDY`45oIxWd2ETE`&|C4$p7ldB2)u|g zEE_knPtpJh%lU@l;1N*Q=z&f$5FSRM^1lpc06{>$zaAT>Z!=M*JtU5?S+BZA}Ythfo#%*V@fX#|Hy+R7GI{KfMK0KHhst>e$berSk7JwW-riA zgP?p^xl#diUn#SG-P>DQaxzmjc2Is)w||tXhp4ovU-lkCuSY;uL07w_Gix9}mY*H5 z{(yIY2ks7F(QD?F5F{wjvLcdN>-8QL^ScdvU{*GSAU{J zQrNRF8pUX3S+4I_)En5yBK0qQp{(&-z|8kjSIfz&wpXB_LoLwq4Oh4|k{!T_g{KyHUxV?gO zvOD07T>DMABc-kULe=Itqc}pX<$vAh(OU(FJ|F^A&!*jTEYw?y8qj_PYkRNsc)l}O zwklzz6UWa7m!CX(Wv=6!{I_auf;}$Q#h!j=m)r=h!xi@0_r>m2F))aP3^WIr@x~y4 zWYHoZV4OAYj2M4BLQv?8V1V6rxDWZuuUB}ou}J57RqJ}oGq`Ft&7+^4Du0h_RRDu} zoreIX%~Qc?^SHImO}))I^g|QQ7r==A2s)xTLzWViYbiG7&0V&e8(zqst>jQW#Dw}0fVFz!ChSy?MJv>y}D8m9j(jckXeKs2(Q|E@;1Gav%2 zt�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 delta 228757 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≫^q+>Nl^ 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

      !QV^zA|X4O(N=<2tK%-5_enNM3esNh*nA5| z1^WWqUqY!@5k^rIK%G*8<7jOIg^5dsZ$%?hE`KRz(q(;v+Aa0eL+PTO&q^ICOZuEm8JFz@nM+&oS5WHsPe<&D4%4PfOrBWG$ia=7(9ISTea+57V0 zVerY(+2Hu}JK8v^X3W`%$GA8bUOA{pmbx?(9HH<>SRPNt2}&LG9 z)R%lj&)x@;bw|=^#`DN;dh^{KmqEam;eW~7UT|25*f98<qo3cY<%T*%Myq9w$f*rst=aE`JYK zc~0T2AwrxX8xX14gYq6Zaw_LwJ3(_zO1`o1A_GPe>km}r#^SVax8T{Om|(&)wBB%@ z(_+8K_5&lF;b4aoBdJRB<=)3%WA{FZN0jt<0UJj|c>>$aT(?V)7fTd2>{tt97mANx zjtUb7OoIQLbp7G}(Hr}FCqX`(rGM~tDDJwmxc6 z_wAPfJ?|a4CFP`ow78czlkXtO5t?Q$=7!aD1HKh5_MEiXrYv^8bGqV_7^%s&SPXQ= zm!duDn^G3Qn+GA7JoSYr&&al}%AS%v@qs8}cz%d-gkikBi9qo8dJu1KIxxWc$N%b; zq~3zxK-a5zpj zBVpb{Wr{VsxX`cqk%QqH&cS6wR6>4NqM0!@g~AW(Vq@LNWW(ZO{Bvnbr}|2rP;k(r zK`(7GCrfUTD!E`|ZlX+K&0Yop{!8;SYOwe^?GKI*j@5((#IZIo)_;1SET7ClXU^uZ z%##%dPU%p@kprO~{trrPA$)%ookNSwvGWK*XKgJ)pnOBlur;;P@J7evC=v`udsK1*`HCez9M_S|p34NV`yescP)v8Kwnv z&tSin{XIV~MhXs;B!Anl$>;+@Rb&fB*xQXJ?*~@wHF41k(8a)cb5Z0KPrZ}k zG-tc;`QIBFP zMXl&*rKCDMqpOybQ#O^gi0bkC75vb!Ijn9CYc_`M$D=l*zJHivpqWe9tFUj>(S_R0 z=nycOVADM9UgAZ_T%Aw{L~c(B=%S=NH2Xi^VPK_dSDSn2FQr9^qWPlUS;FiA1?;U+ z0*}_s1V(oe&r28LOwoxNxT9fb->d6==;PF1A#Bu9kiXZ_bGN1)t>HDd>tWD>-_YI> z{7-po#h4q>Uw=E^W^}pu?T1!|t0nDgF6R)3FSnRvX;X8z^R;ecAnJMpiLxnq%8N45 zD;upj|I;>wV9@gMXQ1Ti!o_Au4Y4tLCyXs?p5ml1id6Fxqx7!P1a|1}9x8Wry~FD1 zh16Al5qYz7=x9oapL}q#*swY%kqo@CEmLm;NURw}#(%|8h{SgeDqTVW&(J-!<$Epq zqZ?)DCe&e-)aasQ*J6W!US1cZJpZM|pB8yRW;Y1ri^{ok&URQzv}4aJ9;MS!X&#D+ zQ&85rZA4D;prWOo?J+R@U&Z-1=IuhgZO`3i6rCOKP63JaRRIM~T#NkDzLRJ#GiB;3 z{o{y5qJM0yB&g7*GKB}pEE z1OB|iGP$jK_A~{4R{)ak>q&{DKj&4 zTg9D}9=!1yj+CHOTk2hB1ME=lK8cs18-kSsCx7vjrd9yR@JV&)M8IO6+t1>0YOR_) zza62NR>UHf(=6iKEF8I(mvDR=2&_eU*RJe9C3^kn*Rba0GN@jZvOmspqj1%#O%!ot zbu(n$5~H3X=ie}Fn}~|Paq4y(LGsMCz|=PveRs{snu}QmADw0kGjHg3<-E0us)F%n z1b;&lz}0S?@+m>DT9F~zdv4bYsa0Y{jUX&nRC>q&z~KCDO$6obH=KeBxzc`DA?lkK z#NC^Jfx~x$v$xS$12I-uH*bDh<(M~n{610{Uy8#ford!o2t*A-S*6~vtmG=bBe|3? zY7j^rdDaRQ(Q3Wb>o+zUPy`UIw6@CdZ2Jyq11uh(K2Tj+hl|Us_t7>!<%Lukk`~IggLilcSkZL z{8s!X0HEANTo(?=j?G6?*~t7Jd=rm>MPyj7wL)EWs^;b!I^8=s`ntGK@0IfFD}OaI zK5QPSesc~06&Bj|>hk9YdxJgPB#J=bF88EVt2hv93lCVTmr58pVT*-|VcGrA65J0% zG{Vr74GnaiN!kp@#Q0eUb&@Lx6P0Ob=_z212yWm_+iDA6+Z+tNs2sST`$HEw`$bz` z-S!NiH#Htu;zi8WHlEXq3Tg2YUVnwvcRnXsWgY4Ik~2G$+SQsZ)%OPWyBWWw7xkoK z39yC@c=kG5z_vuJzG^X9Ocj65H-XoM*KWyd2&k>9OOXwQ7R-usxwT7dO^6paE;^z` z1a(8r#ix084GNw?!2w8!?jXCBQPv^LYXO5fnDw_A(1cT|LtgeiJ^R3@_ltfxSl+vSV zjtDAagVI@X%swu1X`Rg}Xs2_8&B@;2^!RfdU(+03^HN#k9EH=0up02w!D659ef0UE zjjw40qd^NfJJ4h^4Hn5MN`HyE9K>?JGaPPn)BwDYtA#O^^_nkEr-^nQwRY22TBwh{ zqHS>|?T)fBq8?W^7R0ijmJFmLKotJIprrpE81daLPqOgP7$EYMv+S@(2g%}Bcaz?{ zRoffZ2QS7Lf`b<{GtqfA25%k&WD{}pOrbvCnav2sQa-mFhFW>_yaNZHC#H)cbw!2>YVhblEw4$i_Z4 zmVv!RJ)^M@H_`|?6n}dROG~`jTzi--j>5Y09K+L%D5J}T4S&(H^3A<_p1tnW`OaGh ziXf~V&kM^y_pCG+-m!?IKQl^CXp~h{ti=tlj_H# z`iLV-<@%r_UVj&DQ}imBE1uOp+2Z)7sWjO>ZE<>~$LGwRjVosJ(7;Sz2^gQ$rmrrdWr=1|Q|w7-Rtym?nsOJX>lc z%?08EF^Nm*kph6ea3ZEhoQS!_6ezoSJau`+V8uQJR{NxJ6#3A$iHnQ+Hc)HxU3mP4 z2ocRI$Zvx&{N!3+9uKhV39K(Lj7r&}Ra2CqTtc)+2$cjK&UCJ*ASPrRn~g*}dz!?w&%x18 zN!6^%ytj?a+sGC;V5IxwC1^D^1Fiq9-A*`FL%zL0B-n^Z!wL%*7WFf9SrFD_@v3F* zuwEJA5HqY57I8_AgHb%CI3h|4X5yblg@0?H2Q#eM?4-GX;1Sl&`XxQx!R*TUZkfUe zFi)Y)bS^qHjAQjUkOz@tReH9KMS*!he{- zAlFT^B3lY>&5|j3jxT8$^4Lx=;mYgTp`dv>nIxk$#ue7%!=MNHX1~)=98l{W24mL? zZah9Y{4zK?JNx=j!x?QvCzD-_(@c6iN~J`Ka})lXs(p;yI7WPO?Yi}-2>_#4(5j!j z4vVmj=zP0qnqRP!A;t!Hv7}}biGN^GPV%^sBv?!##8t(#T(l?7mB@NJLLm1o`wx6$md2uzamm$d+oNj{{7U}35sETqW8R9x*fSZUB zu_6@UKOSeNicHXpzYW`g|$yT1C!7tJ&|KP`yIS_G4IqEFMKFf^ zx|kbn4gyS^i!D+0ga50znt(q;u3q2XopUuc`4@8aTKKo*>J=n|UqUu`g}<;7B@;>E z-Uj+%9dGRJZtOk$97CBu+B@Z+XPuLJBwq)v?B85FhYNs9N2gM6!%tdZfn$D^}w<<$4D1bwF@2^1(wBE^*Dg9Tff?V|jjB zRdkSHIrz&$wX4meEE^~BvC8;|}p)T#8pSQ%Ivm9!z@~a?fjdcN6Yj(l^KhLbU z6)PPYjp#O@%yI%05s-WG?yKzb#kzeRp^IwEu>*!>~l z-y_314H$nxy&tc;kYgR_-k#u{WmyL-&d=N9ai{VOB6IZqkY{TK8+_E7JOUBwbfM3G zequZWLDp@U2;luF-B^5ep>``WcMw`#+CD#T)p}=9)%vuHxxCxK34!H`_va>eD@a&lQ*4}?wM!Ag2hZdKkouuOoT!iD1!f(6) zivQJX!FmuKhCa$UX0p`?3gFI~Xa^0>=)!9M-r$WDK@`mn{*ni$x5iuF8P$(5gYvrK z*IeQ59ov;L>}_!u=!H+5Fl68QGBo9`nBl(`taMX;5e#}Af z%ASA!U{)ZSS-0rY+R1fO&U2{VGYr-DqCbwO99Cj33#%ug=@b&9p=0*8|1xJ#JjNsi zON}4lDw@OS2}Dh^VB#!6$&?d-y!fn$b#c*(TBsV5-WWqv zi~b%!|0SNAENSa`Sg!so=||~U==Pyx1X_RWU)=MuS;2m^f&@GJpxe((yb~0#V_U+J z389&^xj-*?-6<|HTYHU5y z7AuqK%};0Aak|yT`m4~BNPp92Ry0<$bZ6AZ#(K8x2Kw7VO{2hZytb^4Lw(_CI<6ap zhtN$;5D1!Dd2`LRGjAGm1%8P9vM|P1xo{NR0o+ix$Ud_Q+tCMgmbz!__ zR7ix=B)sv+aECiGEw#I{7tJxq+JXC&gm<2j&}1VtxgDNmX2P|T$gFL$Wd(nt$R%AT z$!v(p)*tf>Q<XEB(|HC4eY~_yTb|MhXv* zCWE>hu1p*SSw#T}#-k+ss>$#i0^VjRagqhBq-ogPHFrzIg%oJ@p6Zpuwz~=gh0%z} zZX=E>@5yh>ItfHyW<0Tz8D)RF6{e~cGy;Gd$?K&^eNM{xUFM|3O1DW&sd;XpQNDsO z=Xo3h;@B*=E+TGN?{j8jV~92%5RldO91@sV4UTwqHmLYl~y*R?Xb4b z+z=Iba0?m2xiEy^ZY(=Ic>$;iBi(+2GLpSolxruTR`RA`9f;jp$m@Tm4JQ+l+*!Q3 za8^*g8wZq&;!2Ej%?)#{ODAhta7Ke_cvpq$|9J+ZY%$uLGuI}Y+9)$C)r7nTz@Qm)t> zQ_f-vQ%rQ96l*0NyP|)zqC4mm$HH^FM_F#ljID*$P5wfGyR^G$uD{A?RF>fbTq0O6 zIQ#~#Mm>wlgSe0<)$z1^6ZBWsq@%vF7X4aNRUa@XqlSemp%s`~;>j zUfkd7HBIxzPC=z+kgPP4Se^oyiWms9-=C6fp-z|PdlIoF5 zrWd9d4vl%SljeVicqY{Ad!M2d(jLDbJlN!a%(d1Q1=!yr0=Vs_8{&Jm&3;oI&T8qr z(0kma3jeJ)X#1ugE@Ap=Z{Mw}*l)Z+^!JT&xHm$#f7jl1q5dBKdo2&wXp%k2YbaP- zkJX&!8&{=jQ8H+}Uo{XK-Wut=8_J4@kFL4&Qy=)R4(ERo*e~pn!uKwRRZv_4WOW2W zSz1$(+fm@y-K}19h^us(v!zXpAme1jDGUKCRw+^CxOA_+8iR(wwv2eLFP_HnlC%=p zo_N8D@lYr)M)+`z8tqZrA~uXnGM9wKBx2Y!ZHjTt0tMG}gd)g;BbN=OQ@Mj9l$u^y!A+^gSBgA> zk4yIok0{dS2bYUH#PNCx7~Q`vz8UzmeS(Pcp?NLs}}N?XLYl8 z2pj&YpFq>Sbk^(pH{aXq#qGeO{T=Uzs#!VB+F&)zeWt`W$#6T^twH5sLf=@+kLqwxICXevq7e{;D1CMRchIvo8PR@)BE_ob(gXG%(OxU6x*tVN2X2VoZMdWi1mR~&jr z53S2B9GdUi!$_fEv1kCS2|ht5F=lOe{Z{~SEE29@J>M+NfT7M(EPe-yc*gsVdx62eS0D8Yf zAKuU>kz&c#4AX+N`6Qg5g;DfLtA3$;V6@hrma*=JBL^E5@4KB1e2ehuYlwgSdC^n2kH;fB zSL!-ttJv}bm{n+FX(EPvSKZh`W2YcA8}Ita?BE9~v7gSsX}fn9Iz(8v!dK~nZc3x| zxXBBUu)^Nh-1qZWU#pGp%8e4bt;Itirk`@78!FgNCZMsmcw&oC|bH_}2Wz-V#_ zF5;sDAF)T4ij7VXh4ghSRzX5WX_95e6T+S)bvSEYBQOEsyOx%^=G4b%HHS8}vEr7z z*v60xbi1();f3e#*p6^lR)oLShHwK5!d=)8>bC$lw;gof1~h-#4ScJC(5j7w&LsGc zDd=~nbZ#jv9btQC;tf5$RKBf<8MOhK?c1+}8PWOPOXLxDus7J_^S*<49yeoJc$f9G zERv+fNgc=m zqIMTl7x%osm+*h*=Y&Ubl3nEyU%pQCd-3~^;wc829ie*oV=sz+I6+tcDPO*y z{{RHr-#h!^AdR=8Pfs59z02NlX%;k;I$RT!gW z2E@+QPPhU}7^Hl2C-48k__)NY6RIfaXX|facOU&SoIz(|E=)RC0er@#cX&+lbwxb`FeTKP5fYV4n{? z3*nGCO$r00iZbJL0xd_1W;}yw6OTm^lEy>!j`DDla1}rv#BA$^C!qVKv>f1Wyh|Lm2h0mVkB~;8|%$6=G4Vef~ z8#=vh=~REdO?Jijy{a_BS;?V- zh$r0;9n>-O-jIUmAY}H{S1BNOcnNhlh)f(&nbYDa96aRU&CAy;&*sY=Z4dJy#lgpW z`}&I_a!1^d^A=X!MUYVthzcYGA6zbAS~?|%g$+^PWk|$4h@zVf>(*woU?4dam&AWa zM)V#knw8Wzgz>6;3l`t1>Rd;2We&&Dmw5;L*!)2iIfORA~* zm}}eB72epj)sF{nmhUVWCA_j;JWg?5a1}Dtm#db1rJvM)U_#iIQwy?47zNZtRqp#bU!b^E&KeQVG!)D-> zzOWl_ZYCm(Al{G)L)Z(75UCxK?V?&S`;@BHGMPtCUCmbML*NBeIn$p93Wr8)1(c-t zZdMR~^$3eBJXjKX?Y6*4Nt>InG3y_ZQ>jl-J6_CT9zmP;B@ro{*RQ_16R>~kIaf+Y z?I4g|LlEdmB+@)%mTS;4SJA%0$wW?WfgZI9Re+#y9rb02CDm1xm~>7~Z~2Nw_a0>h zUGRx_T0H2q^P;)V1LQK4ua>qY;^3ni653$%wy@ZsM&JgG8GG7}uEesq;4Wj;|8R&E zWFt8bcpR!wR2hs5Ad*RDJ*lc$1CW1&eVMb6kxBUi+Jd8?fEGu?>cX)n9k#I zI;>RX><^$quv+YNR?*tt+?Sw_g^jIUw`af&gWP8&KqxlqP&>oQ4&8MC(&&2#w5YK z3DMQ%)d!2+_ckBAx!DIELy*Jd3O2rbqhHct61*Is`w|C|DCm>)NwRDS`|a&_-+a&k z_Crw0fQf*WxB(yj&byoMZrVoPd9eBB+t>(!42H~9zoa=H8JbuNu;{l+FF~P5s2D`^w^Bhg8$ynyi23p+mZ`(qD~HJmSNJ;w%Cw zuEDT~cd$z@cZza+xESh*(=+Hs1$A<`F$8uJX=s-Las5$#SG$j5ngRdnPXPcD5Hi2@jy~#a?2u--NsR`MnkwRju|Fs1M2X> zH71dAtQ)IZ1N9SKR-m#En8O?GgNj~cKaI1$XH-S%~Q#}&DriFLW2`kZJ>QE+?#qqCUh zk{n`II8f3+7;8s~N_@4eK${2_?rg48yF4t#6C#CXvt2Zy}Rc+!=Q- z#P5apy%4__;`c%vV061dQ?|cQtAzkBKuV?7*2KSZJJWG9(_t&qVIyQ{Y0b;cq`E{xEf~63|{xJ0yOv`W>L`{$) z1mbG~y-7f2{VK(crp%Xk{6@%nu$f(0h52D7I>5_=0&$t0q_5A#O7=dwRW6&Zx26Zx zt^6hpcciHvH(MWynRDnk%*}sJg982KziMdr+JrDjM$2>HKn=XH7Of+#IrtiVg zbfg#=d?v?$o^EKb-^glUm)$%NXhyydEQbvBUAs%DB-fuoC+j3j5Twt6n8RD^~d` zDwV%#^$o^YWj_^-@wE7rV05J)3|y##7&<@L6bxXZA*nisph8DT{J8C46f_71(I@8!Y>EVA&JjpA?q84B-$cdn!;u+4GNjDEoFB@8_TDz2>^M z-y8#971&q$-}+^6Q*#=#pI@EkJ$v8*efKA(C3V9qrX^)vDyHT712tNdZ(=n% zB`ofEhHI=_((2uS{T?%>~ z4Od(wqB3f}x!(w8UNCLr*eDUoJB!BCoQg0vI*bk4|t$M}hZV*JE)F@7kuHoyTg%g23L#%xFRrmE=gG7Df0j zc;q)^P4KAD=J>4|Aiz=8w)yuqALE63ab-l8PM~FKXu=$D=Dw;4SCngWi~&uT8YwR_ zJ|mPUaRPitaYbdbV-K;}a~tHaS@9J1U2;Q>&dKc^ksDB0FE*3fAhn$ZQsaG-$ZfTM z(yHWFa$U_YAkAf$NNf|rWfQ{XQH5~f+P^o0%p7mlRjq4%`~95{ws$M3G;b(xk`F%c zr+(@n~trp0Cf5r!Cwm>R|Lw`DgwVRji)(LcWOKs{6dXR<-qF^}mr6E|m`RKOJptIX5IB%TYI0!m> zGilbP>RJfU13G&nzc8g2EQKI{_J^szU|NR5AZmgXVO!{I@cJhoEWYt}T*1%{HUobt z@6*s_@vq}StDE9`ihu2JpIkNH?ya5_S`$z?u}ert;VlaJOo2xA-ezDvoAJT9xec$?MKxWHuv2^ zgcmSYT^k0X&Ct7o=<}nY=x|vuZ?V75n~l=nYn8h=<0xn?;J@LyU-p^b+!Yy zIS>2rH>)<`Ti@h={PN%E&*>QV;-6!GPEBFxly$#8zcr`*r0mR{tsy1&!Gy9Pmqve< zd46~BvPz5&$}Fb&K+Q(lURVNimQSp=<~h_1`>AG%4`Qv*S`S;>X9U^Jk!Op;gH?jQ z9$sAZHa7#ELA}QJ9qQFr!mYafWPn}`7mv+A8Ktks#+M_1o$S8)>W?X)O1%+%JvAFp z=d)px_2Y}F8Tq?_SBF3G`M&x2`2^Nv^T~+8Xi5Z<{W=*l9$9_?FfkcySJA^%3AD}U*FQji0h7E(&T`*gB73ppvC_*JL|A1V@r^=Qvc{uP`iWpa90hU6` z3M0kBf*vFyk58VRJm0S*^B8;GNE&6Uq==FNXqxeVE`GNE<+INZ`iO9vWCX4z%rgzt zGEa&K3NI8gWrTevNP`qIBmO*vUGD@TnP_3))&|jYi^G`(2iKR*RK&DPMn%4;Z~MA$ z%yEzYP{zt`oEddrg09NJ*T+!^7hPqVSn?KVdaaxw(?_8IO}ck_=4+(3iq-x<2_e z!5XrQv;--X(O6_xaNWbeRot%`Yq4%D1&}j;XQq%D0~woP)XDSg;=)Y6F?s&bs!Bx) z!+DWo*(-#io0$1}P7F&4bVZsZ7&a_dBv+|!9Yh1#Uy`wIYFb#09S8i;KeBTtFIK3A z0RzSg5rlubs{l}KX%9ZhlgatNaHzab>mtBHM)*v;dhU`Wy%&<2xcF&`b!lI#UD2|rElnO<@iNLUE6fz2oZVruBg2Ah{<&dc zG&j)3D<*P9LN!3c#2p^JV#e_H}d{ot9am-X26zh4cDt852&8HM9^V^W{`8 zJZPDYEozvU1>FO|aCJ%&(O{rKkU1O61@smednrz$F^Go?*y4Fx#8aw@8*u|Ad`eqj z$Mac4JqviIp{KMXuCk(lT<0kQ#ZJu9d^Rm^@~iA`V1ZG#*%hi8hG$LUzKLaSgCJ`T-pkbh!2}98!#Fjw9f-#ssUe zZ+8AGk{QOsV3?*HQXnfzehBC;&oG=sXOj%q2W5mA4g0d% zdy!?JO|6OyjxELJkYfiz8Et6+Wo-WB6SNnc{V&6*OjG%F}pIw1;k-~%M8kF!2= z3Hvjj{AMT~0hsV@U*a+RmZsO32$P>zI0cZ3n;kk=E3HiWfnDPRw;DroU#v1_AGUf% zehFfkS(XBZxiI!NtkabS8&^tv;nZ0K8WOZJa!5(kB7ZEgKz^ZKs8duo@KQGUGbavE+sK*fRa85Cw6Cl;)WgYKsf6b?(b6`b8Z=>>= z#SVu^Xn#A=8txt&K`E&7y*C*a*O*SmmCj}vy1?K#d2FH^4ugc(;VgUj;{baD9LGQD zZ~qa2NAmi(Lp8PFyn}XCyi+p0nvE*9P118Ukf1SOLgV;pp`}d$&%v`2z4~PNJ{VK~kkdrv<8Wg~AIK-M3?Z(SNN%O)?LzN6A@wPO6eP=%*=XMFW)O zW0&c07$VgUC*uP1SMNVQtxuxvQT zR!P#5{8}YxSe9=CJc&YnahcVSwIs(@OI$fC+i>mM@oGt1l5eXfujC!Q3#6x8qY-OH zK7Y}}Gq$VbH`LAa;)Yf;&RDqbE_e;&pkSh5k?`Z$^N{l#JgB%s3~<45iugNzm1sY- z+{`%$U>*)PBwmA9O+>%w_|^QOdLmX}lwJ2C%kl&Av&EEM>*dN1b zW_42#O~`FZ&i{2&C;T}BQv`jdexI6O=YOU-IK-dm{JKeAxxY^#W|V1^e(Og6#6-7Q zPRI%!1MRoVnpTc5Qt^>lcBh54j@L9h!F)Qv&saN^z>S_6XyvKH1gkeclp$6_%QtB< z>5!7KsZKT9j|x7OXE(j_{uT)eiIs)t&E!2xRu%Y4MaDz2oLF+`ZwS^h$_l#NVSfsY zb7&tubWF}Zk*B+nTeabX$6K_f27`7~m&~Xn8xQqwJ0Y39wCV{KthrZ>LZ6>KLEyBANY?sJ?$9 zp>MZhD)$OJW(*Fjox*@=L&Vmj%8fpZl=8hG*HFGrn(z~)E#9t~2SatBtdhq(H3Ab- z{xG7eFDQBJ{B6pb=CRE%QvFLw8M2YfKYhrQT)IsA8i;H^$xx03<*aCOq-$vg@;6eq zFqY)oOyklYv+ruc?Wqwb^~u27lTm*t>5l5wDXhG8QkD7^a+LyiQdxyN2^C75xh3=* zLrm}K2q`+=|Ki}&Z@)S?q8UqBY5(!ljF-QZpc757o+su_Aspqg{}1{fC4Y`NM*ghF zmVdRV?|G+K^Pvz;rMXl;GG17I$z8GYTWpd#!({JpL2H zYWBfykDeDW0#%o^B9(-HwaVsa-qD`q+2xP$h->z>=ZtH34KB&sR+}e1sn|k~laKst zTqcf-A4l)`=oxJ@u$=jyyDuId9mGcm$L4Jpt}S|(T$fAlneCwz)f8zk0d?jrWkA(b zC}xX0EqnGN2~2``iz+Ew;UkoMr4Nw2P#F%i2LzN}0zT zKAUD&I(&SFTX|6ct%h9VRYrxx31_Gq31hELa^;@irv?=Cugaj6A%12E7X6t_NdjAH zQiN2ND*NeW`adB>=$b4f9eNhoV{+@t6XlJCg>--rz>HN?&k}pw^X-2s^92lP$l8gdLBi4l0z4yoIGBe)HgZE%U+6ZUPDH! zLJ_D#BdEp_2-NsBBPf3#r}~Z+3^vTs_vRkV#7>-ifVpob51~I{hEfU#+vl7nW z*ld(gX*nS`ylj6bsGz;^WkVb-V}nJJryYiXRC72Vwpx8lDbgyi54E=7<^DroTSm}{ zR%=W2kDcUV5B(dpTz%BKqt_O7Eb0Ql@Y#;0S@OB(C3Irac1*aZEbb^ND03Z^9JY{4-I|2 znZpTeo*}jY;mBRlqhP5%$7<|M?#v+t!lF0E0g zZC^h3zhBy^+1e$l8-`rFG1sX=(#Ec=WO#D1v2nYzahaj6)#+z&F0>M5WWv6=-WdBq zEHO9nM>v1iU$K=abSvZVO%Gd8EnG^sFgb@~o_7%Z=@SF1DOA1(LGrm*SNv^d~n-+fDA?xI_Ph*odml$h_>Zf-5!RNjw-2-o~w<94IU zKptzS#Xy80I^}|y73zF1QHedU6%b?YJRiRT@g)CHr3=^{HJC}f72NuiD1ak@x(Uu` zuG@drp~LQChrW2z4HPXWy-v5&;Fc_AY;=>WowRm&cQ@AeZC^bbJg8mjG((-Yj7AG} zFJ^Umo4Z*m+UO}m*&H7kmFnXiQ|9!&r?vg|;j8x5FDLfkLEhxD%+%ymNxVB0K7?MZ zc5|iMvT?rE)xBEUkytdz{A}`DQL1im{dIqH*@c7Ez;W>s|J7OB!e%s=T-6sj#Yu~xP{cG82pA9T$t-0=WZxDc8urYsF zMp2-C?%w13fA)^Gxse+78D{tork#NlLU{9mp$w%hP~d2}6c}F9S(@$LLYghv6gZgs z@943Ltavx;O*U;0$^e&J%eE}bvMkHeii$|AAJO&>!J)d-decXWO|3Z`nD*A!*&CkwMm6i3 zi9eibh(=Y6m&-az+BfZ#G>bL<-Of>o(Jd%!|C!5lSsq`(X`Dxm?Nklgj-9cO^umm@|GyE6yf^XXC1zmsa`RdYB z+e5g)3!e4$bYAV9#+{y@7P~wQr4w5Uv=cem(OO@e#cK^~!wqa3cXQKNQSQUMH41&_ zY96<(zY}z|53FG{Xkju~km|QBGGsk>vDUwtv{~&9E8V&KReYnXIBo^E5x)299R3Kd zI89oS;DXbZ+Urdy9UuVqKNo)xHp&#BvpqaKJ;Q4+CJubTkaj7Ckuz!Yx(I^DH`XhK z!m}f7xQ%6?Efeu+v4!)-t5|}oel3o4gZ~WOp3V2NG{`_$O95SS$^gx?)y{5J!;k}S zw7E1TG|iQ19FoDC2WI_UZ#L_$Lg|liZPu;X!-H_u+VYrns{>uE9kqWJ4iAFWV2fkd z!{NdIVnyJj1ZzTyZeUfcv;1_47_8S>B#Vn+1uyUtiuZHi zKzB%7+9AGC8$Tb<7^jvLi68M!Qa-2R2U_&$Pa+yS(Dm1NVR zXSom0Q}7459gl#5KA(ktf#GA|RXxJ*Fr(b0UpQ||Vlm#OTWBmLqV@R1____s z^tntCxrHh@DJwJ_qkV}iW7jZ);bU`YOkk;gE0G2bH{UN;xWj)-kE;h$DQ9NQ&{vyc z^^QWSoMx9~UwHF{s30ge!rC3|vT}3H;|pjZ;4*st^Hq3c7PSp8dtTo`q=mc9c>j%f z3tW@SRDRzuo3AIs8>DzB$B`D*lH3U;RGQm`pg&}b&>EYJPEqO3CB?1XdhYhZx}jJV zOF}TL6M&%=ZEt^so^8S~tVGS_K@@IOlB~I53PTu@RBeToZ;PtUcgjV*;mMBcJ;47# z0C>nla(pwqddf9WKV$SdNZ)~@3^GEEGU><#>>b zEC(_yjQM{xWdXek5&DkCso#10bTh|wO=&=mK9m2KYe`L+{DH~;M%l$hO50urGoH?~ zC;_$rk>%G@NDO#=l}~6jQK!UtwtbuM-!KC7!D-N6dBt!+TBI(SdYR%SZ9QcP(n;|u zIrj>*M%QuBnB$8%Y5`ZaDE#cV-C6IvE-s+A_``Dl<-VQ zOA1aS$&~*yr|eXe{5AEF?1Ot}2DAMnzlQZy#@|ET>SBDIB5~=WEuUT{W2kceIGJR{ zWdVQXA=bh49bI0gqYNN`Mu?2*8MsncfVs^RK!2tvqhva&YKT{H!OJ*tXJ_u!n)ayb z1!#;QMkP{-LTHODt=P2BIf(j_*h&^2=dR2qlFyQyWVIp57YWtU^J`3z;+F6e=?cn7 zI_hsG%)B~q7Wqg!(pPyAq@zmimb$L@%1(b+U+dPd46eIM-`^z}rlFy#%9cdfKeDx3wonKI?z~dhX=?*bR4N+3&)XIe_;s;AgmW4MJ!$lBL5sGTm)hj75;X==Dhw@XusI`XkD@M`<`etb&?!0m+Pau#}Zv z#!irv_Hi#JOtF`j5s5S{Gk&D!*~Nbo_k=ot@KNLZQFbo-f6$vC?5}b>3T=4usE??* zqs_jSJ!ROEV%H@?FOssd7iC3BmkglGG;gx#d_AjP&3$vnYPx58`}>C{r%x+&+yM(p zUoke?iwoMJW<-J(u*y)MNv_8r6iE`&Zk?18Zs5MkMc8F{&H_e3>`54+GRJ=;nJy?G zM%jLI03!;}@bA>$U*L?&@ekm>_bI%nbo_*SjL6bh zKxrYbY_>vHDHh_v4>%S+dQ6$jMtB?t*?H}9<{CYl=#hzYcV-3ZKNr_yoDkgCiF@Y? z+n-*aEG6>1ND&*1e1f7KWeb1i!=y}UjFrx)3^nK$WJS&$6pftlmU4p9s*W9Ai~XmL zd9;sc4np8KHu~r?$HYpkpp)5L99*;38vs@~iJA)v}7KNY+cWFDa&ESCLYd>ZbTqdaFFRITi3)$Ir4w z?Uv3g{88$@&~9yA1?oGu#jRjf zX)m_!7VGKytEuWM2#SB|wfyN-u+>1Fmi&MrRw0abUk_8?Uzm~5>ysb_-nt4|`*t8Y zRHTG^oJy9UC=@Uu%pH<5+eZ3@s5VQP67bm(HZn5dg23WU^#6F8r5ErQBVK|=NFW$^ zVbDn7qAmJ~JVR`KSu!yF?V9eJxPAF>06Rntx z>HGYe?YcA!I=X+UY};~!fi5y^3}r1z1SjojF;l|QVG)@V5|7eK&4y2?Vim7^GLsR zcj?RHD7tZ-rWmVjL@n6d!p|6;wW8l2QmMZ2&(h#$7pphCKlZJPZ@5Z-ihwtxKK!QNK~m7Q^& zK%Xz&S!c>@-ctSRaYnkkmmGkCjBqV;Uzc}qtXhckMtz=opoF|>I3XtVsi z!eMGk1w`B2TtMTj={yr1f1z|Ryh;*$%=7gnQggitOIO;-4 zHnq!t{V}MH(>@kGqBu~p+visp6ql;8xt|?NFL22cppS>h3nmIG6;=%WnWA9Atr8jF zW_@ajx$a$R?_Fx|U1}RA?-_QfrDcAGmvS|(o}_guXyEASH^D8a?q8Iu;=pYc%p6u}et3tkgGRj*5b29o`&z<}al;>hw5@kMqCpDx*oTzH4C zJjWNNA_0xg%^F@gQ{UhTg?6=MECj}*Zr>%i=YR%q$;X=fLcnNJki+o^<*zs0$tRLO zgF6vNU_-$eFJOhPap1H-k&c@*&-S{RThT;m`YF6r*0RQXWcXjF_sDJCH3`ew+hYNL zi1ME*RfOgXJ!W{f|K$;61Y@42xk3BR7}-UNvO-_TCNlyGtj2<3t(T@Pm8GYH-?T3# zb<*I9>6SP)qTXt}Fo8Lny)elglFxqgU$M1texf@PAb_WHwftzTNPUqeEI%53JiWeH z71v)4H3bOi$a<#tGXhWJSlZAR!r^~^ZJ??>O9k<+oKK0B_>QmMwLm2t-D|OlX$?0n z;{UsCi6<0WU+LOp9A~s_YVMRYz0_>UnK4ebtwFsYyHpJw@Z)DmQS#n`g+7eN(Z%IW zr{ml#m;6Gf6PoTAHt|DBY<;YC-J4tG4KIYQK^1O4hYiqvIwI%cWNdG3vI}#6)p1np zjbWa8CYpk+3syU;U#bYPpq2{HD$!5}Jxk8{E8oUXJ=_4|y%$H;CJ6x68V z3eoJ?DGIsuz*Kd9vB5^&nZSIP%U0Sm1M3?jqd}XEg!E{Q+@i{~fl`&4E(g$Z5pFwn zfFhI|LnS>_R$4V5alb8I9 z-*Fe&h%d~=^fqt@%!$C5z^3qzqno*+ksqkpUfFsLNvM#>Q7_oISC1(4AM-*NWZ^jw zx@?Rhp9)3n)a#HdNBDq^=<(@(Q*kPmC%*PK;HQTDUU$Ue6 zZqefuL4BJH;NFu#cGYQo|Jl zBTF2x*7*g2=-7ck-5pu5S#x5c)_19sJFQQzbQHnSHl0M60D8W-^OR6^L-kCWzpgkE zmkj@q0JZ2;5~EfVy#XDpY#BG?weXD4dKk%Yz^^<{kL)e(&*VQH-r}DwD zBMkpF8sE``XI%*-+F!KlB|=u53vfG)Qp5s9s~NYAD`7y)&ZcjZIvC=)whD$cWz9=z zj0;FqE(_@^YI>g6-42TefA#hE6YMcm_(EMz`)pJYZNJ(k_pN{D{yR|{aXejXjW~Vu zY6Ts;*q;c0T)PMY-?SWm1EZAp7yyFq&$vllKUPQpg`)DxL9nz`1Ig<=2Hf z*dNO40rHC`SGkFJBKhxJUi|UnWHL#o?&uQG|G769{B$x+3wiEP{Ny3@(?OQJIr#kK z(;ef1<0@jOF}g-8)^>E2%F`Mxi+)^#)wvao`^`;%EIyra9`J2Fv~liEJ+*P}_8!|f zx7p`5mN6`6uz$JX2z9Tl3~4+M$Edq~5K6fG$>B98jGO}7S2S}`Z2@?}5JdSiXe|IH zT#2c87MPa5r0K*Z0)egcQ3!>O(#{ztY;KKz8OWs+<;}%XG<=doKTM+mDTR(Lh&Xpl zy%r~bNEvrPUc{1#Tej>T<8}^{+V|FYYJ0VBeDF^hgj2k8x8xQ-@7P)rb?sMwXFezEAm7)+C)5ht_#Jc8_1+T#BAye@ zb_Fn#Y;3)fL%ZO?;Sdg2-wTU}XKlqJG%lEOdxFyMn{yss?k~K|VR&ii)<#cP0Bl!b z(aE^E25zNPfwhpOH5i7$agQufi>|{vtJhgNYDRFu+qW@_EVbNOh*&>BEQ2*i0t4QE zm&0%ub`0X~yMB?xNVW~d2#Wje{Hmt$&XGK&d7S*zUqQY>X+Fhkd=y1N$Qj8l@ z(xTlb4SVFqoGCf}fmVCWhZYtHxs(n%XEy8{_cBWP37zVC;fpM!FwGyEM)=%`M@cpXXlvttC){2R z(F2SP$aI+S18^~Q0RhA!5oonM200nx<4BOcU;$*k70>ab%WRSrfSdLhTJFL*(U*ha z`K^*M>Yooucj)kG?h@4mr4gFJ2_G{d-fmP3P|L_47iXz$lOM=@VqS&%WNm+C0|9 zs&2#;+<938+iHESZ|7el+p=K6IbS*r3Ob0H5d+R&Z$RJX!95c@KBH=G4|U_$_1G?K zT|~4x8?byz0Y|Rb;37u$x^SZ83xvCx0$5&n|5N_+6l43)z1@yfWWFAMrx!C0g5+(3 zTSi^^U$X%(nJ7Lee;y>W#2KDAUE~P`tYr`9OauSW)S5sFOU1+cpNy}I$Gxhi^vxay zG@yVAB?E4Ghz&p-X~e~<4zkIJf*n@ZaXUJa>|(VB^nj$uZw(i4=1%PO`0}{E0w3Ze zAtUQBs&?RD&kqdUU9PHsf$M%9<8~M<-d^ivzq53~%aXUu!iL^rk?v1BiZuJ|3J5tL z#)$`OCs;PeAG$X}-ak7tM@eG>2#=dOo#7ne;cRh-Z#gMcdzsUi6I{41WJTyI&@E(bAD-Tan2hnQ>B1o+#i&NaAFi6|?MIM6mL7Idgk6Y-kf`{Nw~)|nSnc7Z#r7;NpEu~=<$U3j6~;Bc>LmJNtglrFA$`ZVW6gsm#wEk+CTJq@#a;LPKpfk;U#*Z@&ad!*wOP(B zN8~}k@@sE@2mgX)J=-!jVY=3#AUv^dkA9xeuy?FUtfI&+c`YB{2Ma>2@8{!uY5?`K zF|r%z07k5rxbgzq<%${jNO~vdzh7s(?6&%b&L-)d5bI;mkDQCodUr6*uiP(KiM5S< zA}Ym}pYl#;qhH3HDW|z_sYn~`{_&T`4+n(F(`qb#Kb@xOq%D?@uu|t}5-N3g9+T?S z5>KksJw3VEI!qtJw%dB%p;G5)Vw*KMeh2qUX85^T_8r}N@bP$EHffm&7 zdAU6=>mfcCi&hNK$o}23ZnG=o8X7~~)Z96LCBmX@VwK<$ihOCZ%;_ti;uSY}RWXop z?Fb{G(aP0HRjhkjv=FHL5>vLZDH9HBeb>VPl5)@r%IN>NdS7}5Gbjrxy5^5J;#aN2iozWas_*9KX)A3$4v+Fzi>8-4eG z9#nTea2Tsye`@if!bdusEA{(*aI!gkC=SSQfx&mDAirkW)p&jzHV^9d;P`lWNLJ^t zkw+NJX;Orh`yxP*3nj&oW-}ca%kDm3ckUDCva3D$$Z+7&!;|BOb9-*7V#;UwVC}dc zCq=r=Mn{H0{SGN%lshg$EsjjKx}}tVI|`R0nz|h6o188xmT5K{r&yq3SCABb<7Roc zXLxo#iqIAC8*2$%MIy@*MRABQ4q{(!Rv6ZR{kZM@<<&QTcDoF1V$3gy*zzlJ&}dXr zXPiwqF5pUZg6WDQ6Li>f66B|GBmk$_*8=}+hIBFo4m?lG?H+r|FO*Yp(@&6pfjNbv zL?7*5E$!9`wV2LMGog>Xa zAvMWuQ@dcA>R)&DH{N(}{WRH9#$?)+L7irl;}>p;!0)B!6T0uWPK|8ojCgIBDL}-H zPzjd0Ddq1r5+@lcw#kU$KKt5#hd4Md2H?fFpC@B7+ewXMx^db*m+w{t&B3`Tyovij zB7>GzzwHM{umvA~^`V#ni{+xojGRuWrWytQGzlYFi3wjXq|w)kE)OZ8<=>sN3{_${B-Hb!yi5U8gjwvM-!H!=sr zmY#!usV!L@v_sLr>)(}soK0ts`*MxAoR6Ff4ns?Qh*js483~+sL;qiv68eY>)Xl1h z*<493Xh;mvV}xGdP0TQVR{zz?s3r+@3clF!OH~Usy_3at9`7o+%kY~pN$&a;ldX3d zVHYx!!)vH8eNt~awjD|}C-o#2hQ+(@?;|BBf9regHQ{!U&XR0gw8pKh7lT^~+JGBR zqZy6gcc8}GA#oyTJ}ZY$M-&=eNy{-D9rWcVdZ%0^*|g{_Uj7w-baoo$ArYnOuKdEq zRkP)3ZHuog0D~}p3f9_QEN5hcsd(DCg>uU*07{m=7kLZ?rUCVkW2PE|EC zRbhUsFauS1h{FHGu%1YmI$9(Jy7P>)(t$c5n-Cp$tb8O>69>4(iDG9Tp>87HKS*P7 zsgyzvhbw(Prp*?A=7Ic>M!6W6KEd6YT({EFb*b+%_E+64K`8jKI5bU>=xFE~%u6|n z3IQm2B^5ejc0tCn3}2ROqx2SD^5qJA4*!#v3+jfAa|FM{x~xWT~B3Z|HqGQuz#NeHTap_kWWumf0> zTb(bSn!yd(k(8FX&;^qs92>S z1v^_paJ3ke5q)OaB@h6v81e6j{JOi-swz(TaZXc3Qr+TiA3J8}S_GY|+@plwnB6SD zMlbn)kK%+osWXV$w&kaKu^uvU!@h;!I!;MkFE1Ev^PI+p4_R^JpyH~V4J-~))zl43 zEr>FA^f$W>0LJZV(!FT*nv1LsI4ipl&>EDj*^_ZL`2>HNrpa$}HIKg;j`Xv2`|~Dt zjQ#yZQ-)p($(-&tPhRyzNK}{89R2bn*olpQlN#zx)wTNWtvC7$0uEbh9@GjPSZc1) zcLQ^3lpNazHG!D=7n-LFDmKsab%8GjIb1|~k^P0dNX0r1g&w#g^2(A|iK9NBtmH6; zWoR=)i^iXmLG$cTt4e7dPv3?2JST)8-kg2J=-@S{e&rvy_4K$h%CarqpXdYcO7Fve zHyGl}FOvk7uKoJ*4Vbu@Q|t&FF^djkHNM%{V)&Q6qwQ^`hJ6N!{}6_N4$6u54@eU{ zYy&0%Lu?=+K&5MM<3yj{)a!tO#&5?jaUD08Uasqa0S_bkvjl8x>8>Cq`f*Z=}5<`*}ASI_6ow-_-ZWQfovQZg~yBWHj$nrOR?nUvy5 zBvfW`kAhsyz7S9XPpb)g^Z<@V-zv8>xc;^264{Scck6pK0eCVb@qga56c6jOj*9 zvYADwC(ImF5ysG#ozfX97nV*8iCg6SND@)%5YNd`lGME?U&twL*gqCD|5onsJ$^{$ z2+s^eNQi~r({VLtGd(lvuy#y-#PuL1uxM<$}jcer=UuSkLM3RJ%N$E zYliTR2Za1}cK+n!qELf zyDI=TH@!2+IM{c_yin*68XO6Ut*Ox}Jv1Q_b}1O=#*O?(P$;?W2p<<@J zc}eGlsb}fWJu4`a?a(vEbjWAz4Ix9)=!XY?Mgj&?zc~K<=;ZT{jol-Edh#;7CM``% zAkShPc!MZf)~TOLU$bG$u@r~GxGsMwOAt(+ek?TLFF^0A6n<0DB!o{L*w|g!njkZI z2CAhzk*kW1eZ`KoAnH(#sFtLtQkc||JZ?=&E5zwuSL*vstz3&18!-7|QPp5Dbjv=A zI8T;+k?niezR;dI=0QAvFN+eCN&te3Ha#6De@6I&Eb%@@ znD0OEy0#Y3#w!jxS*hy=8d5Jeb07pvvIZSg0JeP1OH3YjHfHz@omCP_S&|K`(c5br zx=RK?DyPD>^Nj#Ka;t)yu+v&VU1(v!UGepQR-2z|10I;RU@r*-{R<${zUYSAIA z)ytw4{k{dh19BY*eZLoASR6|yglYN#3QlbP;C4By*zlMIYw*|R!sj)X#J^(5@wt}! zGVsYnf@chTI}3}T^NQ+IXg=iA$DT=j?|22yTn5`MBKt2s0wPukg|Lf~K zQZO_u|9EJBu?v36lK#0wBw&w=hCO9}9wjnJ&{Oi~wL2PRwEQ4)|IlCagx}L`7Jyad zoc?-6$s9n4%K8KSTAh!)CSa9GCT(2tk|@bS^I z*CNq}BAKMBR(V0Vi~ABHahlO z8?bkI#9(Mx{_)Ua7d(}*Cgc;5fITi6_F4;aDUm^fUTZ*ZyQ5J?%Uj6)XI62}?tOD6 z@kCqA_}9HaM6O26vk|P%(8M1EnEi+<16W?s-!0DyFuCPT0T(~uztrT4h)Qn{xh%UWMl+qg%p*u(p(vNvzC zPumBaUagKGGN;srdBa}RcQkWkHY9MhGr(fde-3apI}3QLNFIyORRR$B{~7Vu&IqDA zOo@k@2IKliul?9~uIu+cN>0B3Hz5YG(NJfw0SzGQtX z9`H$hYsdIwYJ9N9yiieeq*Z;k?Y$TG_ECShEMWoI`10!*J1MYou+Hy_9F{Y|7D<_z8$dGIn-gq|YuVtou^JN>ztoF=O#OYGr-^eA!k;)oUw&k)7}-yM`#T(MY&cTU z9=5y+T{~q?9WR**k#`xBwrbL}6P!G2D|*_~7DF*^N_!K6+qc3s1QL%KjSlflH3hiU zWu-1qkVK!ecu)o1JV;xSw`%Y`+U3m*=l#bp*dO_v*0*K^8F3}Ol|JfA|F)7IPTJ>| zzRf$MyT)8kz+%pyS2KTq*VQ=q=EGkK2|-H#C5Aw5(P%|t4HVgRbyhN1e+?+E2l?Mh zneU^?&QD9-So*yFZazT+hxN_tE7;!1+bxNIAuyZZ3F|t159wGoSYb$d2^7s^+1Piy z5(?d7djrff!-w8ng*31Q?%s0uH|3LSF6SyntOC~3On>7poT2`iHelCsCKxC{=j(YL*!!gJqYRSSsNht$}6k8zgJ!<^0an2&T66UNwWeMY2}bPu-40+xZ&H0 z-Jpe#5*T4t4l>>xdpG!aUXTGbkV^|5CFf(s|)IO8 z_cJALCzbJ+Ab$CDTVt_GAJ%RF)FxWQsh!#Pbh_Ys&@(DIjkTz4<7_X_&E6`mTEiZt zBurIp2|1|eB?T7S&*hV5nK;w54ya`WiH9AQAPr`6ne21!CY z<9vmO2`PYo;{1zNG|{}!YYPsvU9g%jB?DKLzm&Bi+a7K>HtSJtD`$;xS&Y3+z;!O> zLHMxFoP@Eg+dXmd#8fv)wiV7|GAoJqqFugm?$plswRbO;;(Sr%iT#^h@xM4Vd&CnU ze@v;0dwG3mA>lF3Bh%-AJFR3h4$1m)B)fturf0nQb3^b%E3uq>5f~?)T&AgKLf`DqM0-O&0M7V>BiDK4N(zsLn$>`?$2{&H{qK!^pxFyV zG|n43@4pVxR{=2ZsO&+HKMcHhgWUz&Ce$9A5o70cbQw+4WP@wO!tvle&>x9Tz<7#x zVzR#h^?F7eC)h6Q_mqszy&|0~IE;+<9(f0Uhclc2K$hYi)CblY)R*E~Zoi1(Os78j zHv%CW2*{Hpgu@WyntWvDOO{lfliXNh)dY};`!y#46Hb`I=jJ(7ZLOX0}9PEY0l&Huf6hR>-K1Vn>z2VyMlS3Z_4@n$75@29_5;+kI zda>KLR$R{cIr`>40_2!>L{$bN3+mvaysbF^xTeFT<*{(r%tgRB`^C=ZCi^etX2rp% z4hg#(hh?^Udc)%TvPOe_z$L)6vC|ZPjx+qe=9O381Lt|y3z{RWLU0DIM&+;NON$;Bu!4dY7M)I~?!q8hJ zp`aOMEEG0HT-e=~R1druI~7ypmN=?paKW{w#a842oU&n|AsDD|1;z4mI z>I*8y_poEanB#iacwtF_5MfdAJ)58##ny534^KK~d48DJv<+Fjk}CeXOK(0|GC+x+|Em9I5B%1@dM&qZbI{3lOh``vQ)>8V(8# z+f)`{_2dQt85}TH8r)(}s6m>4XE$^74Y`!y|I_M{ZfTa>H0c=Bf5rCPsNoDqud0Af zX1Rxn2xZ|o*fW7#pd0a1xF^6{?BWth^aIrqULNfKP;|5`GHn_+f6`s$M1yC{}`qHh^FbUavuwoOF5lX$*=!1cf>CbDU|@8?W{XT*?V&ot z@u0Q@cBu9dE^cwt=Nrq)Bbs~mmC7o4JLPRiX$U;+RuA?u$ zJUu)zH#my1bUnfS8tv+ABa&HEjw-X)`us*np2` z0@dH-qGZAKVp*ZK5@5iH#SO7e5m19BJhzL#$yQN+2`g!ZkQ+2r23=F^cn0ZStHuMD z(5E^Kt;fzkQgtPNJrn=`H7peP@suxzHQ6^q~H-8^;Jstm4YMh<1fZU9sl*-5OKD65o#nC7mN!s?_YjP5V z?72XtGv)%7yWbS;huCP8iyGX6!12v}NX8IyG2_zNc-@C&{SX_CI#3haB2^DzHlSY0 zNVu~fDM-bC9E~YOmxaA2Dr=YHNy$oe(Y@kz>;l}mtY&f`Q)wSv6`J6h#x`tgc>B-i z545?7U)D(jvZ)lExZA>CR#SnHs&IaL%@t6g&V4|A;T){A#lZ*Fg z1hn4DMx)p>BryjBaS}ib4wtNiyYT?-ebba`7M=eyf*7V*X9HMNZSsTSVXqCC_nl+8U{dkD#C$S?U~e2WZ;)_* z<;0ReV&c0hf=~Axvjr^Fx2?zbbYXN`HpAA6KnYuV)!s?elD*Eh^$0pYl-97Lq<};F z{=Q~1Zpw8>H*!`EkDN*kM$Y+e2Au-N6-#Iu4KaB3N(5O#n+(=7=8=~|EF+JyK%lUp ze#~>+dn#;$&Nd;lB2VzIz~vs&2iwMfStF8+h|}t%Z(j|rqyEL0m|RA<^rVq&kDRco z$w>B4wWr_PK$$c%nHbMFUr|)(V%-yar_qAjk(vGZbyAjSo9*N#;qR=)xzqUHyOfNv z%gDWg!>$DWL%9|sxLeEemV&0`Rq21B;Ag@SM|TN-;ciNTW1l6O#I^OfeGxE!j?7fX z7ynMN7upu?Ui8thWy!vvvsAi8Mbc_R=XW(tRDzQMvd}`P@j{~9!GU{236mmC>nLdj zgM`?*n&Lxqkb;l4_oD{co;72^*QG)$lV}-ix0Ybl_0=TE4=y)lHPM?GU+(|)rO*2E zP(J$z?*Hq{|LeKWGx&&-PxQfux)GxH zD*RBW$9mZ9-i_+7V=bHH*lmC=U2jUdnNMqLmKG7ODp3`wpjkRkG|kQ)5)C&Jd2$ok zsGN~>_a?s*F6&%a+E2l=n+yEags+!Cg98+Qo`2#`c>YO$Tkn|)qV@47YaUt;m?KiB z!a6FRJw~zICahEtYsS8;ej$`U*t-$*!6xqQ8EG0F-`E=pE516eWwx6^A64@y{qAyO zf)Lg1hSsxQ>>|}H(vfUU>OhB(n1gOq(PKHJOCM38soUY!%P9W z5VIQTw0{e;g?i?;3>OIO^o3_klK57CQ;fn<{)XhiEr@(0v2Q`M@TdP&6t$odYmDat zV(6+RKgO))FhVQC0)D%aW6|^iR4ftf`PzHWOv>uZQ8!>1Aw{F4LJA*n&Z_8WVx3tCY1e)zU-}GGs}2E#7bVg!P@cBp=8Z&(WSb#^GU>9R@Ieg4K?O z`cv0#t12Qm_>R3en2nBp194i`F{%e>uF*xv5+X88>3H_4Uk4EfiXTVKuO4bRu^qAg zIIl&W@?#rnsJkV$s4nr|JK71BhVU+N8*J3kqn$9^BXL9rH^2jBj`GM#tbK%tjFxpywPEx31i>PIAR|)~BK72G zOM#lh0=-r(siFvqWRY)0uSFmk&!!E+f_zD;b zN8^qe5}By%abx>((6TO)@xSdZDzuio)KK#B6OR43NOwo1*y zkolXxQCo|( zlv=X=0xpL+rjiVQ*4i$GFeMhA+N^!b>6ERhqHQ)7Y*fmB0*n>-&~{AgT4t7HKYoK; zmUXUOr0L512)Q@oH24uRZHMhlG@gbsvF^t#@&!`6&8L9o7EI_!$eS{&R4izoZ9g%5 z)RY{UYtP&rZ#0im_7vy#)=gyY&5YGXk{Um^fjYFXLF8@U9C3veFfV4Emd#UiQK&$M z7O~y;pA?{fsQcC!K6L?LWf$U4zo^RLlj(I;84O`qf_Mo}oxX?ZzD|EeI2CN~S* ziOkfH*|_Z%a~L$^K+p8fXJG>w(n~rL)Y|4%xvwskF@q4Ej2h<)t#RnoxbNzFPce>VZ`1ix{_Nhby~=mf->fRLOHQe$tRi|Sbsjwmgb1a7lOyY zKya$QN+&^imCv@bRLUZHg>b%CCDzj19T;F#LQ-&y2{{$K@niRoDrmx(!?x20(nLFT$X7-XUebHQIR;BY5@_yD8rn;mQ@yPtfyz+SOKukaa~jRedY z&k7F!oI0O=dGh(k0oiF?M9@S6L!CwqdQd8P2QOb?L<3TA8&(y zR%!qe`g5l4Y^Vez%|@ry?_Gq*2LD!ta)VYkRN4kD?rbMshV!_NL8_fV!0fqr#N>%4 zia7D&OhXt-IFM?FDE(1sAxX=mC0t^1SPYaLHvBs8I>TTtnLAJu+0wk=p&apCxJSRN zOTSI$@F!+lx;=U}^kyPduA)RZWKfBJedc9j5k&dSq7fI}l0-dm^Ay@5wDAV|&{=a2 zB-Gv{lR{K>YZCQE<p{h(x))s6+=dJWkh4+18$)BbnIsl}W%rwd z5GFkz3&H_v5+5wn_` z!KL3(y&M*uEn9brlpj;7W7H(TQjde~@GVW|)*c#_8Us_`?I)bgno{kfOaG{sb?Zxg zObzFE>KGqwwq@YUh*m1p>z%BB=X8&=k}y5uwZ3M5dW`yAMMPng{R>zR z#I4u&_jGiUU+%=Swe)!SaLXkQ2^HM+uplD6hATZwS&PgZmQd$>$U)J0 z$qhd5&LvbQdODJIMdoMzKuJJ|fqTbKmVefmj4_lFqnJ4)t3`GvbHzhL^fr!AM0t7m zL8<>h!cwns_npn_Sokl0V)aXE>iIlw-X&>wBHk%9?&QZYI2lNiRv*MbfP;yBkM$W` z2tN7vm~B?~J|MW?>{j8y_DpZ04Kj2qfj8du_mTCR z+<55GySbPk7*a;-2D;073;anYEUj7LdozLj-Uu$sJ-<BQ8TN0Z<*CU(kfCTc z@gYz=S@(m-Le?<^gi7Rh@PW3K_71`Q{|EM-!=($_@r2_3Q#$lnPs@Z4t?{l3W&41U zyPtezIISIEtGX&r9C@2CU8QUAaLjL~lXGz#q$ALdsMnv3=O8c_FB~18A0M8B%e4{M zuY)xB(lqW|Y|-t1T(q~+DubYULj86Jwh5+(p@7(w0miGVWFN#7ltvK!i(9vV5|LX@ zDEMjBkO7w7Op)C-+t=maQLOU^BXq`%4_a*Vpj%%ae{uTdxs4g37{$?>3Wd>r->5Kf z+!jyCT*m~qjzLjRLs;}%fiboi^2RKYD(PSI5MIV~{iU`kli=nRBk#$8i=S?6@?6{XmYC|Bj%m&K*@mhWrizGk z1!blUHcilfXzr|oKOE0y$h2P5^qSLhd@(Bv@YFOJF9%^`Lx+cnZa-EM+QwS!aN5UN z<)-sIUaZe~o)-m-*wgWn`oa_N#pb&?v?P=N#pdPj<}WsY8ohAjWEoW>01)#G;Q${- zuuGKks&O2>T;fUd31ze{ag1x~>9kw`r%xs7bt zW0*VmgMiRnq7Oo7K@5_D$w6AAh%!j3MXXK&3MVfbNGTE-SS1?tgc zSucElSpM!mRL;3qvS?a>oCJnUhAVc-s&_%^8nj807=V^PoCkM%F)ZO@Gb zfxsF)gunv8NN;#7 zK#*(qq|eafn?)7SBN)Xm*G7olL~?k3_^z+7?=e~kYSjRuKb~jy{|s6-H5VlXsRuHD z&u%560QsVvzV>51@%^Is0T?{6S^B~4OZXSK(a&p?4~E(G4TtiSa(?4be%^vFH<8kL`#7%@uG1$tB$19gKVYhVF29yq zU<*0YK-1&6kmO!gOv{XRIaY1$z`kSqtIjmMX74x+`*_A;Z`kW;eL1 z#|wpRG3r&MS`OS>ubURyRKS6I^Bpd<#_MbL08tEGv#H<2L~OOg8JW?hbQBS*V#>)^a|>obhoj`_Sl{okL~fy+kEVA2ef3+<@ur$RC|kLXu6_D z-*#cQyO4FHhrHys_=3=XE#KVyiPsyVORM{Jx0`NlM0AvpWBF)Wr@fLC4*tPHc{8%n z(N)FO>@)5@$Q}>DINRD^*;pIK4w7n)xL@KRtfhpaKi|Tb^MGt`(3cG7=Vikg8$0{D zdrFa!J zT=eD;=TJX{3u@ehf)3uPnHM&fQucAKPOd>K8tph9ZLFoBA z2(f}7r2@W{l%~YFwfqj;=NqiTD@kq5uK^mApEdmI(>0^ON8MzH{aR>6UXJSRvUFHI z&*_-_EMLDaw2_p;Kx{(+VW+&+1Jg)hyJ>H?qN2WLp|ZM8rp3levXg!+;3Wnox{^F84fd-DPQD zp(4LFAWc;Mk| zXMUxiYz)UP5TVOywIBa73C%bBp#VvNAPqMCjBJH}nr>*gKT)edYZSV_@2vLr_t8kh z#Vb8;KmGjtsC#zO?jL^9In~>M$q29V>B8xXt$hTX>;#MCw?Tor@MN*4(R-*}Hlf%J znk_Y&h}|^FWk<9odjTXu^#;tWvfAZRghmMgU)#{N#>;4JV6hpYMfp$oo@UE-KX4mXvg$+Zw?W_<{%{NnG zHGwaFLA+xZ_V+(dx^pl(3SfUdba9zZ(#sov>fl5M7#%W!go3kI3Hn9jNIqZ2saN)5 zn!#|4Z(O--BA^MZY1t*tQ_Dl>({^{u2p#v59DgZhT0s?dXPx%Zy6C-_m7>Ri8#9be zF_;ct0K{l8Eu>NUuZK13d^$q8$j2DbvE^~@dvG}!3WzmrYv4}>+b+G6EP)U1B#pd( zVR3`cs!zJf;TP@W&pXK%-Lro0^vC^u$W&}#RMYAB21%bSOJG3&*_{usRd!${oLQi8 zUJ7zA!9enmiR=Kg1W(SusDLWup@jNSZ6^Ma(*znVj{xAl0pIFUK>UK|`mZYt0Ll@| zf6K=s=DCXjc2f$TvqAXiJXSE94aV7j&=%!(zW}0g3YK9OacznrLN%@!Xd!%6mo$^Iu$p3hLC) zBG~c8#@y`F0w6iglh;=d`B*W3KwcWFcjZp`$^rBxdG#*7`Qc*h;+r|8H)-RIZlZNS zI5bd(APH%ip8>5AQttRsMNCspfXD>>d_{3p4$3UTS%My!KUe) z)ru5h^sx+oRe|?&-dW|b+N~gvMQPp>%3Ec>{tqi8?3s3-u!AHz_JoNNghfcAejUmgSR>F@RC_te zT{*ebgyOAAsndZw^J^GD9K1b)vzrKY32Jg%_)qspon)xA@ejTaY#~T0gZv5Bjzv&R zV{OMiDq=^g)H{6M%-ad+IRz`ve`c^4rA1R$MxQuZJ_4s$_z-q6gsI|{2Gj2;8%mx-5GE4W>QzaB?KAia zEFNL-a=igg`8Z$o3myd*O(}-KAdUkYF6P<93>Z z7~3NUaPi4{SU!YUH*;ZOXE-a8L-!UCA|=irz^A5#tWd`q>xq?`e@9#jY{UkoJV-gk zr^r}Nk3y)rW|@Lw0~xC2ho%KCfsw_m+>z;$#Z_xD7UF~%bV@qM*Sz#A7BViOTrc*R z*E`CJ2Z*zzEb}F~s;BY^MB&b+GCb58^YQ*Hzk}IEJtDlz;oAz974CKRT`Vkcc-&E5 zZ8HlruBhHVR~WY{e+31rCf@$5(S(gqSeDLoYI7t%44~KYB!Tt)fy?5euZy>n`Mn=_ zyJ&=kV2coz!NhnGP&vXPm>4g@T`WpGad3|F#G!|L;1IKz!IpdeGTG9+s0g7=3M(^K zsKo726vo=4m^IhdWtE#67AZ*UtwotySI1hley1<2qL?A9fAyZqgA1c(z;~Lqw2riD zS)}lwy~r%*lfgwb$#Yj`3Vt@eE?zJzh2zgH3HG-A#S)$(prj9om>Ma^if|G2p@$KK zZN2f%dvHK4nCMcVH8FQCUGE4uw&tnvqk!qU7gYeY)%aOo;zb%9BvLT*4;by~B342N zTE;5Vwkw!ff82N=Se#-l_U6Mr=xf#*=%#H~hDsM-RdkAg4eGx_$Dx?g& zuP`fn#4uD+buzUw)J^0^sJYm|RACfE`qv* ziSWBV4*_s(76RCN;2_qLLJq==x*PM*5jb?WXkBTC4O+pxmnJ4 zx_A@9De4oq@yd7*`m!1iLV;J#gMh=vcu?ws*~0JoJP5$Gc@SVX%!ASo_a(0A08^N@ z=Px|df3zY|8ZrAa4q9zD4w|zUVIH&Xp#jk9%+#0Yuf4B;o^syavaC?Y=4gx4OeSPR zi>~5L57>|@9pQ$EG6raeZq;ofgCSV5339O>l%86+@WyyxOQFYor(R!tn+)@OI>Jzi z`IO<~ysn)EGHR(5G=fAv7AX(ot{AznqiPLy#ilmtW$W1<%N zZzqmb+@TIYiSZLTECgG9^kTTv)GC8N-1#6relsW$#|hiumh@j}Q`JuA{IIF3sH7-Q zYlaVIjc()(38E(< zAUtT10wK8Z-%I`Q9MmtaoeMrsn@XU{XZJ;K6v>WA4BY~jh)KA3-x z_EG+0?P+gvl!AoIZ_qs^;W{8pQ}GGG>L4_P$r=S!@ojpmD^~>rUeTtT?ns+sI%gI| zw4&*kY2CI@Xb5k56Q&oh@hi@uf97oyJ{6g%eHscPl>MP33Z+#bk+irKN!D~PE{c{t z;d;;DDI4NDpedydmXLTCB;Pkk%8uaQZF6ES#}h3eN(f*r7s&)sSyCN zHkS(t8cP~arTDZ2zS@WV^EUAI=U_E+c-T4NTkJ6UChlzinTMZ58FY%&)6Y*qh^2pj zmtXUK8;u?~pTBpK+eAB}nAz7d8rHI;UP%NjOtMrPcC{3~wCODK|pC7>v;moj-5oT5%@GNsZ zJkRrxpSRI5uxJQTaXZmb)Q&7GzMLL!SFf;&%hu~<;dir|em8{`S?A6d@B|W+qvC^{#PmnC|0%A1NM3PV_Y2mu-RSJm8$#BAf@vk!h_@(2h zbjre+Mj*&EE5}|X1Q5d8?}B^D2Qh+ch*<7Loxyx)f7I+rJBC|Hta6b`k?LD|c%8SH zAqr%&yVr<0khI1ZOD!+v0^98nwG9>JjX?VLaf%q+t3WGj>L*t9!(L+{r9GYnX+QDA z#Z5I7qd2Nfosw`Nh)<2KJk@ui{~12J-(_Q?#9KzXnf7W z@&O2%e`v_1zP4hcdY;WV!nMR-HC__s^hmPzG&`JyxtCOIQc5&-=AEhR%ED zpw7SR96n7-ltMZ<)L+g=(KIFZc0=fx9Qr*yO0E!0eUy6DxvZ=plAGy;`sLuNReqML zg-`Lc6Y&Vr(1VTK0O_&n)v{w%cdD8|!7>y9f0_E+A5z9yM6oVOY%cc3qxkTtsoNT3 zZsgQXONTFRhBIOmud@e!jZl?Tv%*;uZ^ikjv(1q!Tkt>g-EA_2X7oaDoVe=22yqs0TgC(!M zx#7j#2&nc;gRK%r?S>s)xR(=Hzx3cfXk+2Qh7gBKeqiJwmNOQ~dh|iB?-DPjr@8lA)|h#?5^zjF_kOyI?9R_Ne!fmW^G=mK&26xBH1g56o3vT3a38`lt+QG zd4VE?W#ozEtjg{8Ax;1-l_rAd280Pb{j|bFQUhV4S(_IoP-#S%NcIZCe*~aIVZ!N; z!sJnyY+jfMVHsf}Iji#eeFzgkONEIbx}Go*v2i)b(4E0>d_6*Y&T%^T!t+h92UA_# z6zH`Q3b3Ufjy~)&odcLcqNXC1Bz&`%LSmOIY=H}I+@w95IiDO)1O&RV1PZ?xL~Cd9 zQc^i)KKXP|q*7;)DIw*jf0YpGnQA8jN#Tv6^`PBZG!uzGnkk;n<0z)_X7P$7p39zp z;x&WKql~rM5k`mGWbI-uXRdB>c%K(s@mNqob z(#cW?G$71|%OJq3jZ9~>5|C%<^hUe8R!%?`h}g+g&Cx&NsEl2;d% zV9;VQQ#5HE;}~~9f2Gmkb$Z+rAi2}M6a~TN!zbxNI)?D6PNkG({YG^kMa~CD~ zbflWgCDsh6^Oe;B}Xce>k8r0Bi){^l&qGBml!7(f}Z1vQ-!|Ht3 zIqu6w;GBM$=%A1yZ!;6OytZgz+ohbc24@hOc^Yl-3@Sc)fA)39YeiZw$vP;3U%;l1 z&FzL@0cxVcjClQ&E8V8k;w4^dhEz47z#hNdcx#9<}>z(rynD`BbE2dES*Q zM1=nmAV{ep+^6&|F7}-J{st;qFI(BEV{oC; z0jE|=!60~wbM z3j_=nW`o^eWuejmAZ-$HaG}xxAZ-$HaG{qk3j{0zg0Poe3j{L*qvHdY>*fP6mxT-j z5SM1^0}u=V000010000004?X2?+XMo1NH3#mp$M1HdP$@YSP)kv%u*pJvyUChlfyKh#ZXa{z*aLVxJn#ugPfvGGPj}Bf ziIPh{PWowEwBCOEZLxQ7aI`IsjyI2Yo{OFR=eyr;(d*%{z~q+bh}U1U^6aH)9*M7_ zB+7y!P7`q)52L&YhJT}HqPx2G;p%#K?R2fXw$3>RX)hRvvjFmJh|{lLf9>_xc9Py; z9OC<*xBAWhG9E;E6^3a2aneIpZ6Ol~-a)ZKB)GD&B7O+6I34FAOUFf=L^(pm=fgA{ z1F8!Q#>GXNi7yB7`9;x7lOjt8K!ysLN5yuQrP*GT=fQdOMSps|odjotC~WtGK^}D! zyY1^D3wnh}`(khB=va%G`wow5MbRd@p$Z?m(P?G_k9r$@)ZHKcgb4t#O^o{V+4C5Dtf-9 z5`-$nWA1*I4u8c(QH-9w`|e;Itc-J@;iuX8yI1jx_}%B}XmX5|UMAs(Q8dC-+a}Yq z-=kguhOxw^K1kCS1c;|f(OJZ44`^5!m*T!CCZkA!#9td?nFuVSQ6z}6ltslj zO9Z1JBm#Scj5fa$PW`o2<$$^%nd`WcWioH}zdw;_qB2FL7JWj&s+7p+-U>w1V z7zJ^b>(YcNiK26zaQP`y2kG%U9--Yg-fX#JL4mydXR0mPKN)B(zac zJSR9<6jZc-j?xV3{~XJ7G=N~z%0Zkg4hHc}bebciTQQO}iFV=jNa5MWQk)GsLI7b! zg+eGsk$*t2>VpADoxp1jeBpfnq&$(NVCutRloVjy!ytrUk%}xD4T4@I(m{yIAiaQ8 zMFu%FODxDzolVx5r53p@Ku`>@mT|J|8yliUWLjinP!yFNq#jJfRhqrX1=<8*Mb zs{XR60y%A`vkjGN6`!QkkR6MvN+X$6Icz9QgMTCeCvPem?}#--Z2j3H7TTsgFiB(1 zfQ`0n*B%&q0i}(jL6}2EB^>5;gfmKn6jI`HG9I2qnf7n|fi#wjABVF8R#!}K*nhv5MX>~fb<{_B{p@*toDgO-ImPax-+ZTI;4^37tDB7~fokj8hN0mp1 zf46unZfl;hO|7M;Sm62+C-FdsB5_6CsR+6R;vyK0BIp%l*vb2BYEhWVlPC@0JJkm$ zz>7l0=_xgtPRv+YY2t10XQM(@3T&2kfPZwHyujbNfPbVsPwa@_F-8Po7=;k=fSxJ< zIpo|bH?ihh4d=2O3_vV}5PbtdD{l-g5Gp{l@H6{MTaW#Rj75TBX(E{ftB1ETn& zhjgtmjc|a!Y1gr1u&) z4zWV$t3#4%d8>6mrEz^LZ)n$WIDf}LA3AG8sN~jLf3!S76wJ`UsZd=Z75x_JR&<_4 zj%EYwep^*b?{BYtwE8Y^yYNS`B3C7L7=&?<%qAuYy$eK}h`|U4#-_*V{+>;ap%y&` z0HOE0vnYKTMa4X{R{izW_daT(w!e3r?h&F*Yk$w8v%mNDGTYpsW_3i1h z3`bC`Z<4fd=m69r18;Ayf3UhrDwN{92bm10VgHa>)4e8u(EX4CyE8`Q}yzk(rp2 zTN>fUg}4fG0h4577}HK*V1JuMK{yeYAcW5jIj_*`ZIm2XNV!3M0wG3r1)Z1(f%2>> z|F6p2RWeUJaic&JRmjE+>e|0{u}MCxzAyWc5*4ljL73_{4=z6#T}8-&mS~WT~#QAl2pz zQ-Bgc&(EU_W^?l%s_i5QinBH#d7N3-D3S(=scD4%LefPf z|HdPN*NDal`1>72mI&@cC+p%lipYkd>BfD+{zR-QT{<+nsvRaT9*qlv#~?G!%BOwI zmjc=-R$7w!L&UPm0G5N;J(wC&O({&S6jxCM{hX_mN()%+E`K1xd>&3+L%(^drn*~O zK$FX}CiT_Df-yvFGzAfvMWc3Sp>|EnVh};`fOgKF%@n~5SNKu8`6@WJNxxC)XQNS*NeM7`he`%S%U zz1dv;6r=@1TWZ+Qo=C+QkgP5v-i_3i0m;fURIiQt%75NdlF<^bO||n|mrLtU^wZ66 z-Og{T{`<8w(SyHF;sRWzMB20q#J1|k@VBBHlHpxQwG4z_jeX#&XeeNo!m1K=mP^8P zJ#0XVpu&*##qCHh&D)Hnoq-czK}RMiu}mhDrd_v8jfH*Li>ou&cJ@{qY`lpm+wV1%DWfzqaD@EErwL{@LOgO;TmjVHKe$7~zC1uiQAn zYZA7J;VFH>vZ{3SPEH{4+3T-CQ@pkJ4Cdl` z@h}*0>xNYdTMfnq@PJ(zh;dYdl1DJn79z?h&0}hzgFdwCSWOBW@aT1b)&Yx~=Skd; zdqIM|t@F450gh7m^cG6c8*{WQNY$AFLWGD0!KRWMmK|6%=O$-z61UcvLbK zoO;b6O`qkSvKEg9UB)it@*OT!?@IZkpnsUgPp&isBY{l0j<9*CxB9lBydo*1uqt@C z63DX2LSh;}RrKLX0DxH%U>2#assx}lU5X9yfw7w#6CUuMJNsK~G;dszgHAGs<=9*kHr79j*vRK*I~e*lzJZ2kl|8>2{4<$wH) z=#x-}9s0vttKG0=&C4sHuHvx3X}ERq4pJt1t84!H+N!`-Cn#Dl)52I7CqD2Uum`dyMx>Ev6CCla|5Q%ZRJu7V{CJ zWm<_TJkw-8+0tYY+0w+7&4f}J=6{?hpsHQB9mdI~5|Fc^}8MfYGaQEyK9%UQHfzA7?S#$_`WV zfoh)$HfQ}YhDoyUnFw%rmeG>X>#w2nnlzdSfmEIYL21)bL9-o@ZD3LaczU*j5v}7}pc%ZAke? z8Q2)kzChg$27q!EOmLGv_FPUri*4{8> zidNZ#nXScOgfoN`3VQ}Ii6Yp@fQn-4rJRd^dR z$HV|>4zsj-R1GU2sRup6(BC~M(%s#*J7dkloYK(8VD19u0XA#cG!PXtYhcfATba$Q zB2LfP3D-K|+Ma9-Q!PUr?vICD1c0rq9K{f=VT2WhxE%^Y!v#3$Aj%+7RS3>BZe!Zl zoa8LRc0i4B2pdXt5Px|?H*1oX*@UN<(_hsTN+chs$P^peM{YJCO-L4JZ$mWbdn`V$ z>LbAKw%Wcl& zt5(tB$$s5HRam=&Y6zVG%U=a;=CF6hlHIGFFqLIZZWt=<5P$g%I)K`CK%Rhs8eQZw zXGYz4=^;q+En3@7@;uIZgNO~@qeg6;d!Pq6{BcMx+6#DQOl+9t6#kn5v2@thct`}W zoHX%{`%aEch@Xlztu4;j<;GMM)h3J6wv^Qt5Np7B|71g!!zL^zpW8BJ#VO+3$oU-` zq?-$qSy6r45`V5SKn-!JRKQ~KRWumTo@r=diwm0hd$&GPRSTSi&oR^x6Up3}jZg?c zgXYak^NDXO$=_iXY9e3FM>e6EjQ~|14ke9WZW~mlnkFJWghyu^&N(EGU_l3@vgU&0 z{5Z&8AXkn**bUu_bL^|MJkno~1;bn+kmE<{O==fY8-LDsw27TZ$hYuE{wJ`*Ij%^G-J_G#cd?pE^f%FB9rFkg8Gw9HvD%w&dfbT{O zV>X7WuQDkro-o;+h~l1x_&$&N;{o&;(qY^)N1k{Mc!(W3IxrE1zFVu*o8Z>MK>P7^ z6#fW`D}N_kM1z=NRU&-4>Bny?JqMUmz69@#;cOUmvdr7j2qK_8e|9xe&DPb(w@g-g ztK+EvK`hIbrRi4^CZ$^KlMp#FcL^hiS_KRXu9Ox_iMC;9Ds3)svN}8Y>gX73L#c$) zwE3vrU1ggsl?02Z3gReV^CyfA3tcicX->Xs)PF=IyEK97HMYQJqgIKW>1PkpD{viz zsf`qz4jEzN%xRVeVG9~T2Pz1vxRux)K>8u1>*2IRGO44OOedH$(}Py|F;3>m}HxQpW%Mh47x z3;`T*sTT+IO;o=c;hW4-jm1;q>yO_ebs5xXD~Po8o$^YUprtYv(}Me2K_ekSQAZ z6dGS_9!e64iRq1;su4VQTAkV^r<$p-_4DJml8Z^JMsdSt-WKQm)zwaYBSn9!ELe`( zrlR5uhA!r+RxUzK-SQjndLK-%xx$JmfkgxSl;BFNvRq$6#sfewf{|n{(}IO3{eKdN zYMPjqcuI*{hMBsl4Mb(Ug<_8#c?iAK)%#C{ocI5aI8QR-bpMYyj}md_4LC0?;?Riq zI6b79Cd}aOISevuMoW$30V*>>SL{%(-DoT-uEL@hz{*Nka(+gk@f&U5R~Tk`$)H&v zXJo0;@fnE7exgEAo3<5}d<8^zmVfPSJyTcC$!jZG3>T`9*)tRly#R|D!$=dgaiI!_ zK)LoQCIm|$uxp=_v<)d-;6{@g#-mJ%I|XX02Z|`02jb+G(Xh};Dj@-><#lBm3&{KDN$a|W2!=0a zf#sx=){UERLkYK@HN&CGw|^Kr_Drw{9gXms`kQ zxCjoR#SBi_YSrMD%5&bOiEiDBH8f$|fZ>^kBUlu3Cd@}$u(HSt?251SC?kLg3ia_o zQZbl)I46ReWK~d6@4jl-h+nylS;y6NTx0LpS;%S3ia}261s*<`Q-2mYuN&02+ek&1 zQ<1GN>l~`Isn#j-rkS`|50KdP3j&;0SrJf~Y~y^Gvt#IA(~iSYb9-Z|Z*JlzcI`qO zdXuRC>Xx9?|DM_TCWOky3F;0gb2D8qfUwpiR2!gO9+f6LOZZ2DDqS22km+u}Ujnto zHXcw^nuiQix|-C#oPTbSunYrd?SeS@0gn1R2Z4GVND5BIkz0<7^m5IRYBfs6*dLTP zNu{)LEE>_9%11UK`&>lP8W+<$j(}B)yQo1~pYx`Qh?jF5leHzQnl8^`;(bZ_q9J&J zMe``5k^k|&*Vc#1vvwv3J-Eoy9g0eUXB}svu zld4(H%4nAHNyX4z&p|b9TTM^`B}HlNUV3S>@`z@Q?g-wjIwA*}qrZ;g93E0>_t5qN z>Xwo$rfMpNR`NnxM*UXQ&A+L>ZG%!4f0AZa#>L)nsVhj zJ~fCjf|ZtC8-H6W3L|xm6h^3q=HAo&TD!fX4D~GxCDpeADj!Sz3Znf(MRaGFxuG>Q zf52xw+%?|6{#s3^tFrB(Gkd=Qh6dJD0v(F^cORHxcmiR?-hA*q0@}`z6A%wKNHOlo z+OK-ZE|bi@^E+BGYdIm8I!haV)&OI5m(lCMogI=PQQI@9t z9HJVLvJQ-3FaXC+^q!%M@wt8Nq(?#--^Di>+|1=!pBOS$Jh4b476YBKHpCDl%Xrl4 zqQaov-oC~I$PDjjjeyV-x?67$7X@9il!Bztfl6cSg?z(qIHq?rk7GoT(sK3W7wLEq%DZVh zz9a}e3fdi2L=YMDq3u;t1PsPvyq`CZFC%kot14V&#;szEMs}S9j8y_W(g{M7c6t77 zWhAqSKxGhAX%eq|c(C>qV%u!vRIg_LC)4S4_``uuC8665;^e`YO(+W}vM=#u|(+9@G}rbsCgJrNQHU zO=QYGU}FciRRj$HV_p?Q#u1`V#@6nN^!Vjox(EJ7Bw7ldpKx<-g9i%)FnQ? zCeO=vN`o5AI#DV728pGsTO_i)@}Yc%i+@-_;b{`YO_^{CO^UcFH=M$AB=)^2Q|?*8 z3>|~c#~hk(8!_B;&hn{*C3sPCO{!axYYu_5LCD&pA7)C>x@o@2YMu$Yj^-J0#u}qL zK&LnrIrswx+JA`$-YNDzDL;FF*lwIsraKO)p^h_Z=wmn{bDHIZjP(F+2zi}7zki2B zg|tTX$1Px-1kkptGyMUWd;nJ^snh=oj@NHSu<1CEKxtRQG)IF#6g5^e7fSh4dr*Xp zC7q*#D>3vcmEj>%)MkI#KLTiVIB7dueih@^yIc!hq^i4PoUAJ9o!qQ`4R`8tG8s7o zX0CBITv^$!$z4BWgmN994dj5G2Y+Mmf-}NY4mkib_>lNL{ISNPJeZ7sRYr~PIEqYV9i*7=B(@n!2IPIp3Bn?%pMLp}(Q6uj*1bCK;CRtUvKC#*Q*VcesX~{*f)8t^i zGA`#Tg5flM6#~DZpsNU)Q(BXw_M9L*_`cuRHqA35V^)Z(4I87Xt$NzxnkQ`THR&?C%YTdu%euS!0F|aD zR34@BKq$T!sXS@J6Vq+DIEl~Up9cjD0Xoh!j%G@;Ir5qSz90Y)n(blsoXkU7!#XEc z=WJ%ryNn)U(q%5o`Qq@OU^$g>p`OXZp=EVQXa=G+dGtV3k3*edFO7QNrEx91!?Zqh z@!2Yy4Quv*^X`Vl<9|^lpN3Zll2b>Lwd282buc)pjs!=KGYlNf9s`aZdH~qq9z*^% z9vryW%V|Y)jS{rJhIx)u{D`O8Th>w=Of^sNGl6vIM!|>q`IjkOBG5|%{L_LBv#ncP z%N-{mPLvby`xm%q9kpO5*;f&Kqb&{qhx`s!StZWq%G&Dl)_?6S&ooaHJ*S3dwm08x zVrc%=5v?`Ahd+7{!MX*6vg!a2uRnl$cmM*U?=*v|w)BYU@O3k}@KP@DoyMSU%+_F8 z*SZ8c!L8_W0W_MfcT0NrzLbVVtv{8l^w(qg@b|5K9r!VeWOgUuh^>u+f(5_(SrAZ73189hLAYpnSnA7XOIDFM!@AjVcc2cYuzVq!YlGhi7 zsGGV~qi6cV;7O?fG-=Y(7tDM zT-O18)PDl3UtzCj@PY=HbRQF9o=0>;C&EmW@*g8GvS9#I+(HK*;``SHzVQHzbyBzg zqq417>4o<`f=bLrRh49W`PLV}fp3DseWU)FWCeIMD0Zu#xk@jZ&Kc|Bj;t|j1MkP* zwV=o#&GHn^zroJRP3&g9k(HMtO=VZBxDmHz!GF;?%<4?iXvl`W|9dXGSb2#*Gsb>q zso-97pbtOyDcb60%FdM4j|Vocs%jRVUU?baxV!BZxWk$6r!gfYHQzilR5^X^X&uN1 zuTpLo@c;DE!*%>9h|LjXc6aX;VqV@dixp}fd9BXk{L%y2tDl2<)nV+3Om?a2c#PQg z|9`~UgM~S(2meIFm=#U#xN>Y!SacED$~yOY@=K0*uYUgR(IQ^sEL?Tw?xjo)zM2^N z#o@i&mnb2(=y z!#+3&3lKm+@HD+tEkcs=kxEH+%~8%E2>HXO;1R!#xSsV{74NJgZ~Et)peEwl!LqQb zsKOhGF^*euNs)w$p?izVnwqDrRAUjV9J_{@V$&f2Fo0|R^Oa3m^)jZc`*iSld_LG8&oKS zc|#7naX)Hz@T#&kf7RL=Tq=mIDSyoBst6%v4e8Cw4kdf@@fkFHFJ@iKU=*FT#qzR8 z|NmJcdMnKJ^lp-=^lG(N3v&#|uXDVp9--5!oCK+-vW%FP^&6s?d>G~M$prloj~Wb^ zHJp|#(~J}Lp}k!Jo61v&p8Cdw7~MC=ke!c5m{*<`$OIttNU)!qBo}LSA5_fgjkfI0vh}p-fM2 zpf~!Qa+I_}))=&t-!|x)di+!O9-Ks9^(C$=Dds~N^+~k5u$pAPs3E0<>*-1ct&Xsj z#ngA!Rj_aBu+24gpKMf8Wq-l+Tsi&JdVpJvjA~+n2@2Kdzzx-1Dw4eT302fns;2r% zTC0R*lDY=jkWyhXZkrg1@zTlkY#DltwRH3s$rd06ArZpYdEA5OTixecA95bzr*@q9~kqOeJoYUJHPv9RyyhFP)v(=F(6{9fePk*o75u&!?VQKE# z^kCk(8y`VG_icZK{8>13aT{a^G_*rP|2&BpXT*85P-nYN&8T6nw#d#PTOogCs%_{q4pXYsIvOa!<2SPWtuPcH#b$L!WW}xw^t>pr?pv%)nbffv&Gr$ zhHIW-@lgS>xmO(_F@JpKu=rm(4AR9aD}=-@1FJ31B4eKWHaU0cD67_{dBF3e#yc`R zmGwSVM;6Yyyj3!K;$k1I7RV> zoR}?XWNA)?EG=j~)$aBp3bFIOLZv+NC^YWR9<}hmv#gW3wSpvAHHN0q4t^McJt@K~ zl>S60wPIAnAM$C8BGCX zmyd|-giOr+8Uul(c~x6XoxyH5U1r>eo~Mfdq}{B|F}|gTezvY=hxSXvCU^8(HtIu% z`lhNy6DA|HK037%MtJ(V!0-R_G+PdWyurwO_VJ%x^CLtkE<7xW=@KwW+7dn0X?*_?c|D4Iiw9rIyY#ia5H83-LJ zIx8HX@7bBC??_l5X;3Ldfbwx+5O^Ag9zT_eQ>H6RqB5svztb0DSsnVdM8pu**-2_Q zJ2hSS@!%fpDaO87nLhWnFXB-{65h`dHGiaCMi+5UHHu4gHRynplt=vaB$#TylzWtO zmQTvbwbrJZP;^Vxp=!%XX5%5a%v?>al4!qKgNB!ycH}lvRi`biQc8V83#+Py;inkF z`LR?VH7u}Vn2IU1$!h%7WFbe|U{6)n#wS(bAG|ZZxB~aiBHH;1UW#!=GO2R$F@K)X z-pUHl=Zc}UHyaZ5)vq=K`+KhXQ#9s>UySA$ku=ATMrjRPrA1db5)QUu6{hMmDKlU) zMsD+?DcGOCZo(;j4CdE% zj2s5klnGOW2sK3@sj;aFjQi9Jm~LW-p{UTyj0$AqKhf@jyQ?)dKyA)y zzo@P&Q&TC`T>48(b~+mB)F_3)zYNojEWzN7KCx_w0?h{rpiJs1wHzdy5r6H~w7&I3 zX?;kKSB;GK>tQgBdvtM_z#ThRI`f?Uy?MHOK$pqR>V(#IK=t^c{9#-8I&GE?XzWmT zbPE5O6F?LML;6YTCk= z?UD;K-=B6grbqU&99AXMEn|P*|;PY5Wo1CaUoG#r~c;ejV^j>(l!d zsGeS$RI(&ZIhMG}OJ$Shz#Um#ySnRomwJ)^oBDZESNYtZ1-DA>xqn*jl)gJ)gmynW zfMBT@jd2pInlB*|BO)!~7&#B?oK_c+ARi@K+ziL`# z%u$V|XabJ-V%{t&$J`lCDMzPXDW*J_L_wj7W7O;v6o2Vx?HC2K=4lqUHcZ_*863Lm z*Ii83)`O>wj-QOZ8h=hy0Q7uvIaj9y=Awk@7@FC$p!cFx{!&D5oDsw7JGk%TZ=S>bH|W}S3Z)7pH70~y$tO* zohk&OI>=%}B=BQ~XLrL*st33z8&mKjqeK3@2GuWDlFFxY9`&+#RJ1&XnLPB4Uj!cx z(HAyk#ayvDI?mFBrMCg_e@El>_i)$cm}5n*A8%2wXDRF|-^S?Tfd-M76&cXgE{5$>{-j3^7RD}m6WHI}-GwU^ zh=2Td#bh@g#_Br9+glUwjZgXPFelokew7=L_xQey;}krrUAohw^%m^jYk9`P!RKY6 zXknzs;lnl=NcY6rDqJH1^q4h98rPOVxCX!a5xy{IJgR&aaoI(DrG9h-vx+FhT7w&5 zxTMdf8YYmh`Q@9CF&+vk~@dpgX}CWW(QnEdw)s2 zxMyyty>Ikrj!-{tZ+;8W;_HLmt)~*BTt?5deG6&PS}!4jU8BaCF?wKBsv!ph9t&7& zPb{M*q;DDQA8tP1K0Sut-v}7Edti*|2pEQD8YLWOfqeO3brrDizs_t!fA3C)z5^%1 zP(I$!c@@Ms{@3Tp;sj`n$#C;KTYvj8Og10%`?Kv`BK~jj_qO;ie)@Lv=;(BFf9rJn z==tWi+w&OEM|UzHth5!VwL6=~*XbafZ5xR7zhS%@!+8Hrh51lLdK_hCz1c(riV*F`Yznn7l@vr(_@Asbrc3m49b_!Sayf zZ4TnglFwC(V=&7;d<+uI^kFy4HXgLeRaa1+oHEpOKh{Au>CfVvfM(qX{?;Aau(>(M za_ofqTHeXGU{goCe9ESwHwdfhmvMB(YH!!+uZm{raVTf;O|0W9H}z`4s!pk@&g?Cx zLqcv|v-_-UeR7X9s@W{Nw0|hHDmew?KNDXm>cF>bRJ5jzh5?Dq_9WN*DM?i?LdqqD zDO;1g#Cn0>z_a8H%jgZumN(SoSe`MFyR3I#)CtmkDT2uJ{_B$5Z_~R{0%TQpzq46ArbM5|sq-hlUVY;;$@>)UeYFV|Hh7W;O|0 z_}P6&pVKqD!=ZS^gPrbo_3PKKU*FD(u5!7@npxYe2p?|nY~yQ%6!bhV+B%vbWN76H zan6suxS%Z*IG$J8_@mwgo$H9a1CPfL9jzehJ0N_OFEG3OAZEi@y&beG@chC5GGmVx~z${mDn_mvvgFP}?Z3h(YK zFirmdDXOCiIK&QjvQEPIZBCV zLXT=W^UBduf-c%xkl^jyb#Zc86;oMDvlEnGVfrL*YJUt`ONoy=qrFYaWJVvc*D=1i zE{aMX<&%WYXbr@foRR|HmvWMQrMGq?lX#qbZQR^V+uc@%LGS6)g((xg?XQLY8$2L} zyTV)YS}}lbD!-xw20g_kXt|gT@B~IDap1jF#7;gu-0sY$h@hJ_V|V8>y4A4e=PTWr zy)hYwfPZgJQ3bhgi{geiSJ*sNp3b6ZKp%i4S|tI#TxV11v*4}!9zq9;bK>z)wIgq% zta*<+*6$mEbc>R_g-9KXFId-tA@4T7{avHUO3KLCNJ$H zT@L08%9B_fa{6x}co0^JzICzi&A}mC+0VO8-hWn!Hc0-b4~ zr+=l-^CrPpTU#RQ+-RW<(-)_EF5_M%J9Og2c5!W~JZ*MHBEgJ*m@ynKBgShjt3&tH zOGwBBl~g2|YJ4_q8!*zr3U!`C421d>J|@R13g@qUD{_cYh`1QS3| zz)(2ThzHde+KLY6H=NeMIbH36bGb(K*W0A3zfErGpq5TM$gg1Xcqa3DKdb5_AAif^ z#2}m{C71~whO3q}Cq{4^)KZwoH7TE%S6)qw(^?voX2brigQ*2qgpPS|P3@pb$;<0T zWT&pac`msjWjEmvwL@?-+v~Eo=X}80JmSq0K-h=)R_A=_e%zzXYHajlh~@XXFF8fP z-7it)KNwNN9Scn5}&n|skgZ9)ug^s{iTmQ z$7FpY!<=qpa1nH5-GX#J{}|`@RiF6&##ZXw7>H4aYTKBR^kYF~yC`Z;92I(&a*8X^a zhtfPrWf)NIV)APHtx9~ga6qFA6&9<>5%%veH~fWrRrp6Xlk@`#hJWRLIl}<0$YEu&mZ_0JFuqv9vYAv0Pgg{i*M&#~C-FM%yp-`O2c`x%+^Av+`SaYI z9##s6q2~w55ysR{FDOA1 zbt?2u_#$vnuPcaEZGWzJnX#gAnR#G~F>FqC1{I>sxRN<7v0^PO7ma2-*MC9KS|@f% zq1*m|7~j)Egzj&C8uR&UPfPMtwX|4oa6QZ5e#$yN7>)LReX#RRerdy8QKVPIaObSB z%lIN($6o^R`t65OP<{j3l`R2Z3h6=H#eucveQ^nW5E)kn(+P0qV+$nPy4 z(D|SbCp!ho`M^N>jeY2En)j!V5XOf2Eq=m9;f=L4J!o-)yQ2b(@CqqT_ivHnG<%Vh zL&j5D6ZDoj_PJ83DUK5MUw5yRxjEa_EbJavd|l8UYTK=ODe+-8l~qgn@8)ve1^-4*`?qb?zRIc^L*7xI zp2|ste-Vd%oMr94&{dj8W=E0Hy5KKR!crvUX|VXS4;o3xXzG*ENX&LU1gShB-HK72 zw?Oj}dvEBN^}(v>kHreny6BI`8d1ssJbOE}2d=EZcz^u1O!vCXYJ4rz`Bdt>0o%_= zC6{4ra+XLw+l?Af|Dbe8f5}8nZdBZh2rl#;IyJ-`Y=o^K%;hi6e^EP5E zHxpVi1@_$*>I*~sDdl12NvKP#Gn-&aM^NWBXIzeJ^K0JS<1RUS_SN55MI_!NIb9t- zU}zic4K{~OV|DQt7WCw|0^87tE;Ln|womGyV1Ll4>@Fl0mUV+WPc)mQd=yer2|2r| zZ(~6nBThFYwcs^=kNpeg9PY(!)hA*3`;W*qXd+#B>4)&3(Y z_9y@9Q58m5Hah+Ujr2e@%A{n%?=B5}aiD}cA`*;(JiXNd%RM|Qf$d3XWjb3BE@wK^dCnPO7B(?nA-0iXiAacZfBQE789t7#z%4 z`{{ubtLF=v-F-h~TdsSReF;^f;t=eIb+ivCzDf0E$aTlI(GNp+5{#z5`r)cerAf|~ z?Tz%OYf{Pg>a5ycM+iN{omD?-qRf+d?SE}_@D22Ql?t%>QFUJn`zdX+3uO>2eHi$d z&4hl$)!a|(%C3!gqmhob%*n>NQ!y~=GaokQ3tOc7wyr^l{W#2iIc=2_!;QkOxRxL# zFn}v}=)VjGSrUSEKc?#ijo$v=B^6_3R2Ac<42L}lIO92+&-sl79N3v^bX zw6w1{$?{61vdlgM@Vw4&o*SPJNj^zDxmV2ijme|YnLWoB38W?949WPK-Vv2w$8tL5 zRjFcH!T*a(DM~r7fM|v%IK|0{09muL$Y%iey%;GlnU^nLioJP#U6j?1uz$%ytU;fd z%|MtPu`jFaDi=Qx@5|x}#F(L_6q6R&n6R*TC%-*-bMp4&lwl{CoTg9)DRU{?KUqNkB?S5<^>rn_F1 zQS5{8!lItDQV4H|MERQt3|#?jQ7T!_WStQDzz~YWm6NVnA_*p-%f}gt)NW8GzN#B9 ztdMo7YnQNeqbaoGRevx+{dmwtg(+Lwa!wj=3%M2~>dUDZ3NUYjo?r&LqeO5GBvX(# zhtCQa!uJ%2MItZ2`N27-(Ai?P%TC5Ay`n-&UEUWBCzStucDmPFlDXECo(5lLM>>*UF3dfxK4LkV~pw;r*({ zJD7g}z;f~rE9d!YAF#S$Qz1ru5LQ3#8p7<1prEsPRb!8x2&UGHP(J}1uXbG~7%pkG zK2&P98owT(4u4zf!M^ni`Q8J0LjjfF$hw5+MJ9M+EvP4eVae!6SOG+&55j6>OVVwp z{@Y|q8^e1eGH*t7Iv-tXZ&O(BA}_4c{|r5JXaa^Z#v6hI%vWn6Kg&{FaK3TV)TIZG3N+FwipA=S0DqNF5J$i!%Rk}&S0bxe!I3x; ze@2g#q$!RcYNl$7#f^V?C0zJc*$?UAqV=pQUB?eV^=jEV!zGoj`*p7OKBlz-lZtdH zl-IxXvdV|54<&c$n}O}>oKCZVB(^)|IF*V?b45#Bl2M1+44Kp%?~2u+h{IMHL@F=m zS20eh(0_BJye`nF0Vk$e8id@f`eD9b%?f&G2Mj*65g8%fVB7rZ4x5cu5O-dp4#*DpQV{&W!ToF?+(#l`)aEiC`NB9r<5-z*nkyl;ac;$EEVUCia zEsONul8$3ce8nBII40<-2`-l30;|sc6$>9+?|=N4)krWIchJ6X)m2cns5P;3xKvcfetevsp6b^YS<}o@M#GmN?OKgb71)ofSpCc|g5bl^oa!~_P~C82r{#~ISVbbqm~ zFotVC+3@HTd6N$D@*or)6lop5Jv!M0RZm)=7&0a2Rz=!^B3f*)wqi$s#Wa1Zg=A?t zmw)>*Q5uWo6mTTR0LE5wit7-AfhD@G2%)HCBY@pxugk`TS)SNf=;*v3S6T7CWGP+y3h#v@ z2co;N8ErWVNT~ykE0^K^*a~UIjFgoy^a{diPsMzM@J6x=xE6Uo>5BY5(iOQc zopr(5DSDp57=rC{tl>8r7$_(x+6<(Nc$yb)85Q$ncxv$-wYzUy%#Y&XpZN6P`i!6YjJqNLqzPH z*kLxG)_j@LpTvMNf%t}SLsQ$y5(%-!NIw)C@sGt&yrNH1NcXZ(sshA7wEcf##G^e? zxnfNsArCeKsrtx}jbU;nG zf>dBZWAVx?i=Ui8wpqkpTZ_d(GQQ^ZR%jSFJ<|rLHUm_&_)k2XwfgU!zfSTTs_QbyF6fvlPpgjMXwU*=J*0z!{Jl7xu1cia4|U8rad5 z5ujq0M++KzsI1{U!A%N;%2O5OWpArm&f37QGg&6(`1)2<692Y>;sk$`+WC;>So3P- zu~f4+V7hbUqpybtCn?8sf&plr#k#_Uu6cP=1aepN%L+G-5PV&T{Wl|={?2Ps68{v} zP@pNd7uJDh?O4gXqLw>IlC{nS%qq}@fUyS_qUJr8 zRuKW)S%yT`)=*J8){}qVGHK5^2q6MjCmVG&2UU1w5qv${O+7Uc zV21Eja00dg2$QS}NPJ_lOW9*tA|X}3vF24tpE9;Y-8evDm$!dHf}3&M2jte63sS3! zs0xB%${diWn$p$An4H9gOLDF{+YG|8Wp!ms5qnm_lf{0+A)=R{5^TgNk>T?B^kb@A zj+b!r3uNhfb~hAp>_46C91P&yAPJBw!tsEovVxvR8x;7kR72^sbX>*L;>ybH#7KK( zncUJ5%*}}I(-D6w*Yv{KO0p8IT&{>aNcjqX0#O)qsMB3x*anC<9lD3}z`L8#`S!pnk z6kh+@3X5vM4AfR+h}`v80T-GPx#ZiRl-BgSKo5qAUl@PBzK?KeC-D2dZ{P8O^c8v| z2Ta9B;QitT;n$}pAKvdAW_hYF%~&A-zzfyD%#e*`8ZkjgbO>v$EY%1R+WlJ$|Ar9} zppUTlt`)qN&{)vF6x3IPGnvX1UyOzV>n$^koJ}SY&-khqhi#R6X5AEB|Huv!yMeQY z9~grhxhj83=+zNYJFHToi{ga}x=3rA=@a(`h2%2`iAw=~M4$tU`0#E=d|+Qexa<}{ z@>0hIiJ4L4&JFZ=1r9Bzd&YRuItG6v4$<{Pb!I4Ziv7j7n9gUp_|cD)PO<+*or($Q zEe=FEYl>ptN&}p1tlhhn2j!sPfjW5FF;QkvR@8q)>5C`M9xL5}BV986lH7uqc006t z3Y3e3he+fZ%$7BnDa10<79&B^@IaInxi@3uww<64D9OktS*{BGxyYb5oKHV_hQ{&D zmCR+CsP1xF)C3a7QG1oB=Hu&#N_R;1bY@KTI{7Sd9W`^6m)Ev8WXZ%9;cW}(^KXED z25En{WZj{0Z$YJXxy0U6v=5fen`^mX%x3mr_%TqRsp2a)c{#P*G zZn5ue9Wy58zEcaOO`k&^1H%z+1vE<#0GnyU@r{7_*m75cjS2c~=moB*pD<-7_9ywt zWO6qcDnqpz+GCcqJ5m$uCIiF3MMP+iq8on<`Y|gWoO=_+dI_R6ZJzQT;?QaUyvORlY4Qr85NMVdIy zBhjU8*fronsvYy|nP7K+{-}uH(1(9yomt3YJf4?TWTBberNp`isuG(BRRbf$jZU}z zQkW{`GbOjhoCkY_@JbFM&8;rD8k5|m8u(+fDoN@Bv)!?JrGi^shMxRG-o*V7@V59Z zmAK^^Hn-u{x;x3aFSHXSnvEHhauIRq6Kc<=3RS565LJvGRTm}GqiWYja=w3*SzXJV zD#O$gM#X&UqqBCoT{X(1`Id4lv(MB3KzRi7^5FLe@6Pu3&i3x?Re%xKuAQMsF!pJT z$+_)a7W3Mco5W>7O6j^Y91n?09%k6N7amn$yQ~Y0^m(?Wpu$T8^k=echYUiXG4joE zJHiG@c2stjLAnLmFV!yK_keK8a>^ z&(njxf$7{>?~+^}C3X+NnG zgJH#DC7t91gAxoZI2T+Y+41=ZPixVstAV2#HNF2&Qqb13DroBg3c?d_E&37u|LJ)- z?RD?3i1C zd)$ck(LQxH@L5sej`n}WfL9QPNXWYQSR912sAMM6s5;dov3P!wckJ)d^_UO!zKlzn7<09S#eqKG2IVO0zD1JfyWG z&NS-*{**G0qE|*W$WyI2;S^Nq7>p#VW~?<{t2B!qN}&l(2UCBwPi5_h0#%UCvYakE zgAThQ^0)%W)R`T}s8xlAhVxQrPS6hPOuEwnkv(Q>jFRgv0m{FXx6uECHt6g3xGS32 zER5nuvL*>Yuc!mP;KDnsYoJ7Qc-WbUQqtTU6dsrXjAwv~2gZ~otpk?;UzZuQGL%bD z$rZiJ1est%L`r{=U5K&u&SEKfo5iTSNKrRFpaz52TWZm_U}7ZVCn;|f@1(}%@GH7K z9vVENjip($W6>(DhN^~^n>r%{QwyZyDG;;;q|&01Tq$2mk(Nx|@HVTsU#5A0Y=&#i z3B@x!7la+Jq#nAha*$`2cGwr`&`TuLHlP-05MU<{oHBo)Q)FAhMAnWQ8)Dsq?I_{r z6$KR*GIPM}=B#99$R|}dGZq~4{pIuz52YU|;b3{3%C4JV-4JE2F5)D^n89Hdw zGetCZ&Zd7<3)+_Q!l&UKcHi~a*ufa~-XDoK-|W5n^?~>X4#}UK{$Xv+SJXTQw>Z58 ze#(*sPN1g6c#f)JsgVk2R(NHLgk~(TvGW4v804AE!F|OI&F2O03DC9f_j)KDF0g`^ zfD+Zp8GgONl}VnIx-6!=5P*yIPA_$FN{VvtJ0=zhxrW)?Tg7qP5q0uK|skKBL;$QMikF5Yl zRbiceIQ!=0bi~g%oxD3cJ$em$Q%>HExN5uZJrKV3-+@=^cLl@Rns-UU+FJW%4B-_C zu<(Bk?TP=x1EC8$KdA0kF*$bH3UW66WbDNG8XyaA=hFDRr%m_g*i^2`R{@s3Q+3^) zWTHHC4*@5-Hy@aw1X03BC-z{O4?)5oj>5XZ{dlLHzTm?_GN;gq=Y$tgr!wu*`yiG+ zB&=WtzrN#WgT61`mo#rjTB8)6s<7YG1!;es-?=J0)WL3`$HSA;<2^J{uf*6b?qQjD z7owi7Ho!`B1SF~P?}|`N72{wZh#xZW{t7!YpeF)!g4dV%Vs; z1ee_b8Uh5S#p-ye*d-81bsDn%$@^a!KFpMmsG83@zV{|hH&b!^l&T$eJnr|$jp9AbQhK+nQ7=ZDv5ups$oCS)pqyTBujk@&? zdafMhqz?2+d;pfJHyD!I1EAT2Kw`%>{A0G1?ORoNq>uGV;}+6}K6XeR#*|)^IE#Sg zWA!@GBNI?Hn^ip7p;w!e@-lz9lIyTwt{yl9KsC|JrM)hSPfWqgA!YgJ;uF?Xo)TPY z1A&CABV1#!EAH(T|4JSnuEDzpVNOA`B(#>D+giao#FCin|VvVNICFoQ38qt6ycrfxA)Uh`}qR#`iGHi$R7 zGo#o>Ekj{kH*@N5RC=@?RBkNnW>u=_u=?>@6mNeZnLfgK#uEc!2x~_cld*2 z(}BMsZE2_Nq;?uRE75-ryqRCP5M(DY;^h&6DTHf@o<;f2*MK2u`wD=mYAtIqq3UL6 zTickl3T5lE1#1eN=h*_tN(Hy@Kh$Ba7a*J1L``^fpk$RkBZICGMEZUO@3a3bU5$Ii zSL#sB**yjF)gN{~pn{I`DptUV#Ibra-^_ZrSZf`kJ-E#GFR6c5NWUm;qA%6y{RO{w z1^G4O>D!3R_e%MzIJ)~^_a=)Z!QhKm7^KOPVZuV_bmkf?(O|YOE-%0sx-7GI{^Wue zcaC6}>e-ub4odhLAo?%5@!g#VMF{Wb_yN28b1dYusSg;@4L}#_R5h;#1 z6^#K5AaUeVrj37LuMC#XHA8lLnk~4!p6Yzb@}T6)OBk31!D|p!v~M1I#2tH(IQ92q zqjanA(SNhTDc$JX(?>t;BN0cpVTFvE71H3s^|P>Ic72qVI^sbf4scw}NZ#_%)8;TE z6h9ne3SlJfJ!qMPqFn zjm_JnV%8;aAQ|`5s<&@}{zMIVmMdDVZ~q#1^=9LNkIx;iB6^=X_>i~Mf_%DKSge;1 zd8nBls$iQNJgm$NA8yRCTX`y1K_^t{WD0akTaw>W%?s~T(VT3%#eXaD=`8dh*BIm_Qg@cnV1@9?j*?9exbQ+If?2HZ)ua34AVd@bDfepld*_~D(N4Jv9dJ`Txtf3@UIf^$;chb&GI>pCIWh`u7 zq|%grF&?9-54g#j{#t~jMn(kB&uTNg`d}6(4)A}Mgd~eaPi=maJ%cjoFk@DZ%Vbj1 zZP_@UnQ%ACS!hC$m?Y&5t>snM+08-)^B5FnVt@|A@uq_vr5vJ-yi3XJaz_NcuGzvs zidM0a{T{Pdn2|W#JAF@5j6jO2uVT-jSU~-ml{-yxT)?dZwQ8*{RqAz85fz!X>Xj9* zF&KYP6#3KZ^DU5m7G>UAZNmRo*AhoFDq6du!}Jz>s0bS9ot@6KfQ`dxc!TI0N|MY9Hq4-!zHeq%FG*kXpbm$2q_=J zp-cbOA&<#iPM24ER;djrfJG?1UG}L&a6o^19-VO4^l*F6D(s{zM(=VzLvgWza5j zm+M-SqPwdfp#0Nx0M_-8S_Go_u ztf`t<%HTxi@E7%8z*hHbF)bF-*a~Zhi9u{;pTHh+;FplDd66iY;x3?DAc%Ri>RWut z5ud^OR}yX&dBZ|JPd(|eLWMzm@9zAVu`u#~j)rZ;mU&v;Pv(PX3Pe2bgWD=7WZ-_M zXQ%Ted3>)ks*9UvDgUk0^;CGKUZ#I064TY$PX&bCKL&Z7mG!fPTluZJ$p*YaHm!L7 z@AZ6^fV-hBW!M85vshmC>x6tCQ3JMp%l{2>JY<|_QiCp|@-lo`Nq&W^x66y2Rg4D4 z>mv3x{R4t0S2cew)3*w^p5umm=q(+_$x46Sa-`b= z#b{XK9xVa1aVb$1{8pEx&|4q;^4LLMKvqQpzbVNLQgM^t!^{(Q>6YQR`Gr z`p+S;D&ETEvwTKXU^(<)Y?9$}qzSOi=o8&1Y{(TQ9TT4*oQ%bBQBkZtD{>0GZDZpJ z%}NY@z4u}Lr^CpZ<>X@x?ks<3zeboAI)<;V3;Z2>GkTqd%GviAF6qhDXA7}Zosiq% zDq+{7Crp_Z#l!lVlW|d&vVzQ1540;)3ijYMh2Nuje@R*teQ(YED*`=9Ja|E#w}IMA z#3=4y%pQBV_QzEWs~l%I)Bo};n<<|7izKMw2WoM4qgNqWnJqN*sYZXEv3tpX#F17v zlGDnkIS!q2T~{v3Wr2ToNkmRDQtldoG5L-pX32`&U$7$UY&T7uf&9-k%}(RNVs#i# z5A%4C0lYcg8$HMXde)rU`20pqCHZy1;MOCF_J8)I!Ys);uKcc>r*R(GVLyOt~fec!*yMxvO4F=$kLAy6ElBxsP-nCU7aW`;T`Qq z{DW=JzI{jV+znLj1G+9WXCKh3JgKJbKZ`3?RRP2qLV4IDK2YF4z0(93is1sHy1)S$ zov{!-EK5KqfG`BJiNk$2B<1KstG@|1a;wCnX&VaIWixFjs}8d&mwcY8=L3mi?aGSNp5X zndPF?=do|K>t(ilBN-oJMrG;q(s5%qapoaq&T0W&;5k(nj9(JIj(DP1MSQbQjZi3_vw}9;lEvl z(6aBB(b#`S6Y=WYhk&=m7UmWu9J^XV;vD1zIxH!|a!cL9rs{)wMY^+_gIKLgdFZBR zH}dMHLC7B;T#2J!2*2Jy(2kWChvyFG`+^jXB+ zrIrciqR$%(anA;z&7V`fEp9ps?Xu(W;hU*U%7%ZM=o5H8#%x>v1-a0(9MPwoW$khw4BTrWelBQ{}?7URi07N95?-%Ycky%Vx1nG zk?c*CzQ6E!Vm`jh&DW}P&p%U#!JzBMLlxjB_|lvNnd{UfA9Ks$h127rsE{5#03lN% z#Fu{!M`Dm*(InkUJB-|G5-Yk}Q>G{d`h-+YlKHgOckO9Va}3GC=K>^{BYlz48PC$J z1!fccroD=+E|$$o6kD-puGk2h-sZ`S!NdT{$q@P+G#<|{Zcsm6<;ZO@`i!Yxs;3%- zy%@k;IC?F^OGg#Sc?Eu)e!_oS;7@YQQM6lR=K) z+&_kcZZf=aApjb-zkbs7@Cm21MCR_L#yw0+og;XQ;H_0gIRgf8Yl{MSgN zs}P_K`;?83HgdgOy?_Rh=&pMGI#t4Lp@%Lx2I7vgRY{aHU;tw7Sv&ndbadKWLt8f> z6jg_+VoAwTER*h{x%aTztA!s}+%SKGW$so4=PPwY3fw$mloxfU0*tlv&`~!?%wGnQ z6txumod4K*3addWlk0)O@z)Ayx3h-)w(L#^PN#8rGvf`N7V0xh*ekEp-Aa4nB_G!> z_~-&%j1pc3aX7Fzk=RF{eUwj%H}kTDB)VD1NyfLmC`~+>|G2YgrOYPT2Vf_#&iSHLfK|)3;Z_ArLDUS%iZi%PUG)agYQ?v6%o0` zj0|@$rNfoQXR#w=7E$v$ha#6q$iCU`xQ`+HC%8$ZkMlZK!-=F09$>%(1I`z@{1aT7 z>(ScWlp8ivr7m_U5AqM4P2RRTFCP5GuGn-9jFhmbv=LG64 zpZn#TssA-S#@T;nhtYo)rky>u!&n}uxfQqd%oX=v6r??}=K43b?PspD|Dy2hDeDZD z4*3G#vAiK|@!fWOOQl*MOx4!w=dHnm1r=!fxChnOi+fks3;Mq$lU6U5&RO*dcmPV( zo#lD&xFHA@);EbY1@nEa_hWefNdci_`^&U=Tibloo zUXeE_?(N?m2Md2<-)4iQ+FA;kRJZCXao%K;dz*3K5^a|#p4(~Lx8S_Py4GGAdNqDP zceCQ-b+Vq{s2jEoNca-Z4Uo>NnjRMvT`;vmcL2MZr(zufWEge%L1dZ^U1)+788WA&DH*Lx-)+|iWK3s-A!d!t%rJH2@#cn zjaBL${VTXtfh7mn1>k&13cllN`#y0_$Rf$aFW#Sh%Bt8Ck zI=PD*5SzOF`^v7Ws9^-#L+_;mL(4k;Z$a3OGU_xaC!>=Y@uqWS8MZGC)`@vLr{4Y< zzC6L3(|oZ=BU9{lxgc&=+V8Cw@BJ3BgTNR}iywc8Gg+af_j(7$r_%Wdj3q?Wg}QH| z`K&Z(RICf5;UGxxUXrn39Q%Y#(tmNp<~T2o=p8|Z+R;AMg1zOp(rjWzQ}G9%j5Hz0 zcfVt(x4y1oa_NZ`!%e-RVjoRuk3Rfyi2(@)Cp;jrno-^9h_{c()V{yP`~RHV``Gc( zzCC|*;@teye&1q(J)qkN!F5~3=$6Hp`idWWp^|NmemQgtu<{yrf2NPLExPA3VVV60 zXp;^8!Zp+?(5bwUNmC*{rhp$>CVNAbZ(~Heg>5@C5V4rS=;<)QCggBU zM5*!;5_-Y_m$LpMf$s(uj_y1*aI6XzzeCl<%~DNwmCE)>-uC%sL+8x!25M`K#%X`) zuEB6}rzH&4f3SC~y>S!4?@0Uy6FzV`u7;L(M1(>cXrK_(q&!ri$i3SnrWgBU`v?&# z|BC;|Jof3a@79+DC=?{fd3PQ=J3Bl3nxUDdZ7e2oGE;oU|J)4 zQ|k-7SszE`MR*0?iNjq-H)zvuvbuk%iCN>G7!z`DKg%**oX4_Y@?W@`Le>dCSz=VJLcg_ME zO_Cby_&o%Z^xHEjGjG-~cedJ7BbQ?jw!gVu@BUI=Y88Bl6w>O)mZp8k^wj8NLyg=r zwUeE#iAQAOp7o3NY)_KGGEFs-^}dC4Qab0?z1hsElY2Zd(SJ*Q;_tFkxqutQe{-w! z579LKs$(H?14Se2r*DS8-@bo~SM6P+dsGMGr9eGk0EGFUTg|8B*%l@m9EEhK<$a1k( zj_ldi{{_KuQ*K0bjB2g$=&3S?#aX~-;L&O0D%o_hPsm0A$Gt4t>QsN#an=8?%MwUC ziso#Ahmb_C4<ul3~@y%fG zSk}mla@>eL^xBf+cDmC_nE0m8uLw80>vc)z`(;%wVLvxfzoD*W*4?wHZGI zex1cfp%nv!^w zPn;5-(9+p9DP7C>IIqVm*zV%Nr;Ls6rLK>svkr;AVLPoT3*}HuF#wSxbri71baf_Z zdPUA0vQoMstB8*!ehv*Nq1-63K(#iyS3`8#SA!UXH~E`6P}I|PdDHs^YJ;79ws`oP_- z*-n36hyX8vBHdui1Ws&SEIGqwG3(sUWJK=w`hI^-{VotawG2QLdy80CRspw!HKcax z?&b?C8IQzTQ4fp#7LSH3@G(VyX7@flQ}lbZ4YqZ}78=FzZn8ZPYqHDGfG52h4@;8) z0`ngO0L|0z zS#@DiRdrFHCEGGK#umXOdBL4+VRk5#jsUdpVE&+c8qPL`Xt`2Kk9wYE)92(c$`Bpw zGHN0sWQuE-FdxDuYB4ep2RU+30he*6$j9eyZ*-r<`IgZIk2I_ZHn2c8ZH4U#nPGp- zJ-m3VASZpq-CxSC@XfYVu&wuk5~>+M;pIvPNIIUe38up~4CG z#lhO;0UGwob&ea9qK8H;ypv>EEMR|VyYJzPCqyX*d=hevV*hP{+ovPuWD=S%%@;c> zH`0c`lV?UDJC2{8^~|wSfpx_I?Cm7bWY_tcSAGOBvK*7K=CBgxBURx)!I+zvm_d+7 zM#&?DD!t2iwO+$-M#&#+g@DsfdCu2tbH$K`90%NBzdQ+B9~Lox?XMSEbDn?l{ghEq zLOaGIZ!nJyhIf*C$@ZjGxw|UY4XbXqS$H>n_bz`C2HRR4?JN83a|`3}S8(S;YI^_$ zhCA3}E7WfdsT%&07r)%iv6K;A_2OynDSW-t4h@{ z=d?@6sMvLJc%@$v#BY|13_gFn5190PH5ne=mC0bx5!WzbMemJ5JNV3f;bb zm5WjEuh?Cc-jHokU&x_C?nJ8UxI;(9K}9^(#7)G zJg?91)JvGd;b0EXFgTxu#Dypzs&U~7IH42SISLH_tEzs@)um627d7=NI`>+1e&Fi> zSyC=sbNrG?RrwOK5qRS&egno{2Fq?2n{t17`O-(r2Bn-zTW;Vcl zPUm@(s0JgRgqNVqMK-hn7ixN*6?uJ;G^G_k9yZk~-~`yEiAg6NkWJuYIzVxHs@ydK z1g}70>ZYR0Y(d6?bf7%nYspiC(1QT08OVrZf}4=KB$l>~=B~I_En=RNi>sO658N(? zf5sup-OVTJQTKo1p{!=+X!4-oQ$C1LGg*a%`}et8G>ELeDyAfAk`=H~&N1J4TjET@ zJ#MyI`@oH%f%1JnlrIVGgi4()a<@awZKhBqwUTiACWJ=>Bnhv&k+AnYRYP54z+BHa zIo!IyY-X}Ej0FAql!p~QqMA=tO-97^O1wBe5aKYmSw4T@$Wb+N|2!{d@PEUIedi=4 zSECV`s^CHNI61*|t9VY%7<3BVX=$$shN_Y#dp4E4xdGwK0a!%U@Kv4VVn*LMYj2@g zIQRq4JF;4(hJ&O1;}d|aQ1i{*zn$a=WUQK6Ga=ZdAyso%DAr&mXe!YQ# z)5|Jvt}K5aPrf}kHqG1#e#sH;256e>!&MLa!M(iU^xE?)Gs1O95_RsWk59$&@#W*g zC*N5{_~&hK5-2j0X|u9t5;j@o_?~A9{<;xYO_iUWfhNxke<526YRdsO)Kq`i8arQ5 zMwzsF9D0xvgDkJ-l&1SY0E-XplY7Dp7A9q-6U~QSr zxqY@H0kt#3_=B%#VngzI-q5ghcedo%HR;5xH3=_xp%dD2$IoS1JtyYb&f`JR8L&YHn9bx+HTk4NfY=!3)HzCgn~1!D zDS1e4(lVAXtBl7)eB*C7*7(ALi-m&lZeA1fr0b0NGE1-r7ZjL=8|nFPMWTvnwx|&g zzv%g@*F=kQFh#n;d^x1M&{Iox+@OYaQTT!`F6c2-zf5Gr9+- zohv&k#^WRBx#I`-?!pa5nNl}gcVf-pY3jt)HueIQTKi$A)C~-fwkGiAvUHaf`6dhH z&RW*gT)*u!mpW;1M`ne?>tdVu@yb%(Bq5=3XdEAB<|LYSLO&_m@J|E}5=WTujNgAr z(-cRN3TGvwY0x)Nj{vADy~rMq-{{0e!+1S1{iu}iVU{04!N3;1n;ICvtrt#tax<=o zaGhDF1!*7*qA_HTN_yi%^=vh#!+^2wq=_VatIxyM-Cg3Zeu8N|4$Q*B z6I>wkH`>GTz4V?xF$hQ5TLTqSLTi8DefV5ArK5;1j6psj*74Y;8w#3GYUv02{g>da zHL7s$o82J*veG|JdHEGmHgs7sWXfOwP@Ol)I-|e&!rgy0_symy81cM-`pLYc+n#yB zaU7xN*or(vprAbb_op8dzmw;yfpLEJS z%?X!3$-QmUBDAxiAh^Ia&zXIUJX|Nn$q08GU1v~(dRNE1v5de>vEOau_J@4Gx1Bis zm8{E2tfLu*c?u})E8TyhTrB5yAB|h%&v5#bg~^3OT2*FF&2`U^(z^W^MmCf0CqgWC z7nFcpQ(2l6JH@@uqqrp;k;T0g&5K|0-NG5P14eU2&Rp12+)Hh*9CoGjXnQ}o05RcG zOP!TfuIkoA?-EmoOgd2q4@r};zSIs-w4+X&VBnME8b6zxUYLKCQ@Srj?P2 zdFHhy-r$yf8v^`5iicuzuqkvmb_6Zva86)>qsv6o=RY!+#ZUI49jj;lq|d1>^|=*K z2cp0EtLtxn!0mqwozL2b2jlUKDMPD0l% zL}g@db%1I+nptol_8f#~=4ziHS;)(>c&p);s-BT|7MOqQqtJ?+rG1~f0@lii07{O} z8d0L>6J*G+VB(Phgg%;(P2jD`wx#*0Tw<@-(WDA!V1*a~7n4p6?G$@TvnC5!biC68 zGtKllE-yvP2w1dAzai%3n0_EvuLh z*I~C~)joeh=ltv)ofLEtDIFLucw&WeLwkOuDx){7UQ)IAcso4bhW^_7?jX7UaPQkM z_mhVQN5_Yce;SWNFJ@WHR5iaMCjy+oGlj`Btj_cH2x8&FIt6|d4x0*0n||7u!9ZJL z*7?x2#X*qyL6O7wz{uTfMj8sHmJgONR0UX_nni!|tenr#@1k9Jm0G|PzVtRb=>yCg z@M5QJP*#2T=gv3Z+8H3+0Wxr=l1szwBA}hu%@!Jxk{_$I~NK= z_@s;T#b?Xik3ad~y$`p$AA7^EU`j|uFl&DjjlB=!);V2|ytyO@VohICeNfK-TOF;M z06L$6Q_0rEes@p5Epvgp4ji!yu9$kgTrA3pk9z%cmnXHN!Eak6chebzTY<$czC5WM z>82f-wjG_94gBr@gGWX4S<1895uY=i96dZdrba)^vHp61hX+)jLib<}``tD5kN1DR z-aq`}3xatBZHZy((cZTYxF_%`PqMof;Qr&iqlW~s|BKRZVOB%zf3<%f2M+-~2CJ;d zP2XJ!^mzY^C;N{MzWoxR&`*zQ&4c|tZq0Z3ylfb1CBSzFj}ARB)P?)m0#yef`@v9M zPVVo0cl_k>K0%s2e!Atk3i6wSqa%Ni#R*K;kB@!GeeSRIko&sBj?417wjc=DuN8-f zU!RZ>JA4#&0bd7Q-vz+z;dd;bylP^UA%IZ~|<%J@FE?2M#^7!)L+kF=3lka@c^JOzDFF`-ofj)e4{NV5hR#1QTZ1ypT zDJ|i4`!wg#-cS3FPvB4ZFFJM}^dpu1s$!rY?eBfR--fZg_gvnR{4eW}TAEls;lEi-~tZ*eq-C zyT7iXWsUD`A_f!TCp<_Zs~vwjw9KpV=H0BkmyFsj^)~tIJ5YpwggEPNwCPHG?4uJ# z{xc5epBia66Y;XYE73$gqdv)J0GvY+UTtZwwtTn;(>jICOWJrKt#u385w`ptX7-(< z`}^PSKmKW(v2z`eIn1GL3@?(ha-WZAiNVr%)Bo`z?O;RKYY9)T-`0QgR#rA#o`vaN zla*E9dTKjeB`M@e{|?yc5|I>7ylCF!7zrLZ^rcpl#9Fjp?PHR=Oo($m|9tV|l7NwQ z3;x3BRvzwfvf%p~5!nJ{ub^u57A31&0_f}7|K;lZg-Hn-zlRXLVmH;0Y!50b z@0U1Jq4fMlOUn)6txB1?nBL!R!c67D`XYxFQ~G=6l8Vb zn^*IkPVFmGtp+EqtBa>4ETwT;c+>us)?n_Co%`mC&yB4nq_=8#ht|jZ9pKg91lm4f z9fR?1i3*KB%S&L1Fx9-xD94d0U?Y4jinx0CUB)))y#6uq`Yv!VR&!R9#wL#vf;OJrqb%q8Vaw0a*_-QP!5Lt~a$r zrk`O#Dh0dV&O)X2c9x0Uwv7c=;%qFl6KP-pYm9*PmZ8*MT#jC4t_K)|>hEnphZ~N$HTO~;js~J7GyF1|zyjZ~f zHGR&9`%+t`@L2suWj?m8gbH6w`iVX~7)JA9E=f9EF%@Ev7*n*bOYfg1{TW z18)8e6F%-MO41HpOrP70$6@Nm`jJPGRc)1O0!LD|DP0m`zzf6bQpyJKXxck^RB+ zUBFKkV>X-l-x*ud9iv^cN1!M!eWj6uvN(QiInZ-Ut*5%~&nXs#0kRwj(_|3`k*VvX z=@7SlK}d=bgh?mDA~L#O4*!5+c+=A<(-OaKc)fya(CvvZ#h~BMLRQcKC#H#qL!@l# zlazlC6hsOt%Es&B+CusH_kd5E0RM;my{~mbiKg`50rZ67rqn_zD}uFn0?x#9&chf+ z`36`EVPeE}v$q=^h1mvO!-mkScKcd^5_v73+58wzMyj6hn{K|W!WPj)9pt0&K*Dkh^jqE9?9D7Z=rvG>KbMli{#7$UC-sOK9_D}52e$cv#l@# zA5(H&MGW)ap^HYFYST;oteCpoTv+U~`v!OB(%~i~$~tfZM;?C@Yf^=Q@GA8hi*~M0 z2NS6HHHN{!{^UqpF}><89QW&mJwEsUuq4cqU)F?*vQmYiTZNyFdUn>;NsFlch8AMiDxLk;t zf0y-zji|&vQH;)Y=?|ZQ_VnT2d_MB4_4JjEvCgg6fz~m``uc9_hrLGMp|qS6>>hl% zh=i^?DF|V-`y?lu?r?<85iXL$0{4G&!>|pyL(fnpB6^OK*qe0=T#X0RotgQ$N|2Sm zKOa9@gCLNCUEeH=Jk+Sr)@*KO9HWOtz-otm5lU%5%F4)K6pCaLHow!}ge%t&K1KWM z2emX)0xFXGVHK$j4q_7u<+$c4)}cXa16Y=hZkV}QH97&`oRUWv9V-&E#qfWleeTP* zDdBGu=>-{2u(m!Kjj<-Tu5&j$-6d0fnvo_ygp8cy#ekxo*iSaJU+ZzHiE&4Cy7M)g zJ{zFVUt(wF(^0f0xWKITyR@@x^YqlUW@EtBPs6_44S5n(`{vwkMIElHx9z0gv=0Bh zKHG3r3;p~-=0_`?1HGQc@s@vr19RTD+cxMbwTY}qqk<~ZeW%K6YYo=<5WH_3+>EjQ z8&BoWGuABB38{5EorSs{Pd`o&4&s$JI| z=P+EvvY(j3-|{Fa&1ddH48jKi!0dxis=~xI%l#q3+ORuk%9ekQNRFF?8S_GzC5g|0 zdzmds_t)i+K;kp-N=3k@1nq_6&)vkxqwb+ZWxb?2!e4hc!y>R-HzA%-YGi5fy9r;K zL5!{gJU36iDQmpi_FT=c04TS|42Xf>^yz$zJ^V7F^&C%Zgi}Zo$6X0`KC8BMf`60r87pF zE9O38jB=*yoA2?>dhI$Y13kX!w4=kjytJLo?8Cj8GdzFLse1ZaO!xnyehdC+`6v9O znmVWLn8@%Dy8+NzuLKaRR}brzB<=RPH`gt~9TlCM;J&SQ6T-j9;1Cb<~jbCpnzvck`+s7fZzS&58Df@ZD9_AVFR z_v`pWR05O66R6ZQ-q$lXr0FrNc!|mTUnv!KL46Jb4}{&ug0G>eH6P&R)Vp1f`%u~s zcNgJ4K$Et5MS@#}@7Xb8cVqYIrKD_0@Kkcr@9Ikv(&F?*&!*#PS&3WkfvhIJ09sh> z^<#f$$h-F=`yUcI*o4j*o@0jbOO>3JCi9)WJPfT%lWzb-K)b)oOX!z!L4`+EcY=q>! z$-eJTyO5yFX^HRu<4NQC^Z-dn&nz-SqWS3np8ZvF&?{enuEF?Gb;J4_3OTRwTIht6 zlV0XEo^NH<^xTe@nL5pu^Tw(@QrMKqG^8z;PX4d8`#IKn3aG%6Zr#u36d7J>7tLE+ z{%KZ!*OQ3yF|K+C5q-8Q+gu~4Dm)86vYw)D=Sk=%06G)OiU*gRB+X4sCsH1-3 zPPVo?irvA|rd`(YiZ_vzbc-j!u^Wj+R8{j@b$w3~lS7SjdWW5dN|_gEm+LZVsw*_Y z@L@&@ZZ%e)Y6fY&7_gNXHtmsoNHn-^`m}q0f@Xq0_o}f&mKB`tWz_nKH( zH4X-x1EGSjE=v>VHm_`r^j&X22Ch4>u!wYy7r1R(ysl3wry~?-G~ts)ybCi zl>OuW#LasYx8PHB3hsJ-#dQYa^?Zwe=n)z<1_zA7ZaHo`7NbVv^?i*qQx}lDg>5#D{G7zd z>u<7V*t46v3h{Og%+aRW@=v&b4!7Yv+=}}U2=L}yi0h54>$wp(J>()?`94{0J{Tj1 zV-NZWZ=)Bd8{{FJjag9M4cAXGa1R=tV1Y9QL2Gcuu!uSwU z(c#NznHwamz@LF0AgNoC*dTTc!*2aDK%gM)rCsa^5P=HE;zNRI(gVw<$t#r(`qqMWHS*%e8}=NnW!LoP!&j&vYh~ zX^GzMZ(za@YNj%@mc%SKkf~pAcv%olrRhw8qZ&9=U;rtP2NYbDOXEZ{SG8&g3qPI5 zC8N(&VRd`PO_+Gb>=v=SsI|S*xUfD65NXPLkqC+E`!| zsGd+O5g~p@5=;|*AXChcS#4yA%Id4+RH0l>sRifRuU0H91KaJ&PU2eZPfVY1Dq5;; zgjTNPCY_x zV0}6Sh;lJucHByTrUt$IHLG&Erc1*US2g1?{9R)cNLRJuGGp98t6Y^LPM>8p>OLMC zUY5x$KRs0yp!f8Q912!6UmvjFb{xhx-+VJUF12z2Zx_(#Om{pcxml%shL@sA7*LJI z>3HlRN|G@IPsj1{CKj6Pd@pvAZwPmtSkxwVNI6$#3?`?4pjc@qqWgz?j}DF_P}$_U z-FRqMq8|qp*WIA}#G)UT%j*>SC&xmrfU|WZs4bojA1~VojdKL4BfyuVLo2=|#Q{5Ae=Jq;WJpgM= zuScO18W@IzM``D7bU;zXx|Ml6CajG6-ZrDq=Gma4viQ-Zp;%d&F=xRt z?UOZKCY_n^m05Eldfm6LH_-K_85Xak&CT&Ter2OlEzzH}{IeOGd1t)aO-y0!^8)HL z=jBY#(QZjr0|~#f-gP2BlGjBwb+y}&g3siC)J;_yxVU*ODol))Ab4Rs`@KhxT-Ony zdijig_nA74wuScx|4k@ z_OHmCtKZag*(kT@NoLCm#A*O_g^l#dFg-}G4A4uYUxwvS&!pXaPun(j6XUGgCI+s5 zbDHQtjSD^Cl(zFEDa{v3IP^ zanr!hWrqJ?(t%0B)iepODP)Gw@(8aoB)~v{j&tWEhRZqFK0;u^Z)YFY%WIuw-z6jf zL!oD_R;$%&wYyqLoubfB(;2C_Sq;a3=_4&XpusFFzv1Cn2+lh~pbRHAgbuURFkKFfx$OBE9GFexR_ zyC9j|Cn=4ugZh)4{fAYb8uCuUZmG&6Qv0bps&bc99T6O==H6g6S4Ygc^;~~{MQ37d zPMmE_VYWzb3dI&pO=ZT!U9&bbvMrmwE`7$>!{m@*?}7lZB zyQNxaJ~nBd*SnGN*mJl%P3j{)ejS}IGN8ZJY2-73Z_hbRWffS zDMSWJ! z;}&Qc=Wgi41WnHI51^a!iVEA_bUIW?%h`Xol<6puM-Ceh@n;4k{E3&?n2izIOu_uv!kGh?GgV$|KUc3&r zDC2boCVXYFfSHn14SvUc7=D!J(-icxBPsjGbWh<(P?wc1`HDbAc2*MHKzc(*5?E`K zyKWONN7XIm(e%#|2YTTHB66%NoJwVtoSl;m!1+7p1!Z<}s+2W!s^IH{RBfK@c1 zH3I6sod3E!=*<*f>uh68u6eRpu6+_lmC}Z;^}r4(Igq$I3lhOZQXj%N3~|tRE}jO? zETWIuutUr$N-&?*~bqufNQ#<}%_?qN;^VvDPl;f#yzn`;sy%Z1V+1o8**60#3 zVcg3}*AdolwSPgFkSMKY^&8=T`p25SW%374FIr;L;rKT6EJ$P3VH>*VM} zA8tM5zr(`5|q^uhcH0qm}~ndTcUjk@Sf%hErA#+v?zbGS?tK66mR`_^g(xQEdfTj*@h zP($cuv(pWKb@1i648m`hY?WoDBUsjMgbs0O)9#n_ym~2gqV|(#rnVlAa^1D%Tvl6* zrrD0)_n)xg-n{6Ru+eq4wr5zk*0|-lgNMwCdOZ7bwJ+1aTIk|cFpsdHoxfs6uvNcb zrDp=45^OPTEkWk8ZfS#8)iT2Tb7vkG+h zdRruuEZ4Ee3`T3w%Btgk$qZ)4Z}~5&xlfuij?IEsNE?q`^mCrgtjhHz71KQbrS^^3?_o)+ z&8PLJ=ZFuzq74TrRxP3V@u{K(##z6MV03y`0`<7DjHuHZMU6^0Ed9MO-ld~qLlQTM$B|QfOY4fN-D4&BmRG_CpGySZhf?m4i5G{ zVl8jrM$y(A(Z-|097tZ@Fwi_ck3LU-OO#i;5vtLI-0p^iiNSxBeB&zku_bfQ2aYUg ztzs0|LKd=eV_b;C?!9Tn(SfoX67Ak((vDO8Z8=#KVurQMRSmKOedLg9APqdKB#aU# zv!3xvrZ2!x^%%w4$ig?W*@(Fh5x>}FEs7kGZnxI-)Oq3%#fQ*hL%Ft@z9VEn^jPD4m&#M63H&D36n zyK;jO(GT-NlWq^j|AA7L)4`#CQaKI$GsQPa{>1@P-N7DO*>W+vITp;RL19yO+PKGJ#^tX*BO zR)~VoVG<DND3ck!szCUUV569XEZOqHD9KETJ*J!On)Yf;&On`IAd72cYZWSa5n{~91 z4+6liq^OMQJ;?FG%Hq;?skwUXa8IGeT&R8=pZMl?&?-5fc7Ptnj)%07ln2<2n zpW~?Tpd6s}am(xpV{kEzH?t>DUF1q$Ou#I*aD4!BSwqk*((3W!C^6TgHIU!(jRg7w zx13_tOLO#QZ^CngwHDXUseQu_gTQhYvl-hL^`W2<2_W%`%@VqQ_$fKAQsy|=fSTh+ z^An;mpZ*4OGB{#S!BxK1YIKd^dv0MBk$IeL{etOKn+Y%tscNQ--3IFe91oz6?a}yW zZp|ONqw^2U3i&Nribc%z@AE9Rnhpx+ud-h^x)0D~9a3kM6^oSt>D~;G=f4CF5%BjC z<8A<$!qsmE96bJi_=6{3tE*cn4V;Ud`-pXYJ+}6Y3f{G3BgU?Z8p@fR`{mv=LkT8* zYAU)yRc{c=A+vGGjYNaaGh_mX-0g@|w?-Bvjs1?1jbdQ4Jd*=jX277v_2}0>Mxe$( z^*zKt(Z&r6#`eEcFt-0O!Pve|!LW$)MY;@x2yfZdyKPZ_RNamtN)(Ggl|iYUx~|2I zf1$lq|MfbeQQezfBG4kbVy2jsWTw1p-{~G2g+-Cf=oZPUjs%rdc(PmN>m_Vz+u@zA*0Uiwd@$3 zRL3uT*50XqAMLm&qGHHl;-z zmu;n)26+))dTin~e33%qQye#h8El5TonavAqZI=3irT2XA-UsqFCZpZZy5D&zkNnh zvw}Pp8i$(Rqy7(W&2}C!58sz{uZOq_UC4T`4!3`Q&oyL+mHN_`M(|IyayRs^9K&!v+u9 zb#@?yP2PsC+cs~D6BE;i1&P)4mZaP=n_iozA$I+>Z7kQ4=(__-E)Ok0-A+Wv&g>%h zVrd_LW>U@C+>9{5BMSQ77k%5i`~u8IM{$B2dXzT!{JUUhW~Bh72Cq*4MgiYTFxC= zQK|^tI~|fKLV)%|ezzxSB)&~qBQ!)RX+(H`F;ps?7rXH0ayfWJ{iz%b@P8)9sxmo< zoy#S1kjlBvJPvB$A57z*_C>aXDPk|&{0_+BAh_Wv98~>2O-<8mc>cyJI&|~N8-`~< zo6$`yNg5z5bHlljTwsuS8zTh;~<1w5lp_sQ9yilmCn&p{jWW}qxgLEG|w zVxVjcOJ!>ihCyvEo2o&0`fkYIm@sVr+k_z`L*p8RAuv5-31KkwdBVa5Kt_X2S$7b) zk)XjwgYZi=LhX(QE?i`Z(%-HnlshavgJ_fiR{y%wc`g{=4##NtSvE@@+wdZ(-@2Xx z?&Fz-pV8J46-8=bCU}lmz-TOO(DWc<9&Ly({Hf{iPqZP-~~Z^l{H-9T7dsF#t!7Cp1R!*u2oc zwWlx0dWPs+=bZz_9!LgC_4VXYXM8#I9CsvJbYn+$gRzFSDRm&2y~Jf%lY;<%O%qPV zle^=@U6Epha)Pd;d)3s8))t;FGCTW$N1B@H3!w8 zy?%KmIdf@SToo|VkVeY5;#K>9MFVUb;H==OteSkZRwEFj;LU-7o>=;BNZy9%rW!SK z1g!hi{EZH$2w-a@-acsomnvfTST2?qH#Tkx^P++HuU%8fipAAPVtJsiV*S!fQfDo$ z!1N8+C~9Y%>U6;Q#DH*fBNV=z3VfhcprlUXfj3Gtv9gYQk71WyqL5X8%!Ie5J6EdL zLW^Uvd-e=9a7K;GpYn%a;UM-vW#f^dxVcq4H%hK_;>Z+2m5ymvP1qs z*RQ_;Lq44J9>W|*Sl0$#G}hdY4GZ$A*|idbULm`7!~S;L>epte`%T2Ug+8Vt&qGan zFC+5B7nbo1hD|H-3x<0I1AKy>9zlpdAkF{lw8%p)Y(o{Yxrvs4^yVh;_>Pyew zPiC{Ui1yEtlk~^+IR4?wA}ui+hcYF8K!SdFk|kU5CtrTF;dzslZ{SMcPg-K#j2}b1 zKvTW2-o#~-m3o7JSwA^EyP8z#BZDZ4HlxF|tWaE%nY#Ejvu`V>>d_HM+5|e6ma(q* zWdTw$NiCrCH2Ez9X5sB$XDK&KWR}>yF(uzm>qHeUK#?JP(CJ)Fh?7D@R+w%}7gd}e z(?+SC>t7|mq>(df?Of0|+fFZ=JctD>tQ(bti`D@@oTjpWJe;e#L*<4*LMpwrl_wc+ zZ8pX&cPgEwNkMgHcs2pBAwSM@_z5x@P=B0a#dg>@HUq#3OAJ<~?hJwP1-avH&JtLy z*cLfY$Juc33oTM^5J!n_(iWf3 zYaR2!B&+hGy(3?Lv43b<;@?guN~;qI$RLsp7`~om)qSc=EiUc~+c$MH=0iw3me>ci z^ySmfzWeCu7rHI;sjam#{dJzAQ0K>@t>ltsL+R&#=!m91J&z4DXL@;(&%DoGM_U_G zI_1Oa`kCn~TZ3g~O+5SspBz6bF(tE#j7XCJPtqcT%rzysJexA!Ry|9TSyf*moy}k> zqnf95P(vdS83UO(VR;-*6KIbl%vEndsOd#qn@3mc8;_!|_>ppC7S)sb!8EmPHr{kgEsIpV0N2g}TswYT zR_Av%qCK0*=S6Ly4_Ib`L>YJRd9F#+j+WQ5Bh&jNTzcb;l`9+CiVMeFc4Fe+aj z!QXcwedFQF(S}cy`~-fq1cB!;Ay!5qj{N7zGO)J9Bzj%T(HW)KlpumAJ!Qv?MWJubSO9`-*h5%Y%llLg=1X3G zOtM*0iHW>u@HFlxYyl^A|0RBRnuyN5;Z71Z#*o3~uk)nnQcCaF&<6#IxkD^6W?kxW$)w+Uym2K7~$PC>+IL!+Wdq12eg~5cs0x`9% zMxcA8IV091p=33RRoXpfeREa;XdvT%cxE~=YXH4!&s!HRZQi+;U$ADR#X6~w0Gxs6 zX@TyPJI34bmWMGWJ4_C?0gNHQio;_bkv79=+5qNrJ{-}NA1pxDFQdeUf($-iw0#ZrCm(r-{?I$&9 z*(``}jO_F%WK{Sr(WL>F6uCLNpE&C z#G4(!s`vi9em1?aA${zDd|HJ&PT0otf?~YWG@0n=5bvTW#GdHUt!DL`8*M=bvO5MD zO*R5oKCd+{aSOP6gTah9=%$0R*AWufmykluswLses`(OYWcZM&#tVuVPju(`;;2 zH4T597Ac!(R(CDJwjXZ2_2A+5gYCB;MYL1LSvs4WcEECdV{;Q{%M@^zHrVt1l4h3; z`aF(8Q167J-U&d>!WKX`1NNnyYX#8GfPJa2=XL=3HDq7<>uLdi9gq#k9=NS+HCs{R zESCssFu_?6FN0?%5DyPVJBBF3UF%UDhg%lkb{M`lA3S{f!PXm%`Jj?JdR020D6k!( zUXL0ddQ;J;-;W?WEG=q^CGtJkxt~u{BAL%TP-?NZKj039cSruqRt``B1#MX zLhSk2(6jm3QCbLpPVKcv<>NXikH1V@{@hdqDma&h$dA; zUj&uVK7GIPa4dG?&60Hz#PEh5meau|z1RNx7PSFO9I)+oI~>10O^>T+0?YVDH=0Wu z&E;S;zi$(oQ!vQ{IR)8i^YZ{SmkyfCb~KvFhI=9itMc)GGz6#NnWA9%{6T^TYCd$T3`$Av~XvFOFHcVw-Mg%$@e3d ziaeV5WA?5OO>Dc$(Q>GByvPGrB^Q_^=!xBdY^axi$sKXxCArxFYERp4L23q}gP0mc zMyd!q%alDP27s|Llpzll^@jyVYut&;8LfCG)>I`ibk(ydQ-j(qk2`m1RE27xw(u`O zgGnBMqB3YaYuH`&m%NA`_8e=XZr5m&?OK}9%1XK>9=jIX{DFl>^rk~yK9hW+@o30IhZ2*QO2>)S*WocXRIpor=(U4#<^QAC$iM0T(ba-J5$3j>CbiXA zWkp)rJqvQ#2rVcO>8aSQ_esv`*2!O2^?8jL|5n~V`26XoA3T2g+0(DMoyUlb*k0mK zM&8bHf+zCrs&-f00=HXBBzA`Ob%pVqmhK0|+AL;xO0|D2;yMBzn7FmT-CiOSwVR`V z+@=bZt(cWE$|z=py|}gV%jU$A$*(J5lPNni=8DEMfF#bnj$1XPos+wgHvB`xfm}H_ z#-91gMvq5|lj=0)HW@TKZos^|+d81;=$gFhM>%~M-{AOYc#tiqZZD>@?1_GerJjr2`0R)%9I19-UUWa0;tlok^C$Nm z$uuuAdfH@{p$3fWZ@YD&`pn)d)q_v)uQd^+fn-b+GKNDoNw6JMfM(g>1Ij62} z&@d!tsKDsXUM{cg;c-@sr_PX?SmD<*Hr)1))mdQpb6KSIt=mV|UG&4o)EICz)uV{c zDi@b<;9EB@-95VNIw(j`Gh?^@3r#2fD_R3PZ$7kf@6Ar8ss2f0nM`rxNvYxUY;zmS z%`K(JdBN4l7Dj}lXdV6=y~fRdm@CU%tN_l{Htl9!Lj(lOwPO?1h+bt9#(BA3R{_+U zy3;Ip*lkn$QpYt^?J}DM)V9b~<56#1Jb$uxxJNr)kDq@1#o<@qJ^y0w^ADcsLHki6 zI0PwH8+H88v$Zk9ufgGMyMa;U03}s=lGjjca5F%Khe!GR^V-OToIOr|ijy26IsEPv zm#4{j`WzK3qx$#(3i0#zpMU$Iiw74d26=x9FC#oZ1TY5(NB!B_e3n)F69VKhd=<iDOemJSGF|aQ$U@A5oT&HP*z8s-b zlwAS&xX6PR00>InT!RsRvq!7G!Npu`PFGaYvFxXm-?eVfP$FtWT|1#CYyyAkzqj5a zz_%~dy2E{Qk^k3jq%Z5wvC>(YN4HYV+f#A2x{jlo0Iv&qOEqbm4z*S2-BY0Mro+0P z>>BL`kDxm^f#ToegxC=A|M0WDuUP!KB_saF@bj9)zr~i^`y)Gln}Zdk{%_E#PmG@b z&h{nKIB-tsb9n32ad%FQbffO%`qP3nFjs?TS`__1*H%8)Xo%L^Mk-*^!ITR+OSgEg zG3It}$>%0{Rz{M=R(A^J|tdP1s*|L%f zf;Ks2c%V(LJc$UVEKscU_Ong)KsMjpKD5)Uo8%NSDvL7`{&YuXR6{YheYpvp%lECz zOISK9FGM76G%t?{3eU{5W9taK$nXMsG>rCG>FfHsGHo7zFa-bD_-Px)t1i2=%PwIg zp%DHPJ&fOg7`-rGtOn}QW2Q)VIEt<%y)bZSZz92vNx6+FhB~hR5oEhaHd|t7n?yOW&-SpC>Bz0lBsg_id)|Foo<67uIuRXF!0a)f$eg>suyek-ky_^lB zg+*U*T&5L{nn>>OWK_7@>+nOK-s5bFHTy80%%q?;TGJ=w91J)&)^;dLa?+wOMVf&vRkh6u#GIU@MGUCN=o7NpDx(E_|1Z}vUPD?Gc>%kF^ckPN&^75b4E<(1 z-+K|m&D`FkpPtqNe2r5EnEgTGKkJ+X*}oD&~m9Xq*kkEvLetVYRNrRAHIYb#&Qh zNvW(YiLZNN>A<2t8_$_d-SX5sYE8F!PojJ#8dK21E)czJU;H~_M6qO;KTsr@%^;3{ z-ZdX(CZ>zQQP0{VGYwzKln+xuLbz6jEF%H z`9@Vj?Kk%_vJOj*QLo69Yvme_zaG<@wdkmQVbbXmVSy=~TpfKKNQBc!*A9$#^c6mD6jvatau|fHL>?>hw{jMD)6~Ukvm&d&k<`I1&2{GyDhB4v-!p zzyV)wC^MxLD9@X=JPUKX= zO5QeI?49SH?J+R>css^t9Edk-JrH}`!zi~yvhbSbswiQ*x~e^8=4G{TJGmgx1xu=R zH+Mca?=VBf*v{RSL1;CNDs@C6IvOY|GXpSehZ6w<&=|aZW`@iJEGjd9)JKRk?gi&~ z2{*VACLNKitzOwB$k)fozK@J=>V^d`^Y5js%^~yZVW6aT$d!d$^|~qh{%l!2Rz+3c z2sklJIjA$<0EgC|%!=#&inv9q6Hn&Nt@}K|_Hu%6o(vs(RX7af)Oy`>Cyob9_4>Td z8xMV+H%y57R8I&ubydS;K28REiVL3oZ#S= zBpZ^Pf9CiT-(+@w4p>jsPH*$9a0@%ViBp;XZTSB-yuS@M53bm(3GUXXjl1ftn_Oo< zFP7yM$Tdr0)kMaJ!aUFEO3S_E@nUgP-Fx-bCr_SCva2ealsEY#n=W7du=pvv!N`lR zJ}Do)dX`my;Ogn>VAme6^Gu_GK#ZR+=*5U7eyFXvEwSj+IR-w;esh@be zLuK|$;$O$El}d(PF$PqOEe4fYYcvSDkKI7HG2v?%3(RO55CkI|qPP0-Ut18n!#jz) z#{b7509i~S&;crzH|Dzc0&lk#X5(ZD|B72v{(}MwL*!nKuoN%xa*Ui~I((53H08Wl z=y%YW{WBwfzli=8iMw`3(v-l>%n8N>FxpP6+%0_O0K*PlHP+o_8<&l1yP(;WwX0OD z$tg#qOCIJ6yft?9<4WQfx!Q$+estR;IioYidGQ1cE!1mTkXx$-)q0wjixt^K5Y!`> zPUjiofE~8UB;4+OpQmfwtHUh)diT5@TVnnM{X<57ggyxRy-%p7B%PkJ_`oyVOhz=5 zUtb^7AFx$;3TgpX46p)#!mLJt)2(3)yNA!|x>q}vil?;AqlR6?dFl~gX@GvW z@X=41TOB)Z;HEitwKf#4qQbnM7r>LJ9L8!JF~2cT%y0A%^CmZ#BVy(^Sn=D-Tlg{^ zy8YLG2))tE;i+HV8mdrwzrNm_Ex!)Krsl8O@>gE@yB+24M#=|!zjw!GDr5#4OL|d4i5kIOMsPQIdmw_lj9|qatlBtOMG&k20hFi_ z++_s7!9WBx2WGY5T->7Am_e2urmz4HNs6L>;<_UFd*jL3L$K(HoIM`&lR6IN>hriE zr)GT)%$lK1Ldo=a(eU@2ph1%cRgGJ+Ef3RTS8wQ>*rznDZm)MBZ8D)9(KQ=T>-L_^ zwHU`?U`#1VoZBc6+Te?{`tht-F2MW_d5*B|cu%Qy-^D@D@xbF9isZ--Q0FBs8rHk9EtXhyR1+oR+}O zYkrMAB!P`|47=D;FYNYZ_9(;t?+0bPli8HQ^qeU6wZmhMAQL z0RIYf~JX0r1rN$h3xuT>zzB- zv*KYoyK|>j56}6c65|%Yw$N;!)khev{z*~($huNN=-t_BoIG4El2x&!)`eAnmNq07 zQcOab5n_o_be4ACN*L1eGKfd_ItJ%;<#P~m3NorF@0Ip{DDNBQrY?~MU4`h^w?xx? z#%IWk8TiQ-kBg~`LTq!mJ)WeqA47Rp*@A-)V-uk&@m_7lAz3{kB4me*Y+xIar*S-F--Is=7GZU}H&LLU{_kJpm>fk3vVcRa&gln&{U zCETWon931KsD})P5R3ztj|deF z@hF)*CB4WXj56QPVAzE0Iep#&ggZ|RQdoM`yW-i_W}LpK$@G67*EI3`;^^Y^SQB`t z^S*iDvI#uAX)?Er!r`!p_4881-LB7+?}ArTKTCh%IgcdKl$~Z%YS@qE6gN49G9oru zdZKvGGB|LqQ|{L1-ph=ClUkA0=kg)0J!q6U9c@!{Oay8Il><4zBVGY~oXzs9;sz{c z3-pI4pPU|le*fa+%)$SXJ^7*2voDS> zzBoHEkCMxbZ#9v#u*P_a<7+;{9R*tU(K`lyzwj`d6?2{n7D=jqhv_gsxni0*%vJa# zoquAVL9dV0Tis;jri35A(!!~6=ijkn_fEo|x2)1@?#FJUyjdGQ*q`u3_q})dlZI27 z?mLwmacoY&!kS=x(l|^&o0;iDXl|dM#F6C^222CPI*!<66(n5 z2+(UW;V^{{_s_F`#mO&V4(^wEQBs7G*Bjen9|Hfg41oaG$(PuVC-3Iv;&Hv2ctBa7 z&nb<{#>>5zrPD?+O!~Y$F4L;3Fu`<{u7&hI%~OKWwc@D|8^5)Lcr-o1X*V`-gJdH& zIp~4wlMG(}#BgbDL-G*7{hH?RPQykAHj^#?(R_*+S|P}P;J0V-{g&1&=B+jBC@*o0 ztn=31mZWhwrH&F@>E{$2nmT)Tu&F@huvpOZ?MrN)tS;+5I%(@x$Qx#k2*f-Kpj0^k zp;n{O@lt@l*Lo{xV|(~$+Ex3+&QIdfuyp_eR0T9HK`rzlsL#6x^}Rdn@#`xs3{|Gb zfAVbzBuNy1agVab>01n!iA*=k7MX~YEMOqLO;pSZm8n>{IvX6VxQT}<8o>Q5WRKH! zqy>zO_~oBg6IjOeobFNqLuH6UaRoUeY+Hs1S~uEm4BORm47GXNS!vkzvsDb+&>Ar= z(Z*>fqt=db!KfwU?0qKbSu;+E+B2y*|Ft%a)5WTP1#;l5hGp{$wCQy{5(F}l#2smN zjg1rp~`C+)5;KrrB~15^fgCdXI%{dr zv8Sm~ToIk2y^}yXypY^LW4N4E7<-VW>O$X9ZJ{zFMci_#6{ret1YI(Gs3;0;^`uh} z+iQubiO~_mz0nYUF|`NSnAv-KV@2q$8N_gZ9daSnBrY2$Qj&!8-w3YOxg;-VLjm$) zZAT+6BhzKkxJDm}(@Tttk9ozdTG}51L0YUa%e7s~>XxTTXWaT7!ZS5lFUgR9n+~Cx z-rrCLs-X-YGC_!RHyw|)s0m4qMl4+{D?Z^M7&T^kf;dhfiGZ#iXIDQaS7lLEID5-* z@3-RP%U@GqAZwkL0jYDM)11+aX;E(C`)HyhPu#xogblejvzXN2hjqCyIQCyx%MW6; zTwA;RQD+5BaOlnwwMbgM7VhnTwappe(Bv1uCF2ZTn<(o}UFiU-Cq#h+!$YWHLlNQK za452NCqy?+0+Zug0oNzZ`ap~GaWly37j)A0B?f_iFTYy6yZSg=jR-R6bq#k%7iD^t zT|gcA$lA=^Z37zOUeot4g2aXu(H^AJDXELhC*7zxuXH{Mm{7?1LISdXFly;_Mwt9*kn z$yWo>FeLP@{B+vHA?br~;j)GVgYO4JbacW#7#X(ows<0%Fbqe#k_^Vusz0JZYCbOa z_4mts?Ss(mb%6C}#oL8{>B70^s=GV#z63kT*G;xV>NUnb#Ic!nN?Y2!hv2CP>=B^b zg?In~BzPa6Qh>&L+C%e zuf2!&vmy|@wY29w9<|&CcM)5)JixvomRLJ%jIO;!wn5lvn?Br~z89k6;QU5p;gfaz z{~&AIZB6Xk^^=iOp!FJMM^<@3H#6%zvyQ<2-MwOyJUh>9ZaDP87Mr-*?X;fw?3B4> z@2)pC0oGlL5N8j6`6DKL6Dy7C@1iT(xNd|KpFR|8EW4uGudc2kkt%m2)jay{q#pKV z{xVv!o(pOIr@};yyORf0ny18q>Z5Ln$l-avrZMODhMDMjeSm9p(7z?NrCFo$NcP(e z!i&SskZ|~OzP}BI5TDHA3Es$aO-lC9cKMT@#qa)dJ2LVIkQXiyrm`{Osa2f9A!)Mm-Tb+5ry|CX5f`~%DdMY&wSBtU2dI_qrSSYTo0>0-nq57%?*FFO1uUo8L^zg2dFMhGd zE;8f=V}=kYDN5xf8y^EyS>IE7dhAW4_URpeAObS!Hbo9zP>vX`asA=Kyb?B zbe_w!L<~!q%f?clFdrswD5NzA1})2(hj!mGbklj=(Xo@02%YF8O~L)yTFlJ2@{vcI zH9Gs4!>R?pF@*^S{GxZJsvv)p+0%)xzH<;tM|`@eo7mhQMe;;le-6`lbg@Rr4Ag zZ=ijHR8JaoxXl=5G3<6r$T05qg?lcW?6@>`NcuIYtLG&Vy_>9D=TJp<`^27`#3dU` ztJ?(>P$_QeoA=c88PMu|OJ4YKb$Xu?IP6;JT}lG@P^GddhP5R&%8a}~&l`S`=7G1Y z$-p&y?M`T9_!{HmETHsTrYUK8jlm8YdWy--$c&EAae;pQ^0`wZ&X-$Uuj$->o7(|z zQt~gIa}!COs0W@;8P*$rOhp7{45PyhL~yD3^@<2L^p|{*lMr>#5w9n_eSr z_hInjc**sgtngLFsPjh7@U0rsj2HNPvC$;+1v;{|>oPK!%?aq^qX2WwTIVAfhH9xa8u;s)0 zY&xIf+3r(q_<9!pw8sH|mIVm6NFJw^ILY+RlbXsv3zOoJC&+({PCUV9wwtNNj>ZY! z8R=i49ksK`PG4l(Xb8D^Ff#;B6{o^d>K~&DGCFLk4OG4D^??s2pQHs>LnVZB5lB*^*ZNJt(~E^Q3GiO|8* z1RG0JX`bg(pxHRrx~wCCF40{{$oT;{5^+=q{iCJWHz|y4zeq&&_ul2)W>a1&ZBwEA zk!y+xpnAY1NGw2qV=gGdyCMjf&!=Ph5w>CrGQSOlD7Of}tZ$JXwYjXBfoiEf!k-yv zWtQEb3jjw46nzuSmoK3ryo3}4(*!LMy4F8ml++jq!I8ZH!(x_EfUlp5G9wzVWWS;p zUF_GZ$!077UO=J0Q2tBYctnvBe5ViR=O-OhnJq`Y8>m+q>T|et7p!2B@+B_|qsJrS*q0S~m@tHEdJL^jaMr9O*rMk`rU)GXQ`!%qP zi%NYu-TU51pw&1ze-LY)kmL``3OYDP!>N{K=8$N!qZjE1h>I8+>u1>fO2{@mGZZ31 zZhT+cF#1^la+e*+B8T3QJod>Q$rbRh5=2_K{#J;#853 zGenU?GPV>C{3B`;0X5CS!+em$d3Y%PuVzl3e!`_f(~bR@l&%+`LPT>_9^r}_L9a-G2@ z@)xl0Q?5-rUvZx?G5928dmIN0rfcf}tw(&B%FT)=U~DCoXL4&0sgaDr1eQ7&%RrXB zTZ!jPF*I9he^5Kpe^RGJ9xaFeP`ioDhKz1LR5UU57`w2L7T9!h;^WwOb`%t!Hx_i9 z7_8-bF6CU!7)4~c*}By16SVx!9k?fe8|UCA>Ez-8dsuT(5g_}jfK3Wof>!`lkQTx> zZ92eQ4a5Hd)WapjF-irDsx~XGIm{GflZs<;F6+f}e|i4$-E=6gzP)u>bv*y^!3R{_dhs@#DNJoCt5-Y7x$4kqmutMRjB$N)`5}8aUqXVp5i3w-fPsJ~pq)8Yk4gocXrb%bWE(Mi( znAKN;f9mKHHBJbsgB9YSI+Xu8%tdZJe2%yGR-h2Il$ST460)5%&z^_~IL1?%QD#vF z$`^gank*e+`0bgNIsRWw~w@s24;Z00&4LhzF3YCEs6+!0@ zm)Mko(8RF9t0Zcb_c64hG*4$(MGi9x2((3mNUz+US4F8C$1MFi-zZyPrjL*j2`X2) z{dUp`{>VhM6v21TDXlIV(PL}{5!n#euzA8S_cdRBZ`yiL` zi+qu{6cinKFKv!x7mDrfk}Z18;k@qTp*3Fj`*~(AI%cauCC#e<@k< zl7<q3YPNk^HWg+9Xm4@YZl?2ac1uSLos<)a#zIwS|vUQNL4xzLl{pi2PV_u<%wE$Ln~UB%|{T z`qo2`)&b-6;>`&wob(7Wi<>|me{xL*n+TiwNnZKMeDBj;;n{Z=cqkU1OJ5)74!MiQ zxx-A2bI06z;pei2`yk%*>vTTNehuQk*_dUB{2vmtOjt255IL()%rb=g$HXjSW^Bx| zFvB?sO?Dc+4A8Ka`Ta0(A?WBHIu^W>yl+sqrK#w=23+Q;7!v@qVe<=#-B{{VW zQYH@`&4R7MGN4B42pG zA`*3!%QGS<+*wz~X0j~re}EP6VZVCDJBfZqIdTlQga>GCAMDt6W;d>vYAIhF_l1>m zwMdCOD;8};&26?J19h}AP7^?_yaKIFeKZXkTJBZ{Hw)sLK)pA4kQ_=e^*O8E8OALC zAwrljc>uR=5zT^gApu5$UmzibYb(p8{P#|;=(g~}h3=mh)2vw>e{;Be9IxKA_5sAw zXo|ZOuE4fOKnbXtK=At!Sm9;mV&oa8aUf}g+>MfY&lon-DdE9zfW=fKN;O8Nn9o*9#@42j zl4PoZBxWs}MtXe==_|?W45}}GYTF2YVbRXzzH<=D3f}(Ye~$?8@X%AnKx`o z-x{5QK7>`#kFn=y%wx>pYo&w1Bn%bskF_3AiyoPDJteDh@kWbTG1pZWt)kVwy@^yi zWj91R?;{r@Uo0&%YF^lT`Unx%6^2j{U{r9S(6oRP8MEx?M5H!L{{ce#B;7=2`}*6H z-Y4lW;W50Gf1Q`n+LucZO7YX*F1j;fBQ8A7KZU(vUmTtke@YjRCnaO?Bzo{Y2r3kn zkLxyE2zyy1D}U;Qn?b+STjJ?YX!*lqgFNrZeydV(9i4A3s zLV{xue?^~Hv6BcyuN&AQ-zDc0aEhEJH1>R%`y+!jw zHFh4kmQcf6PlIHb3)1U>i#@nlTwbo?>el(<=I>B>)_9~o@()73m`61vIWSOGA3A}k ze|3kwO>}kPdj|Ow@WH_}N{XipX_ZQ?^fMMjeL4e-IG#t! zzQ2yQ={o82k+}^ZcQ2nAdN0T5xK|lxe{=bEzbzcNAMDZpl~=a)R{F{-8+!GB<&`0R{a<-yplAPAUK!-uf1kju z+c*{=$ypyO0>z=|5IQ63Isc$!|G@Y8(APyNCFXMJ~C4!N89W9@U$KEP=m zmhR<)^^L&}Hd#OHjMWQ8d^(r;v`ra%@v1sK}u|Ysuoy-RQAZ2#*pe?G1lJQmy%%(tt ziHO(7g6m*DIxyD7{S)%ZU%}NNZ~TutLk^}c9ujX+5K;n>IA)Bo>-6Khf6l>bhksS4 zf^DZVJzN7hpQ{eh({#LwGA9vlGPeV!q z@y|L4^br4#xxe4;+!bqMY2mNd6;FI^YR85ojM8PjZEBuzw%H~)9TlL*u-{KbwS{9? zuLtQyz*ZOm-*CUP_N3x}e>b%MT{pDroyP(ud#(MR{AzU_YtOJ+lAKFfhpOALU}VGy zM~8VIf1)^fZgC_Swf?Zf}@ooqsiEUiqpB*a(&#<@jG5NPC3iI~&sY<6C(p@Quf4^g=rx@yd<%_&L$T3IXx=vP)(<_G0k}e! zA_M33vCWEbx*k3y2nPS~t=Mc?J(joP%d!N4I8yXTktD?0fH!Ke4ft-^6z-N?(^E{C zc~!-{>fT;rCfo(!f1`wdxCguZ9#br-zDKu0Aht(Al_Pr$IRDz)>wj$`SWSd@g0IQM z`@}EU;ooyJqu@M%;8==)J-j?o+55$QuD?8X{w>sBz}*8)H4X#9+l=1hX+Hf*rsTyS zEBVFzl4pxrjIoMOfknY@a&ZleEyNC28V_=>vJxM)`d%IGe|Tp`F2%jnRTx-VcnN&p zMpQ%a%Bx-0ntI9Yo|@mCydFpc2!gg>LEl$)_|-Arh4f%q)BJbiDu4+*%ak|be#L-G z3wJMg*KA2J%gXUx_p+aNP!a+jRR?rhuf<(41~?ZV2lUj5#*q@st49~xkQ0fvR0lMr z>#YWe*$Cipf1z-b(FWseHSxTRsGE@VN0cd2p4C;Lo(%P(aiuKN6{?KppguYN0nD)< zR=X*#H@pUJ-Vr4z^M=0xgk<^ZirddoRo0E31_$P{ZCdILn1`#iTERuN4}gl0-{C5x z<8-gBU$Jo(6rdfGwZvTa+Jcyb&d;+>YS?vq5?dCnf5Z?&FIxAh|MwzA^{RX;;ygly zW<NRQ1jjcgY?~!tR#twcj=5F>#%$QhyG; zb@-;If>q2^9Y@`{qn!)4c;}$Yrph&$X$D=txWUaWQvFdy4OeCOMMveUY@sfH4tmt} z+hX3oe;Jt#x;cgA_P_o7vyU55p0)$W7TB^r+ zL0fU~x$o^sv5WId&dsjnYp zx8ZchxWc8+zVh$i$mo^Ib;*N_37LB=bbuq>|Wqa1C;9J&K=Zi!?&@cele# zfA`nyO|`KAJd`VH<}#WCnFoQlZG`O_@YdARXN0_*LIPE6Qp2n!;BXHDk$k4a)RU?O z{_y0J)8o(YU!0r?I9aLr)PiF3eD)qWG<2}&gVjQwe|UP|f$;idS!OM87iV7_Uwm;U ztlqlzxOE#6v9(6ri4vRHzsideF=JQ%f120Fj}ifH=t#+nw{>p(B01#7F;bYbwLhf5 z&yu=jc9F6=y!qe)QI~~_!W$6HHI85{7kzgv3qjs~IFfZ+$BM0{=5g67vc@WN6jBQ= zf`nN|MDs8ip|06-&NpmCV*1PuYvfvas0Q0tgEIV!^NH70{e_&&l z5M3Q>t1!2&f0!0;=+-TO&0AYMs1Psv48s(jUgO){gHb@!ssQIkwZN9PieO+^7dSPh z4xB3*;XbWWa88F_FpvSBxL-ZB0R9bKc=50hI$Yo+#M*6g!;bIR@msT1QFxKC6i@BV zEm&20${s1^pmjOfcZT`ErLZAKCQ{Bd&wTq!(Cydh<|H>dy~j`81Gn(U8LY9K8ifN zv(C^H1<`8&5di0=jzsU`hlFI3KeXp5!Vro7DF{vUEa-9i(fYc8J6N1ye=p1q+=JJG zj-u^f-TJh|FP#8IbV>n8r+BJ4_GXgfdYU+l#3$OsYZPjiG|OrG0~=@*(|yh zuD4-bA-NqON7~cI#^O*7lidWGN-z=Nm_5!bUo^X9-gwh*Q_T``e33%zUa#b}V%f3N6v_a1kyg9X?n;)W-Jj97_;2c3+QxX6?d5a+3pyA7Ey}m* z?i!j+-P$|~UqJfPf4AU@{tetgIfR&mbti2?@r+js{*;#h-cUxu=mqAE?eP)025%5( z9p6dLE~#unClos$-;GbB&QGxas9cR8X}laLx_$KpZ`z8G=e5ZN zzc{UuxCV#COS@$2Hl{5|&~6<225gafVdE&?ZN2@5J&E0%HO`1nd0+k=@7YWV>)jtS z;P*$i%+uZWaCp6K@8Uh%xX#lVY)DOxi{Q8E9g={Z~g$-~_2I5#0`f9PRinu!To*|k}TR*syR8>Hls z8oKA?QD^Qd;i~)W3C|y_wKJ$gV%~J4l&d}y^V&JgP?>r6z*C}f^I~14MRwk1uF@_$ zFY@78x8R;E7I{Vmtsg)p7f*S4&lp?50TNnT@JSdhLe5K@@AIpCN+RH-%k`T3cR$|6 z6KL+^e=S^JNrG8z+6#mODXT_%g+(=xwDu;Sj=!osyLBIK@oaDgx1c^e40qmtRt8j! zMhkworOwQ@jJm9)bukU>6wUYU#wnQS#`THtHM#W&D=q91!o@m-)YSTey>2JVXs=?t z!7?eGA)eUyf>awLPNok<6xKTmIZxr?)mI8>uB8 zyKF9CIJVDc3T+8^?nS!zRPQ_A#U3l{r?< zmeRXXbersMZ(uEQyMyk(^-OIPs)^dM=7>nsKA60#D@PAm+Q=q4NgIiK&(TJvyP2Ym zJq!D#WZdG@B_cnYmI_VJwvr<9djBWc+4nhpIq_B*ouH-fZMw#Ud=OOD=!xiqf0FK* zokuxgRZ7?e+ZzRWxAr+~)X_4*L4m{dJsPm$FvHLX!F!4GB!KP#E{S-VQhuKcyCVh3oCqM!qiFn}Dul?)t! z9pYH_9&iLe8BxdrDD=MwEP&&R#T7u>I9LIsj6xMa!U#|SB-L^{15xpdT(LMrfYn@+DaHkDrL!gvZ= zuW$-la_fI6e^euDPr(+bim(=xO3$pNv>9nZsK%r|7iU3gyTUBgp6Z1_7PvNen~eQ< zgD9B!h8_{}gOa(rf))kAe-(lbq16r03Kh4|!XU7MSYLh_2hfUGR0X7M1*PD^C}3j` zMS)9@U(5L}-S7-%{XhW}pv-(1Q+%11z>=qDJt{TW2}J5cClFyAasoc9hXhW*acvhj zVcojh6B-sQc|VXVi;$ynf1Tnb@b75UgmrGl z@4V_^%D+8YLWDPwv=Ipn`w-QtwM|{vbD%ctG-Xr#n{^c`1vjBT)kTCBW(1>t~2LO#e05ob>l>mGORt zlp)!9+zjkwSJ;e@e?QSpB_E6})AMu*<>VtcWaCo-`jowjn)KySoaz1)MZluVF2xd2 zO#8D4R^gXvPAo^tS>8Q8O*^%Rp$hp%p!$bYhCRgN`;Y!KUZPdtDEdQvMax3oq6E*& zzoNU)kBA3ZjmLmGkB(tX>BWyJ?#e<=KqQZgNp1M zECYE4urj#L+VZZkU~oBa0|le>hcqMu1fyiFabU1fdl(pLHICuj*2V7~2+Xdybr=9f zKkgJTqny{(TX5`8hB&7HZV~?QxF+T)Iz`Tp2558V-}qb@EGLfSRKh?S6XN_28n)g7 zY3RkS;lyD7e>RQ%7&?-r(MxtP!ToN%?7x5xqgNyNx90SAq_WxVRD4f?VfvVxgT-Y% zOv<*C@?PUj3^5yb5Nd+1`>7m42vdTCkPCzs;YHB$<6>Vqe&h1`;zhRnBsmg>=zYqR zFMZhyf6s2vU*)!0;s+&woiC+?BE5iycs5{})i@#sf4vCLeB^nTcZYm(N{4Xh0Vi3G zflfoNs-~3m^q?Q8SK8A16 zRmWh_f9G$UoW8a1h~}@)qU*ele^aKVJe?oPQznT&O(ZN8Y>X2FS911z>*{(jo^$Ka9>k4vhxw2rBf5^2(`#i1|fZL!<scMPr~HC$ zTAKCBDD8Qr0DLHdh7QuBSx)K)SyS4MWggR4rtH$={JF2)Up)2dQfp_F5#Y_F&nR6$ z_UjkvU$g6r0dqp4DlVAJ~HktOdxHgU5S|n ze=_m3(I<9H?li0&v0qSUSUr%n4E(HptyOM;=iiJi%#SfjEnLA4JhS(8qsoQdUgJ{B zHOFW91di`Ko#X%Xo=I<({3V*Vp2?}ZTjb7Ynn|V!^G@IDoU!H#&wowv%hf%pn6BT^ zFWWBb6{kdcsJP4*%hN1x<(M!4ZkUVPe`$|B?@~fw@5}p0>f|Xtp;a#~SP=D5zI;FJC9h`3s{UKY>;9{txG!f#b0llCz+yPx!AqTcsp{^qb zoEGWB`wwE*uX6&!IJX3yNrT4i1`-{uV4M5mdPN&hDa5`UXZhJ^Z<3bv*xu(+e<;Ff z=;=oOsoq=_G|oG`aPnV_Ts7+7quy)S*wmY)mA@q*dF_DwIdik1~-{XJA@na2J@g zD7P0lTEnPL+0h`hG5U@`oi%A1M&}{CS*%mIS^cF-H-b8Y&HA??B28gtsUQMnwt-Kb zL1Lk0W9-4atT}A{K*$(WfA88NGI1dwBV-360W&BsU#--ch(k+<0U`#l63dYZH?<2< zk9^8R!i?#C0RFtp&hUyBSN}zlVPJ&5J{%nb*;V>t22bgmi3stA_c|Y^QWE^@Iw-P< z{!nfAV|rq>&hpszdYfa7n%o!wYDZSL{*aN#j98g-+b+Yx<^gPEf1KMuVo8VokG^^GRPcp761{xi;P%k<-L`j!ZrBsFvwIUJ z_VPUZSQ?YpQColLe@PNb)e^zUcr=aa8BSxo1NUs@yEqw_-`y1m{M|h*?h6W>nF2gA1XB2e(qV-%iIZKseJYn2@qi@l?ci@=3e^20WIx;la$t-6R@Ni-f z10T+W>X6i-_7LL4CI&=2UY-JpHwuI$Z!=lCGDM6H*Og5NhdkoO#@qBZ(zXOHPU5@4 zi&N7!0OJwUWQ!o_Y@8Uy!;KSp|A6Dfc1Iz{xo>N|)xDsI z0Ul?I3-oxifA120u2#h%=n`oNLszO9MVC6heH>j9`+%f-zmas=kHT2G?Ce`Z)8+2i za15=CLewS7u9&*y*A`D#85=}hQ#A~tE=h>R)YTV&)k6ChLKBtxwV<-3m>3XIVigM` zTIj9%LNQW_7DiO-EQ+XYX+cDlLNP?O%tDB29plF;f1#d!s@Mn&S*07ZwhWFeQFKO< z^P%LW`rL1?Mm1kO2=feA(qf6v%lZsBOD*Z|T}X(S{q zJ@N(xf2E~SZW)%=lWBGS08Kk6G%fkm7Qt!BrgsZZ8|!cn5Vd_n)an8z+iorz5~h}H zx)q?>NWXdjtBrMy0pV)NBHIM4jdYF&(AqvgYeVZy0JxSb2Z637<8A<6OFfH%uZ?uD z77(`nIhs0!CE9%$Tk2+KAltS;pAn};jfQ%FfBW17?vqs6J2E114PYZ`t+i=4*w1F1 z!~Z$><*peS4hQbo%8%>r)#B5MH1UiY8dyszZ2@da^jm?pEF@KLyE-NkwOz0y6N!3( zHA`AT=}{j$fay`Y_E4A9Y;#;aVskH$^>)Ye?k~iie-ulc;l2EiP5hVCXDW~|rO>*$1kcJLaTjmxZjr;t+r?uiQnS-DcHdi7gz z9FP2($QDx^FD|jy=UJcJ+jn}efAi*WO%C<#!^@Wa9B!YP`ZR-m4J^f_LiPT#A$QnF z>nCw|=+t4;?aDMutm)W|Y^sp{RTV{ge|l7;C7tUqUmsh(I%?~B#*iB#S^_p7l?u>FS=E>uf~zk>fmUma|cg@k^g#BeyJgs8>o!SEnqR$M_^( zl7!vSq)cy|G#yBrCTUTL(2%P!@M>;&)@}H|jr}7H)=UeMkv5obt>+25+%<~2ltWSHQB<$V=H74XS5~MxSA5EOWe=!AHS63fs`^7~cGmJP$tH$p4r+J) z-O=paIFJyj>A%XrCID-drT}Ype`HV#a4yE>3lpPS7mI;m0RgibY zHts)n<4bl~Sr?UFR?vp>%cPzY%!-b;%`m&Sd0=3K^W_4SAw&1F z!H%CkIq|c>uF`W$%h_Pxe;gfq`CXQdQ@q-xZHf7Ud0S>hw250hmqY>fT3Ljc_!?Uq zlanR%nv|u14&P?YX<4i_>8IQB(B*G)v$Sr=Fy;W z9j9OxnU5pNGaIClk?Nh1`;|6HORK|KT1uj6T3Tq6aI_L%u=SV8f7FtS=2R_*a4eeh zlC_kkYqplRx!uekPf8_eE9fYu-ujBA2jJT8|jW#S=|f4PdmZa14tgoY>MLq6A#`CNrxZ7-p#(aYj9x@3EcF2=jpGLLIB zS9{3h>Ym9JANAg5TV7|a!2{o;Bcbng=zF2fzQdvmwt={4sjj!|L-_j;;qSX>=-mr} zFM1Xo17FZr0w<+7KK8w6u#Mn%5oM3#8lxNwIvq*J=d5>-f4FNQ@G<~MtHU$jb8w;A z%Nw!mWtJ|pd-Ud7o8HFTn`UFReL@A_XJ^yo zsE)l{bWsQXM1vc!=d<}DukZFG`dw)qkMR8dniVFmJJ7{)G$S3DYi(PuFIhgf;x)^a z!%J~kjCw+ae^>P#EZSrtm7Np?ou-J1>J)CCqWogjl9UDlJEhu2cDgUOhviQNf$tdH zS@79vbY~$mHoUVSSB*vob{6#aF0#}1+Xht>H2ueR8pb+s>%FD~$0}t##&;GRw-?}9 z2#kyHZ0DgxL&rhyQ*fv0a?myV4)3h6-M}wxh^PGFe@FiqF77kRuj7XlZ(H7c6ZQ(2 z)PsMe&A`vN8-M}|&B=1U4aZIa0o|kKwEg?$G0?0QP`SI@JH z>v>8OGrvmDGUuXpf6s0~4sLCr(Wm$<)F`9F*8j-$c2Jy*Fi+BQ43z;ameO<5*y9U? zolk)be{x8&k6^qfi@f|eqCALmW-`mcMEqp_Gh1eK7In#ctdqyzo{o!<9DwlnJv&E* zK6!!{f4Ei7S?c4K^wM1ko^Jai%*>&@J`gFngLM?6(2_IjAjpr@%uD zvMjzBaxTFwWmp%e$yF~rd42@Fj&1R?`r@CU*pD6K4h1EATQA{TmSBrn!WkTWykaY< zFd8C_h_C7Sgm_{!f@EAL3SoXUYb2&Ff7oF-lcEmW;%D{6*kSAgy+CsiV1E4qrcrtZ zec_I`8FTC#L00F}t)vh-M<87@EVQyF9-nBwSFvnyHVg@%sBUuV3d5V%)&6U1k zJnhBe_iUWJoP#KQ!d=Z5=kOOeY`MOmIq39orRxN+&27tEzO7m|$ATA&ix;ALn4_;= zWlKp6U}%(BZh9A06)aB!`K zkDbrKE7n?z2!uQOP&aEK8`idRiq|%^ewLyCtzmFO1nYQ+wv|O2Z4(F8f3|Y4+BP!- zmzPI0Y1eA|k<3n!z!Tk(!Os}gIuzladUaD{VG3k@EK_`~;F1bte+uh>$k+8nyP%_^ zzknCn<3O_)xBI8ATk^)8`PA;rr@@^$vG^^Uz4~qCY-p0v>?IvNXXkrzqD>9wuxbkV zTkglp_;yXI@cB7=ITMd&e?58o*{Rvjz8(IjZmT=pWUD(Zx4NpEF}_?-+~Xwg#<{2UN z8g|W2Z-&}DJ0iO5p{KfsHpRfYzT#QCUG&uKqNO+>gSOWj@1ws;e^(o-f)e4n(w69SE-~uirO-slEZ2;@V!(tHEx)155{f2benV0MqI_z_U>@ zedis0378g&kq41`N&_cU$!A|4ef`Cw z~A!z%04i4leS7781>j{Xi^X%NumcWkV zbLh=Calr;jzy|jaU`?Qssn=f8#;&Q>YJS2;~p@R!*#dvQaf z(&1{yKsTIJ^rLHXt!di{rX=*b0J%wZn0HSfHX|DtXq&tb zLLtG!mqTz+$7^!Nkk4dUEW5Jw``Ksl#V5H2Q+8`19*k4ZKw)CEdj=Yn$u-bx(ek#} z^7hJ>w{P9@F=$wfYI-gie?b3xftoQpeV;d7;Y=7Zf9d@pN!|g>k7+SXc9VO2DK>c; zcY}+Eu*JalhgFlGOXufv8U+EscSglvK6GNmXUn3gqP;`A2IXZ*BFtH+jwi-*Y+Fo| zORj$D*)hR}V_lU6S6Qr6R8l_+56DJRjK7Q}u=>E~MY)Kr@ z^7Oh2fA8PlKb8u-Dvm4o>m}Z+VQTIVCB8$Hvbt(muVtluISr^L)ZA3#!w+$MGDx+z z)GS*rsXZVwsqap+C?)Ql-SK*N|M-Z2(BD%1Dy&i|f0|eU{$qm%Zh}M<<4c zvE;n8R#%sqchOKimW%2_+!K%O>&0Vx!!FYeiUg1iiqgfnkvLJQS1P^h28;-mh*S;W zR#2-TLn(`-&MO+qLMRD!=!n>@L`aHx?L_h!OXr$sB?q>t0M^UY5C$iRcjH6HFw3qw ze;KuxURjXy6sda){Fir^{F7penDDEiyGf%h^v@>0q|-s!0QRW1%jFk&A1sz%kMQ-V*|WTjT=1e$>`Wt4 zc{6DtC=80I&Oey6w<-{ro~$DkzdX7nBd; ztf;FXF;dLfOCRH|q%EpGrrRO~lzdxmvT)xCJ9ikAvUBHd*}2nUpw#0g+UggabmU)gCvVur?OS)z#(2vvZnx>8b}Qyx!|Y?twC{?pJ9tKGgZ-BQ>Vk9=^%s8t zl8ZJ-eib9RXhQPQAAsbeHb{OQBl#%2(Ur~ahS!qUypRo)m=B{K_Y;x=0Ep-1SnpU@ z?nWXwue!j#Rad_10KjHwRJ7^Jf34+)^QsH~TXp5@4jEXXMYJlI#H{#pWK8zcsku~J zwY_pKc%xpU3$ZNfkLQxhmfiouCv1n{T-)+e9p0M{K$Hr9G!Y4569zW$y?B_e|F6#Xb9}p zg&7ko+-$CJXB+3G<$mz?;aH$`d_1~-I~4=;*XDv(!O{c*A~Bt|vGF@fu`r(G`b!wn z*|fq0A{~|}9u!EPi!0<8%hGQpFPi_lrgD>8`n7ZpueSAIj)Uk4V%1FrXwVfj7kt0D z=XcxMj9^hvlA!2TNJ~&af6;s{hVQ$19P1!u;K7;RS4GX3N0YF z`Th`95HQB@33fOb+WIO9;8$q+oqs7~>$facYx^((TK}21M_U4*+6oBeP z=*62*VF}&vNw%Wtf3~jVS5{KKFy87*er+Y?tFnWKM2YsRuC(oA+f>WLtE7Ol`kn4r2(KK(+&6dUA2I^LC) zRPX-Lthj%_W0kG2P~dD*z>mnv-$(hQ4&XqizR0jVmW!56f1wGsJAU=vBk;!B=soHN zxtC$?Wt)*_M3aFRa>@AsrY+=rtJRRan=utjhk`NT5J>CDMioS-f}624Zf(zJnPn@N zEI}E=!AfH=F=Vm6SIKUE5!ZY(ST(e3%UkquG}Xy`MpR__u{T|DK~Rfi`&pFexND*m z;WeN3$)PL?e}@&dQZs+6%k)5IKl2%&Ft@W`vW!c_`kE&5_4Uf#PY%mjTYoTwxHrwR zw|!5m#&bb~a;lcA(^DtKeA>^Nl$mm`kUvD4zaS;_&lo==Whf3rwDt=60sy)S;OzRpi6!Raeb zt*KSd!p87k?;auGVqCEq>n1jux)5wWg=TyW~M)5H5GKY53t?OO^W=X1LYG*hn>caJ7^?>?)~CfM4?I|#0w&(b zqOJ+;e|j=scamqGdSPeqOt;dh1a9=t@cqekgt!_d?f&|A>6TI;FT}5X%QADv|h3_V`b5VP~~@ThT7T zDn(>vR+QSB0_iTB-E5c@j6XAU<5p`0jeP6_f2>!?kx;E3VA2T0HJ!1{27@JBUAAbtv_P1C{1D27=&R_AJRtp+5t?cjAK zf6$Yp5#+{$Z8uC5k{$P{-?q!CZX%RP9y|S%>vl)Td1w96Q6Ia1NP2Wgn<}f!{;OX{ z<5orfh^}uAU5IGA^!G4FP)?Z^mha&7?XD>t=x#D_TbQo;5j;g@W^5xgmQ|8i4QZ+~ z+JKFhvhk!CrMW-W!-3be2A*7Vd&#$ff4>Y4p8TAz!xJdWF%3ZA*gSge1zZ1G!BYaR zjiZ2_wwW>W98mCTd>z%0bGER?*TG>+; zbN!7H{rfbSt&!4O4MQqQ?Ets70Nhmy`6~jFa&oh{o=h^x8UINUP;ix0#QdkxfAc@| z>a?Piy>c)P^E-$hdx>gqksP$;oZIAfgef@Y@aaBJYDsd4FVycnF zoM88sovUtibZeVwpivyiOlZ|kh1GR83Mdftu&yV0wMN*X=uBR&C6`e+ExLBxnu{%O zJ=gV+^E+O#h>4cfz`T+Qf5eQldLhFkqqd@H;V6!6Aaq3#+uQRxsP4jpjU zgSsIyLDN>jBLp|YK1WAAt~L`*;+3TQUd9_HfOcr#qcRjYErlb&FUn72z04ftW@e+pq(52&DSz(cyXhl^!K5xjNJy3MybjT5f~fIONzB2 zki=R1$52Sny$y*3!df(HGiUvMNW|FQhC&QrEdt$a{?sU;x4{+FV@&0*IBLbVx2M+- zo3WuA+bws0|5nivfBYZ@Eue?@-c4YAA=LPg`Ni^8F%565Pa8A^&{R|}yWyS1KzF|m-c5HSbC2kyXMJfcBt~3h8LVqJh!P-*uSF^Zn6ou^;Y`sAgh3z|yqHseb z7j2OIswP0eO6Qu6%t@QT)aI#lb|+X9EN!U?Z*jQsF^>eXIo?M7%`xky7lrp)rXZSj zwwrV&Dcx`0e_W}=kw=dFYa$gLq(960zkeR*`lzO<4(!tO4@W3-X9$qmC})LT`5 zSa^)}yV5>9MnhNP@EDKUhR0ZIq^vta?w(^n_l7)k`sgnBwXdLJWtSZC8|XjKqNX#> zu_Vb$aq3}D)FAY9Sd|Kv*=&81kQz0Vf(R3qTuj$gf3K?vx}IWMS0UZ~2m!u-P~4UE zCFs^e;m?StvVOO2%_fVJ5(f%dBTkA9Fk91m?H(}z6zdCibtYnX$i zzJ_?AiM-2ImpLQ)w_U`?*rH5_q5iMhle_Lw=VOIR#BXe)%~hS#2bMi7XlGONGCt zUPCV8U6)8ORyT7?(ePoeDI6jf*NMbB(h!vGUDnG$RBmzSoDUW%pH~jjhUc zf%ireI9SL>1GQ^zZ`dV^XKw1Ky`9izcQJ;4f72~JwcGUiZ|kYOeXXbVc0EgO@2UNj zA8q8%^3?vSm8bSs&0%rWQyZY-GoI*a;s@`Yoa}$_p2TS9Cv@q36CE`uNzoIwX89;1 z3j^4&-yZ+w-IODn9F9=+yH2n7 zf9UDt(bPbO`8a(F>~xdjgmK>S9HcGG`n z!-1$ivZ3kMzkQ;W`DKg8f`=_!e-@tHM~<}Xzvcfz*OCwKxdbTJ$p4h5?N9;uIznDK z3-e_Zjtf==sz$RxtzMNA@zK1TsX{Pq075TEBy=`?8l5$T#V?tOs!?=IT~y!To8s7g zLJ$KpCo-bcaui5x60&^#5Zo!&>|V`^U-RzGr>Tl(nz+1ttkVZU!lXkNf14lrx|XJ* zIqoi;UpFcBno%}hn{R`lAjR|nG@WlYbi&!F_Kl@fb9tgOq|#D2hHFqWCJgn=rYn8i zP2T@YlZ^m7K*Yb@WTRpu24X&^I{ec=pDl4>$U)s%6qUCE$5aQzKrVdB>;6k6G7AQO zm*?^AmxI|G^Lkjgvk`+J8p1jpO(3HMGHxQGOYc`DyPJ0LStt>&SxdiVQfB?s*FZN^azy$C<|y6XPB2= zZRtl+qi~8$Qg@MFdn@Fvg}%KWbm@%OfDeDu7IFbhUyXLFim@AMEP#1zO&^BGWFrK7 zm20-8*PNCSK*mK>#x`Srfqw!n#?Q=H{Ut=`l1P!yhFP!IdklEw7g2SLfGF*^J=}BR z1q13NNnC3e@0fPBUfkr8-$FhuY=mBjkLL7hO0UNnmugAqi1q3-3KUFk3;R3*j1XZU z5;sDjHp7(LTvFO`saN5NHf$+0v%g#^eVVgbLkrm{?M>5nXHyG#Jbx!}_JsnKGB8R} zM(*!dve<%e$XnVSmX8vR2V88er8)?F4ViE&6%$Gld1+LNW|arN-C8ZzWti<9l{65` z3~yx#*bTlqCyHq!veQDjWq%?KDW%{7f+>#)wNRZA=6LLN`pY!e#dKrg7X`R{DEFmRh}gRe zvZYBOTE0`Ecdev#J`9!hu3EnxAH_dJiQfPLxu&sBvv<(x_Kn?XAOC1h|7jep>CPHb z)>Jf}_M?))ByCADW6C#Al=72yY`qo^?`hm5s^DycAV1k_u762YX{8qI0kXypnJF2fRNTy|#EI$;mGcZ6HF86lpa9$RHS z!-){}m)W1L8j=kYJ#&+;PVROGa zsGcAH(|`0{BzwVObi^I&uPvt{Nwme36$hr?*PevevTbRB)GYTcRv^vHvje=9+_~|* z5VrHDoJ2(@f24@`)KBy$+6_#YzXb|^AxSC-7<$nd&>WL+C(>>0rWPfs2hBH7+llik zU9_&S*AoJ2z+m5CaJRNL+Z0u@*{M*Kc#)IiDSvx1zJKxnUmg5-_SqbBIHjFD`|K>` zU&w=iL3M7*Su=NOkWE3@fmHtX4AnU=D@BWN{E>`8^T3~C2H)2)s*%G2E8+_{OY**C zhnzFEP>~e$W-^%;{fvN!=U*}X=>k>Cb^IfN%}U?M{RE}RABuemXky97YRja_g-}5J zNq;D*Bsz$C6oQR}9PC>tFsQbaqieb;AEvzlCTn6olfs-kUWia~DL%nZd0G>%QoW2q z6~QCd?BPt@9DjgMvpB(9lj6Tsp!!rC3#kJ+GQ>Az44`Lc`IwlH4$sc$IP2^zyVP&p zOk>Uft=Y5BcEx$p!z~4n8F>w}xGmAzCx75X%zQK%W+P&QiD@d-uRZ zbR2hWVuWgJNDxNU&@Tn# zbV|Ux>=)zGg}w$lnZnnsR0Pv;6?k*SA5dYKO{uO`l2f#z^h=twv#@a&WZ0GS$$z8( zj?9c7@@$$;A%|d41q%`5_eG3P7?B4ev1ptD%VA$$cEJo8mSkZONg?wCI56crAZy4c zLW~hmLVPG+iA_b9IAw0I6QgXjbD3$jg>?k+9TE$w{45b>C_Nt&e`y$y7-vJ`_jDnn zBz>6XV64cuC>B&?P7bq6QyhV+_!0uY;#=dxlY8fX8I&_kOfuz(_UO0A@L6LGX>*}#J#<#j68 zYHkn_^n82)SE=bjNP~!<3sH)I2N_PMKMCqTWW&5)Oh{IV4f&M2MZbT}z=vUG9Uo>h zhxsH0K10`WUnY1mJUTjg4}WdpV1(u;h$O_h6o2{>TAkc!b<{?aB~O()QOZ!%m9^7$ z4>6+?x1^bzhh<3;MG=igY`LlYtMDVjDbrDN&nYr928WK!cNaDUf!&>t90Qtco&7Bon0+=NDU0}rVtIck%{4ynIb-tyt# z717~&cI5r+lf%<1c7HZ4Y3!H;I)1w?yC=}l*}>5#r^iS4@9)2RUoVUF>M=guKlyka zoU_ZUKWCg%G)A?rBu(rTIkF>7rK4UkrlQy4Oa-pTb^qYB5!I9V`Bsc>H=r>q=@J0- zf)9(KUbi@B*EKRCt!v$+$V8_BPCuK>Hra^OO_Io{Q)Jb0Q)4xU z?nT8+SAJ`?2t{|9lHM#VVo>RcsMSqCJm_$Y7Thu-Y@@NR9UNfkB z(E`ivo{6lkym01BHBaFllZnkp#adX>-(x%RR2BwhvsJfaR$VM->Ni31B`KgT^;u@= z>Ri~v63lupRY!E=O!oy+rsb?~%N{~h^;@kiUYc0eng@4dlW`$bl4WGu6^S2;$wc2S#9=P&$A=1gO`DZX;zzB#sA)+%XQd^K@V1Lsoa`dXlG|fv`OKxIxa5^H;EbktFtdjZomMpTh>o8?8R7o&JN z+;!Gxh!Y_IXyLRFONt^56Qyv7FPrl&pprTv*<0Gmv+4xuk!ZgZlY{y$3+Jw^hL@Wb zpx}Mvrc+ieK3=9QKJ=!)x?;kybMQ$dntup-DK^*$vul#FMw@0o$Wp9f!eWMs*%R6; zw4u(MKk&0d+qBunD@W-W(SqCdcXdVuSlOk^;gpL#w!&MI-?_%rd&$%c+(j9z?wy(Q*PQG26eEY9Mi9R$)r(CfrC}7 zqW7RDU{zI$BJ?9?VdthF-*0ka`DJg({Lzo<)_7Nzg>N zV_co!x{Sr0x=$c&8=;Xj5Dh}5WS33qL}O2S zBADg2A;_>jh>1N{`hGduIe`YpoUuox+*K?RF=XA#MupWtf)w5LyGA!Fj(;vL_*gG4 z8L&f2(&?b&9^qUNN#mQ;eUJ~J%II5uwS_S@5Dae}us0B=$V2Hk5R zYw_L+6hW00IC2RC|`x&zM?Tt3fkOXu2X3O=k=A5 z+;C_ZTZG7R{L?;$?z&t+wfv0bf`(}z)%Ua}nr{|Hh@ujgmr$4gK>BRR~}DcTwHIWYq$*bIw2 z-B>50D7hP!6Ef4t)PKnbq|%U0Zx)@A6dqZK^vRw{~JULP9 z-_XMj-8Qt!TJq2xQwudp9Uevv77A}H6nZEG6(*z0qqb7HD~lRyj;DHbPh3`y#`iPY z;3%f}`5s}wdvvHU4*goWg=CC1X|Emy#`ueO{;Jt~ z`h$WVYf%Y=VPBHrt&^?xi(XbB|1TQ`NiC!ZgXbb(4wS?^iTmTc^TvGOr@ZO9Wt@?R zt%A;G-P9SHULuI_g3Z1%A&zn$s8pjQyE#zHk@EjbkF zt4@EVY(Isek`y5gIa7<7qDP0V6FzTc#>xnj%>!~qc{uXgtxN$XQ`?Pc!ZK$IBfJgA z$I;%TQMa2r#(<>~(pYV7Lva;yz%nJxB!3cQ`bBxfziEF}4qKN2=JJZFwVIE|v;Iq) z@uFP4?RlveV{#O%e4*u`{3~O!_VH`O}-%yq8DFyA=wIAGgpV& zll%9F6l(oITx7N$u;b$M+|cvq!{Yq;kxMCxGJ9(Kg;O++zaB{Q<@0D0pIi8!Pk%IY0e~ zZ1J5mNg=CdsJk(guaiM4uTpZoOr`_6mn+{kT=mqL2SmutaY1q?ahvczvifWvC@Lr; zvmUUwDau)4@rJ4GRi9_#RVG+`$ba)?puQ*mvPv5L0;D>#S~FxW5Fu9VS)^R&-il_AFQHpyyl+gH@gkAF75728%j z-;@yTdoymfd2A)4tz#}}JIC}39c@(=<${V~t7;P1>euW7V~BX*$~cQgtB%TI>JLYr z*ad9vO{HVlCM@%ze@bp{jwT^LxE(HAF*qAV`qIc$cED)n=&LbD%~D*FF=#3_7pdH5 zq~jP+WG*(BzY1&kzw-;X#DCvYCb8FmUnEgD?pfIC3$_MZW4+0D+=9rD!Eez5YAF23 z>Wx2z8ZdB`gfANrXq?#UN5w)4GV{d`8&PEVhKLE9a6E1-8U`)frI4j-G`tk!Ksr28 z7NtL74Ii0|p-EbvgaLPpNxk3Wu}e;b=Rit9n^MeJ}7jQ`&8bh%lv&fqVTXmll;o_lmL4h~(c zy6#triELrYGc`?XH%fFW?WZozFbRe_X!#x~=%n3eIX~ae4*fc{_r6wIZT#i zF=lB{QVuHHhD64G|QYxtykz zBVaF=Rq4i>+?z(mkfkxcZA)@3H!Mhf$?YJ$^TQ&d3W(d4b5xX!T_lestAn@;n{ssQ z9ZTKIpw_9ow1%hpY)$EP@zTM~*ds&l8Yp&pMq!8TsPDui@SoNT)2rO`+(8ID;z-f! zZinl;x_>26SwUVde1y*p0RwUnIQVe?6U0&Y@bKjH==du>HMWN3NN2bJj(S)EJByug z?NS9nk<7A(fEQWn#7#}iX~x@!y~?qO8rEuYhL`Pt9lA->$PUiV0C5gHg=bc39|9-a=7WK_Io zY*?*R;Eq9&$entPpuc4omncEsvY}M@ZhwBsCZR&|jtxzg!BaNK+2~UGmBtQ=U#PL$ z9z8B#QB#n^OCm|Om??skt>@I5qTZd_3yNIHy*=PoxQcPo{(XWZu?jtTkflUL{RQU# zdKH)GAtDxvMQL#bHDfAe)&Cg9pBZCHdB&^aTnqLBKmB@Z1~wWeMhaHIenkSIhd;$WSqme#L3*(6Y}t!51UXuzyz#CrYLf9@Zo#+KD+{g2XkcIEXBhWKBidNLd+WNiJ@&}XyiQuWw4T8h%va_aea#*8l>Cdeh7- zDHDsB<}`Fy%!%9dIDEUa;(FAwyMG@9-QA4%6?Ip}Q`jYa>ys5sbDWNpEVRcEvOv+YT|LY0E>4Lg^jjuw!$|4y~LjE2Qi!|Po3%b?&VLXd=ifHq*b;-y;|Fa};*m>Ri3OIDP30l#r^pz$fl7kC z*F`pOW$h^9pxR5ldT1F3;8I3#raKMYS@did;nvDVEUT@uM zf$|&v>pQb#qm@ov#E^;&T|=y_HAS`IW?|A2u`tDSNJ^}6f?KEhj621&!zNJ62`X4p zB&H-CE#=ujK_+-k~iifSMq zWE&c?(P?gyeI)AC&#lje7ty<{(n9bWtJ)0)UT6?Q5~leijpdNws}OdrKklb0NPDla zso+&C!JJ{TS(hpT)L5x!^xd;2R}|NxZI->wa%vOvt>l$8iioTHK2e#~4QLgyYfU17 zARlW~{(rRm5r3nl))H$!f?Cz8vBsoX-C( zdaW(2*t(LH){@g^S=CN-++6c4C)q-hby|jjv7%iRh+B=fO)HH?pzasxfVKhOg%c@+ zK!2VxI-#}3E2%EKRFTW6T53@(?(EW1Qzm_b+AK9%KYuW=uCXQkT>#wxkj+hfTEOr$ zLD$7WSW@i4uq1A!=tAP`%WJDXUZ3=)XKW$j&R^UxPf&A(YazR;MQz81* zsz$K#rc6s{RX<#tQ|TZ{XiJomONp7JT0~Ec(0^WVgfs7Av0V_9N_>4Mr|3dsSE*~} zh21TbXhE$|_k^ugd60CHdPh{NRPh;U#xob6tz&`O*g8?AXAeJmx{g+*dTniQ3A97Y z)lvB{RFB#C=N^JI7tkAA4{F@beU^21S!ZZ{TXBmICtm2Loex`1hmfUEj~zHk)9ZPl zr+@ENlx^yAjd`(K@nV1U^++q;D}Te1mI znErQU$%?F%o!xEPyYc}8&Dydo%d#xnvVSbB-DIj2b$k%Im|nPM`<~07`L0Dn-BFvm z{ZyAUKdmZ9A|qIx2*%I}y*2uFawq#08+~vLGmtU_&fG?@E$7-5a+(Xvk(kgK7KVzX z7*~%QB(}H!Fq=SYA#B(nsF@n&W*-qlLKf~NQd>1k zpoJh8w}BR77eO2i#EO!#HbMx@(FHY#_HbGA?(INnf$~(!P+(@;W71pTeO&NvF0gHA>$?glPk#(d04ru* z9Ysb_8v+RLvmSzKiuVCJD4aGzwr>PaHAQ}sGvB?{2!!F^dx?>h{xVaZGN2iv6#Pwc zDcG;Q_rkY_i(ePHi=d$b-@K3=@Er|w{S@1zeuB3&rtZ=t*YbkaA*hYOd~`^ex*HR$ z8xXBmUSV$DL1}ybrX&vAD1U~Doy?%~MNGu&gJ(5;ENsm?(NoeWjH-kk0Qlh-{9p8n zFkPlgXOyRn;OPE{X)EL6l58>Wy0S+;R)ZML(l9rPAy5IzQ|1#}f!Nsa=A3)T^)(rX zsv5IqiUPfty@n8OupYo*r2#58{SF@P>;*$AQ>CHybBJ_4%3*6zXMYf}QYZ9p>$0dh zJTqydbsl`cznH^>eYuAHtGP(I(w*Q;wAY2qt_wG!NJ=S*7PSXkuvA{MSm<=QXVX?B z#F8P$%}(A;s3mWO`Fm8Xdx@zu3bSNaVhb{`O z@7CF&<+=lthT$kcJqpcovD2Bo0wOFGX9h%?<|9HmA>|1xbbt8Ps3cFaOfAAhA&X~2 zsYXv3!d!qbrJ6Jgw3&p7D&xFmPeTl#v|zQUg+gW=zGS{jJK0G4JTj~BbnW+c$d;_; zw9)IW;X*<{lRz?(+{OvVjj+(&qk zPO)FqOacTnuYWC%Ea+=onSsWub_a;JoM_!HrFq>Rpf*UO>=FK_T9tP860dV%u(Al- z_P+OP_F+on0R9ooDq6~VfI_hvP2GY9_ecqc9YS(UR{UUuA*@NWPrR}#?h9F)kItc= zq^v(>lB^eBdhrLz@*LlKvN`q&lmX#P zxQq-V`;j2SttU$pPz#vOq}yNE#-Spuu_bIt(zk7_9or}ii*#}DZvmHEH3qwu z^y8|6;{}MC5p36E_}J#=K9!Xozh2o~`kyec|i1>OUv;H>JjKr~Gz$ z6;c1+t6h6F>2wY`*O_#>chqvq>2KrSZV&bDpI*JwqiI!kEwxR^0(=HTa zOKm_2gjFCaUyo@?r;QcW71(ZKfA zY99A~RdsfGUd=8bvWIuzsrX&w@=x4-HhgD>BduYMqJY$txW-DI7(xb}PWg;Xis?{T zRK6K6s?h@1B{~!-pFK*Vi`pPxk$=DqlBq&B2wi&nycwBjXu=VxlyMcvxFvoWHR6V% zO42#&qrIKjUo ztl%ug3K@@5bkp`L=NTxbvO#BfaT{7J)Y5%yM=Jh^(dp8YM7m5%p#&|^*nj0}vPxLx zr$`vh_6&w6#Td9x$$X;<2R(J>vm7>o%nS84Po{5VaTgm;_CS0Dt445vuKdUB#CqU5 zeFQYQqJyYqJHo^*%`%J!~5@#4-dY2G-^f&#rMq4 zfpM_Y%dGt1FGuecUpV-9RxK_#PhQPPb2!SaFQ|?|MnAkNm)qo=ynn^N#Fq4)-8*bS zTFwcSqnrrdvgWxfiJ8(>-UZNkn9rP2P8Aafdh_5w7`*_N04j|{KCsK~WdmF?NwWL8 zw@Gg<+(T!K(=fNJ(W!`>(0?h4i>#buioDF>VpnI!GgxjE7_>Qbfp-RSswtcwvJD=s za#FP=g^B79Xr;%gx_=2oJ9APxkdR>m$z7lG01Ud3MPXb~UvTbFI?wfd5KK}FEt&t} zpy$AePB^cS^4z`p0>;jDRD(=5Bd;E0vWf4uyLva=c;o5PC1_1!t4rw>UfzVbQtL2W z=7xY`Or%_D6y6Y{nG}_Ah?3+>^7sl6$;fKm`&qI3<8K)e1AmH%BGv2!5!Ait?9Dvf z?6T+NYyBuM&)VuFm_(f}vsaBrixXGV>MA`@qE4S1J$yoIpS{{R+KUi`$}1$R*YIdP z3JDvv;t()>pqM%gOmbCSyowB;p?#EUcX57xX@*r;G*xIw;QRI1ZNN3H`0`X|>kG?Y z0JYm6dndhnAAfLls4COT1iA)qA{b(G$wH9ehe+oe+2(_BwGF#zX4RxxOUt%KOgFkG z2LBVUS++><`ihD!HY?ogB0lD2mTO^?2T~v)tHi~m9-$ipb50EHI*LdpPj&3`hK-j?Om2S34r)|+?^iC^1> zChbs3m!V!3zNx&FTYcJdm=+NR9>cgi#+5jB;p|RlE)FoUV(0ADp1yt7 zk%_4tVN&zDS*CHKc*(ARe3NpvmFi_=f8V%y*}@G6 zkLec^CVw%8nxjX?)6w484<|{mqlt6WV4{8lOKSsiesW!(!AF;|1n{Y$M7fIZCvKrD3Exe(cu2C&8bn0e37+zeTtXTR5vr=An|lWbcQe|A0G4g8Gv>=K z1YLjIjM>XAeI7bZ>{WWca|;>zlA_C!=nIK&}X8$WL@a{_?G+ zD=f2h{eSqOwM3;9Z1#7W`hC*8@=WKaZ^;H_-Bmx}C#u||SVxNs_tdJhc0*8jvaKF5 z%zxe#@SRYMQ3l`#=^P}5{2*hvfy9~0OFUnocP2vJ!>Rrr@6kyi1SUq0fYsayU>jgS z$ZGZgGhbQx4>L{mp^wE|Q18k!b7Jw&E2${Uxo`<7uK6L`n!Pas&3gqqq<;Rgg~MjO z!Oh~po7AKZ%@Lw~NxqW5sA)X~&4WmWr+=3jB&$vjAB2n1587mZ*R?=}YTw`G4pPWs zPshoNXADdO%=QDMlD)ynE+PHanHVCxphonhmjE|i>18sRKE%xChc-Sai);^q=Ny-I z#bj?gp`?7FSkgkm%E?biiLmP=(83@Ct{CHG2|)vgXyNyaLgX@2APi3wlD>OVkAI*5 zTm9Uf_@~Jt`tJkwe1jXi|ERG*&_RXXgbx{$s!30r0o&~mb6X`!hfDNN?24| zDyqY-ZLfq#u4%P|C=#}d?mc6>SQOTRQ82e_$CO%NtTkg>^l^bBUE4F-RM1_SMzvpW zgSyeEN{azx-|MB7RE@!gh*Ac|#kI)8gJr1LiGo3T!a3JLx&RC2(xRmF{s=)epBQZX zh=+^E!tvf$qHZxf!!oR4&3~}cMySqIrfA$;h*+em-l$z#>c)gsMs3s(04-Hjg|S!t za|Amud>>b{OP~K2PEg;Y{{v@@w)YPoeZKt=?(5+{fMvU!U7Y3903s8-1hSi1nl-)-UY-VB>cwUOl zlb^7&%(R-m!Y(osU*2U@z2t)QwN}rz%WqRMylJAAD9>CnXvoH?NQi`FiadzVE@Gk? zjUC6tSHL#ZK5Up;IEh$^;nb-wd&@^x#J40Q&Qk0nC|UM&M1O_pifEC?O{yg-TpUG0 z-3W-BU_5={I`P)VO~}=X4J9#aPEB7FM;#eHvHdFIYEKpO5{l6wj~SeyK8cVL?xt( zGObKm1V*9^#M70h%*<=L3nwx)1=AGTrjU05INSxA_wrc((~r%SwX2uRx_^~j_@CKth10GzbmpW4`_$h?g8b4yWiTmc0HQ&&`@1n! z9)G!c6?O88>VUNQYv_0V3M80D#Au3|y&9yW$;(C9L}6;aE>7;pOkd7Vn!XIs)%0cf zsOcMK@^3&I6l3$3zhMvQLa)mV61&uof&|8JhqZY_D1m)%T=^c1OCd45br&y>`{ZL<3b zwzKl~AC7)f=$ zYLQxrwJ>Xm?fq3^`&8%snAqN@dH*hm?H!x&9Yu`LSSH=1)s+`c-;lK4?;x%B+kd6C zDX%lIORMvS5pkc52$n{KgGeyXUYMIk#T^jjLtr6y?_oYE7j<^0BpRiok2ba_q>0|n z5HOI7vw~mNC24}|FfY;fMfuVj?;>;p9or_BSjc&qkepQYz*hr^O-01=)wNtEYq?xm z?$2boKbg9^oOY(pED=nlcAQ(FZhr%P^)lgpYMB5di8B7XUt8D zpUunpVp7C<=SIb1x1>GZY}~EZTabxuU#pgjrzQZcDjc#g{+$_4?KZ>ca&^~dasOq7 z%yE_D2<68R3&2?ni|OzA<+_5gsMu0>ClYRda}SJUiVGiicaA2!A43|4G=S z#q2acK_^3iJAB{ilSay=IGHkmYilyE7Zg%1Tom`-S;bde%;MU4r>uF%+eLF!#9a7 zyc{$!bZ-pN=#SB#!&J^6;eSI4(F)$nUQ?uGaWbN*FK2Iv$*IC{^~Lm3_WC=oWv^;n zBG<7p=A{A)BQHC&PqSLwS?$fO7UT2cymSsJI;{TC<-3?HvvLCGYXC}dX5BFaMxb4L zj5PJK5OZ5PcnWv8`sm&WZ?hI%@>>A|pqyWNyK`M8MUC5LCAY&ZH-9BiJ0=u4t8ax8@&bAGO*jZcoef5G=5#2#OsrvFJ<>fZ$mlY{O=is zZD3*0qAEqSXmWBtQGb*`;BNg*&I26yxd0gg4L`{SG)c?~3O8PCj=FmVuy+NAigv=r zRnEa*BZSo}GjO#)IpZH#biyBQi6*Eupb>BG(8n0r z8f+KS)u-jGo?~1b6crGuu)6=p0F8l^i2KH3G~%?7>xtqo3zuEp)If01-3A_oP;QSx zlaOGM-~X=oet)~3_*}`~Xn;7IfnAHG2y>b&2z) zZ$U>1>VI_$8u}q)ES-ZIbAgti#thaT)R-ZoL5)8_YDu~@B!3jM4i~CbJvIWea8F;V zZogB_{jo%`#+7PDu`>QK1I4dVOK$QSwSvJXl=((-V-uEL^(Bsfc5HEKqW7WET)i?^CJ0sV8GSDrvLIO%0nrUjCWA|b(a1(78( z3{Ig201hLynZiTRQ$d*_7J?YK!;B);X7q{EBBgjv?!ik@hCRTY0C==f0kJ=WvBS7udMOWi_tHzuy$4b_rfZxSZ_nrOS`pcO z53&J>-)2T>S+4bK2Q**g7i0xAP%VwP{DRjRgX2Yc=B&G+MB9e>b~GQIY<8&%f`2eK zYmo=GSC;>GvYP0LjVc!L1qiW`lJ)>4cdaCe!#CrMSYTQSO}| z=d)iza=)m4vjYOP7x{^z!!QV9Uh>Q39CnZ`SRAhfB8J?P&V5X@jH@x+o2bEnK>m}S z+RP}E=vV@vBP!Gk49%AVv!#;yq<@-8&(bGQT#>pjXUElST4<_QOZZ3IJ3m<|2cHur zeau78>6+T`_ElVqW&Q&w8-3bhmpv4R=!yd%Dm=@=kUTPG&P3RAl_;y}=RL+WR z^cq*JcF9>?p$`JuaQXQ;(CF|Hr`_dClHL~lXuvFaO`jlZhTT1c+W~iJw-7YC9rB8c4hc0K4k@)kQnM+4j%|rD7Je*}u zC@4MpD^>8$eR~Dl^Y6eFh^q0p4Vl=rfWbj-e0T70@2A7<-TkkQTD0ZC?6{ool(UmF z!H;R{F%793A5;$fDq2+dVR5=B z&O&{=Op!T%T7cD11N$J>m|Mm_tnjfva#3r+?~Dbjf)3d@cCQ=*>1=+|5(Co7?wz^P zOMQNPNy@%UmE+2B+gAJqn^$Tfc8+sQ#r1a4B~r`%+pooq0b2`Z8h=R*Yxon&wN!u| z0Y^J|%{8naTqsvRjykf{kkao+K!i&s==bhYZg!(wwdZ`R&Tc1 zm@Q_arxR_jZ?<=i#O#8BJj+k#etXcZcx%TJghJ!vbXFFy+P_3SQfC7Mq(wB6b54V_ zoC5H*>VLFycv}tZXnEdD)5bXM zwP*o9IYzWVbVMu7c^?7;;(iio1gkyuUd2f<{X7z@ zMro7I6HbKr0Do!4J`w%rcMV!Gd*BeYq-v_^3m8B@g|0|vzX`VA@jTbp)ydYOX)CyBRQTiE2GcdH}pG+@QiN5Gxv=5Ch`7|8A)%t zE!M*YKz~7bnt9G)UDv{7qUi8o?;G5j`e;@ZR~?`aAlkRvhPY}6MS<=Ly!Tr^DF{{+ zy_@BV6WrsaNo$$`XjTz3c?X-cnrz62BX#IP!uIFHBicFc#SveoOJk8UeG4&%q>L4W zH&_syPK9%%Nyny-AA)CQj&npiCF4h+`alqOi+@vCW^^EZjHGuHgz?ufrb@SQLs53@q49U|`8Kfq~oaQU-B#n*nXr zNt{x202F?6z<$+_a++@f4|7=)csQ~1$IVNI9%cXuJ#4A~D9Yh^<|951#wbjX6@LO! zP=Bk4!HnNT3}*N)5rfkVwj7Eb+S{nXwsvtr;XDcU%gB004Hof9BT_Cb7C^E`wx;S_IAJeeDBba!oDf#AjFo7ycns;;bIiLYoLUY)=BoTxl8vq z9|~fO8}c*NQ$GP60ySv31|@iS6?OnyK%~EAP-B0$s2L0$y=WX}3SEG-QSiZIOSfF= zO`y?Nd=o&=x4P1~zTVe*FhP=GgYYowyGKiMU*9iKF6Lz$oqcR!6p`{6O%Uv-uPE zz)r4rZ|V%z2b`b1w*{8oYrTX-;ut8rj1jD-1&AUY_{`Wr)42sbE;enf5QV45D>_Y~ z`@B4jJ}Vhh>%Ao|%R0&&bQV$qh+Z?ICD?zp^a0)t4*@Drr2Br`Mh>hG6h)bp6p2u#^mJv(KT zh2x1~+ha1gf7wZEX?UF#IUSbIT{488LQRTmd-$n#mUL$*GPW43H}GZbjrA#xlwcbWee)x|ZrkGuyT zN5^}If<23VT@;JrnRkG9zQifl{TRXmshp2XQ08~3HxM3`9u#hF@g6{`GVz|uC&~-A{t$6xDhq}K*Ex2Z(=4)SM7}(*qI{7bMP&Sk{rl?d9%4f49UH9=6D19ot zk1eMj@UKCDdKkKVb2URSI=P~&KxXVr*h=Jb9=X=YLha4l*@*H>99O_Z>P>&jx_cuJ zi0d@)LPlT9zFIj7`;J4shLZyS57E{kI^qdD99z-R3Kn`}#M+_6$OM6mymbaR;O#QL zuQgtA#9s5vv(NsTqjZCq2mg!R{ems#*+*yj;~-C>FmmSCu-J-~7Q$E7O)hR4h}U

      z9B?YoI4hjzpzW>TImNSpM=TQT9WUd*ayNM}#Zx}b(yuIT_^L7)Px3*L=c<$gL zH0maUx-)-aehkU=cojCoKtjkHPqZx*I3MlO>-J)D9=XM{BTjS4g`jmyqg+p3Z zW=_p@&ydo({TN0zlkX=&EOr-^fLv2qniM<5z0RY!B^;5(y%o)iU-8|-8MFgNb4AWv z*i+m~ZLb`5rSxcjdq24VG2v26ot0It>efW>5>tmvI#CA?Nt3a@)DBRzqfVP(;FIGT zKbxCgn3YqyFJY7;w=heDsTB51=vAeT!f{resb&EBh5({)|DZB7JdF0fs!)lv5Ut82 zmsH6YlZW9ujIOi>!2;_D_`iAPwI<%+mVFxn{6LC_Vso&6DReh>1TE%pPGEtf%S6-X zKQfoaPxhi6t7rbCi-xfM?bqQCj8>u-O+?F^mI+J^_@@xeFW9X>wZgOk2*50CeE zV6AafnxJ58l=A`)H^_xdep%K{u<1)%PW%M*=y>n=;Jzt%LtKpZbo{@JJ znCqj^ikzi=pSuFq%7_3;j?WrVqURH2$gp7IkpYB0nvhN4t;x2f`KerDuh`L~3TR-3 z7y%cPP7Uo8drGq=3t4o$(*rZj^f@jsMau|Sv`W8!A?D?nejr!mFff~)uEjups<%J{ zdc1Gg#Wk(h9RdvZ6^y7&adV^BVYg$|K0@dG>>ZsHbP*{X7%zBYg>plCex)j-H>_S# zwfJ~DJl}@?+WYPxx&LtQ+b{Q%hX+T;hmU_6k3%nJSy!+mrcR$)m zNNB<7r?^o8GH|AnOT+CVpr^O^(k?>xh|q(4ruXRas1c7z@>*w>XaZLfD3Xf6pPo9o z3kS7FL~7`hfkyh08@vm0|w0=4s2hX?1J;#XUpA>Kl$Lj54XD?d&93_N=QX8YZ8sU598K3 zU5~uEBnV{XK5Yclo@3Y#3@K zz;_3a4m~i`h5Ok8RRQ$WOg(872SFj24`10V}eHQ4G?|jhnWiu-; zK|j}lK74Zg;P3}lQ1)#0F^DNG;dc8p=h5Cz`;SlHPxvo7b{_O2mHnz>pdan;eZSv^ zzF%H|87J74(9o&hd;>ox+6a}nw6_Y_Z-fqyp-)L(A*j~C^`NAIp|K`^qv`B!czV~F zdst;=os!IyK4LD5iFZNRENk$)zpkNWjqhzD1{2{YJV+v|9XhnktMTUDth|?u+Aj4r z`RhASgnxuM>u$8^N__026Gr|s4(Fd5X*d({vcD_QL_VWF$!7qZLlItWX|J|?xChfZ zh0ROacp$BH3)vC2{2gYK=E@R(Z457xvT~n~Xoy!BJE&9*J}w+uHV-4R#rA# zo`vaNla*E9dTKjeB`M@e{|?yc5|I>7ylCF!7zrLZ^rcpl#9Fjp?PHR=Oo($m|9tV| zl7NwQ3;x3BRvzwfvf%p~5!nJ{ub^u57A31&0_f}7|K;lZg-Hp28o!4Sy<#`j zkZcbsD({y#Q=#<@BJ`MAD{T){%A4t~5xC>MlOUn)6txB1?nBL!R!c67D`XYxFQ~G= z6l8Vbn^*IkPVFmGtp+EqtBa>4ETwT;c+>us)?n_Co%`mC&yB4nq_=8#ht|jZ9pKg9 z1lm4f9fR?1i3*KB%S&K?i7?f?%_zr_DPSXfE#tG&F3TOXUS4k97y~Q(yI&qRWr!Uq z?9Einx0CUB)))y#6uq`Yv!VR&!R9#wL#vf;OJrqb%q8Vaw0a*_-QP!5L zt~a$rrk`O#Dh0dV&O)X2c9x0Uwv7c=;%qFl6KP-pYm9*PmZ8*MT#jC4t_K)|>hEnphZ~N$HTO~;js~J7GyF1|z zyjZ~fHGR&9`%+t`@L2suWj?m8gbH6w`iVX~7)JA9E=f9EF%@Ev7*n*bOYf zg1{TW18)8e6F%-MO41HpOrP70$6@Nm`X-l-x*ud9iv^cN1!M!eWj6uvN(QiInZ-Ut*5%~&nXs#0kRwj(_|3` zk*VvX=@7SlK}d=bgh?mDA~L#O4*!5+c+=A<(-OabZg{XVcY6hsOt%Es&B+CusH_kd5E0RM;my{~mbiKg`50rZ67rqn_zD}uFn0?x#9 z&chf+`36`EVPeE}v$q=^h1mvO!-mkScKcd^5_v73+58wzMyj6hn{K|W!WPj)9KbMli{#7$UC-sOK9_D}52e$c zv#l@#A5(H&MGW)ap^HYFYST;oteCpoTv+U~`v!OB(%~i~$~tfZM;?C@Yf^=Q@GA8h zi*~M02NS6HHHN{!{^UqpF}><89QW&mJwEsUuq4cqU)F?*vQmYiTZNyFdUn>;NsFlch8AMiD zxLk;tf0y-zji|&vQH;)Y=?|ZQ_VnT2d_MB4_4JjEvCgg6fz~m``uc9_hrLGMp|qTT z6YL&*xrl_WJ1GcZwEH9{o9=Lg&Jiw>!vgnn!>|pyL(fnpB6^OK*qe0=T#X0RotgQ$ zN|2SmKOa9@gCLNCUEeH=Jk+Sr)@*KO9HWOtz-otm5lU%5%F4)K6pCaLHow!}ge%t& zK1KWM2emX)0xFXGVHK$j4q_7u<+$d5Db}GuY6Do7j&7K_Sv5KV-<*<17#%ATv&HbE zeeTP*DdBGu=>-{2u(m!Kjj<-Tu5&j$-6d0fnvo_ygp8cy#ekxo*iSaJU+ZzHiE&4C zy7M)gJ{zFVUt(wF(^0f0xWKITyR@@x^YqlUW@EtBPs6_44S5n(`{vwkMIEkxs<-W= z-?R?@y*}G;RSW(6LFPv*oddm|#_^Vd19RTD+cxMbwTY}qqk<~ZeW%K6YYo=<5WH_3 z+>EjQ8tF|pz7&pJDuuU9r>m=Ge!Jv`K2>Pnk(i$VvKU8>znWK&3f%RDg!;f>9nK6 zyS%iW&FsUynKL}lse1ZaO!xnyehdC+`6v9OnmVWLn8@%Dy8+NzuLKaRR}brzB<=RP zH`gt~9TlB_o8Z2!cN49;1Cb<~ zjbCpnzvck`+s7fZzS&58Df@ZD9_AVF=4g(K_-Nu5ip{X?= z;N{f2U6A{KP}&c77vVlYleT(Af?I{}*)d{wWB2K$q-;s>RC3bq>Pr*S;`Bw&rsHW@ ziCgc1tR}tyT3GG%V`s>__apls5<1v~&KaI#hVe_4oRuc?oxMB^txJ<{%S-5&azTYh zkd)?F!oth8NLvkB*Wz$RsO6PU9I24@Ry z_l)qlP4czx0s6(m_quO>Q|c!C;nud}0iA{TO|3;p=&*l^v zUTPQ3TU-8VR@alD30A>2!2ji@&7@^AUxdTV_m|fE07yW$zawk#r1MzS&;b)jl0IMJ z%=_B{2hpgbe&SBHwmXX5!P2H(*71rrk(6|cC&95Be~Cp@Rr6YPeNPgTLydEKhnoRGoD>TCJVMYpWHCCT$25G$*u$34#?U8&)G`Md1w0nYPfobF}R z`o4{R#Fk-s%jx%8WkHeAl!)393|$q7LA3Td!>n_l(dlTve6Vzj#vh3?W&lPEv5g1W zCc`XZf1uf+w&4Kk7($VjMSKz;223+BRsH*?8DR21In6-3u0PHEJEj$A%ByMR)wB{h ztX@qkFWM4Y!zLt{)gmUO0XWt!FO%e@nmUHAG9#7tUo~w&8(&Qu`kzJkI^!9y5+ zrco$GgmcVLegVZazGkXX)kR(~*t|T;r`|#LT>Y9s#kyQpQ*|eS?|g}fS%%*(?v@xO zqxNbUs*5`x+sH&jM4gzOR~^!0w=>k!f6)D^TVGp-4nu@T5VG4p8DvHOWYE&DFaB0j z7m&P#Z8nbloW#iMZ?b0CvzxmL@pcW&(Wct+Pq+@Z;XK@m`w$55=3I#DjjZdr5jQ>L zB3=1DS#CZUBZp%T`Ur2M7pEKKA<}Mu0ppk|-l*dOA7WkzgqLxRK^br*=_z+Uj;mc^58zij2pMf4AsauiRUVqK6X;Pe6orVuveub@xEk1Yvh3~@e z7rl&4%Yu0;EAg7#R3bUaP;QQQqpJaGo53VDcL|uCHewmGjGHkYqlm_11cA&oPfj?% zfT|NrMPQ9qUYN|70CAqH3cZ*de+LYBh)dTgHDChOg-X-%;v&N?IJK!dvG6i)&U3K2 z$pz;ab7?HW+U~j^;0q?-0P5PjE(T=TnVKcbT4&H8b`7^FLUE^LGxSBFE-=frgPKWR zvk#nu8=TK{CX{K3-tKQ;!VqevGPIV&EH{v;UvPL?5KX1&Oo5{sI8#-Dk;z-(9U=*mHP%9B3en%2a6Mi65%#c}aWQoe^tK?LnTu!M4=h?4TEGz@t?aEH# zTI^3upKvN#s&3>x!S75uf17JIPC-%55u`jdf~lZA`4k_FKT}x3kvwKvUl2#F97-sJ zdcYm(>2i8bJwk0@eL4h)axr0c+)Abfz5F$+a=NBV!xL9E<1zeQV-rYMwc;{k+(4^b zl_E}`Wi{$P9vWVj$t*uTRTZH3^o$$|Ry1E9u-|qZ#y8)5GdV7`e{unD7trTScRVJ! zS*3l3m!e4+P>sgvcjw4XnDQGo`jwD(?$3-qISk)Zd zB1$H_WeCeoafZzHe+$Q5K|SD4+{vH~vi5?%K0ggAR z333jXf68FGlYK1qugILM-_&&3D7WZIX3Gl1Y5;YGjr7SdJxH$%&`YFWhUHMtq}_Z^ z+ctI+y zCH*fja(}URtj%%Lz|Uod|6tOANy61M39l(+e}>TV2(L0Ez(9eHbLS+6%Q@ISLSVvg zXCKzfYn^4^B_setp=YgDtJP|?yIM(|qR>y%8L7Bg4aem6)^S|zj%hh2x`&>7o%I}h zq}@8Mw|=8bY0KDb#`6~)=gejajP!574-gLEKwhYlNeTm!U#64Tq83!5bh)otC8|El ze}=D16%z6=DJ9UmAer1JDUGj#`jedfhgF{%@=n5Tsmdc#`>8vsa+g#c5ge-K-e5IX zN6fnQTz^GpVr@>GZA@XdNN)8E-HZ!s z%}!1$g3G7Tqv%OmW+$`g6}V|AKY=*>8PH^Kz6X2Z^Jz*O()PXb7mtdE#^fi+w}+^sa=Sb|Tff0=iJ zfNh+~(0BqtP|q^s7HApgZs^1WP0uJ|3h*~(xHva$NechGQrBDA_2lLEvZeu#6@v)Y z9PYSBZHDGmU=6B;MX}3syTI^W{nZo-BFzUwpN1^C|L(`f`Fw`RA2z=8%s^aN%=a!g zKn^n!AiRmLi1FsLOkJ6FkNzW{e^0RG;-i%G2&>C0^|toWz)U5>o1D7*ZUTZ&BuTiI% zUDPZ6LJ0rjDw8PVbp|GUWwC&nl2i?T$9))nl;_hF^s^%=`^R)o;Yd)If0Zuziab{)+x;*I36kh9WV@$4jvRJNt5=NEMhOYI%4kYFxj$Rr15m-tE*ee?#e2ZQ-u9kbi@- zm%RXO=mz7qhrMh8Jam^iP8KrhfI1L+G6NP*R6gWIGOKhOoZ~_UYXu+)mz<}Jlovlr z%)H18&}{4E=tLiGJ>=wu4Y3H?Jr{FY74)&9S2IbYsIk1ZLtokLdre?dYN|R$y49kz zfE`i}ZBj(@wrQ^9f32R=Weo20!TbmT?5?+&<{K@Iy68>I(m#R5n*N7#xJ(p2b5O(k z)@la0htU^X=xonWL+EC+(+zd-<+%*PZ%mGm4vTqITp!5 zo|RcvZ8gvLe@v(NP)8{q-$YEH#4fSyyhzJ3oe0FzuHTzQ3IAPpM>iGoQ2=6YKBFTG z(bF$JFcnTfDFD<#4u=z_RR+VO%S!lER#@YL-p+=hoY5(7GE<;Vnqpf3fC1$6_v8#~ zpTge(YLY{lc;<8QfEfn0LG|_!;yCVaY%JxI0OyoBf3g}A!)HhM+c$B9UUo+P_YON_ z)auYsyVxo<+Sgv_V=5$G)nfKF`YMQ!6-`y_yRzMqC7eIbLJ{ttTP7AP2O!)9 zM38xzoTU5%|FDZQ0ZwWEENPtF!y#AaS7vExA5SRKiF4A!V9n{~gHiNzp3SVv^(7V4 zJpZNke~sAhVM(jar}d}jh!4G@4F@S!Eus1GsiFnOS-*>5bb3|-^|-N&sM8unjYz$s zf%UiA9~51q!f0y^(B#6-Yfh{M z$r+5z5VElv(?nR-Mq(63?yxuYmf7AI(mdDfq=3PiM7XVa{2>=edO}utNbHdzdqy8k z*M&*rpp@RulW`e?cGldu?{d)y39amAe^TWacz(^eLo4v1?odcmaMY+Ux4gMv{KH{R zLr7@E(|S|Q)Lw@RzGzOZc~Y zFm7-u4qt{T$cP_J$cCqzw2%)1z^|mJjOsnefAPY~;?j1hxq9tzPqd=MJ6wK&-(_AWe{w#3ePeJk z9%mD%M%kp3JmuTR7zek-CS!7@FIT$A#;H0hLATJsX#SDlcrwmdGcIkpl!osSQzsU< z2CdcfTeFyuFxQ{ssPLd1p!IRf>ha?! zG1sFtkl*r+1o{KFoMP2WbM$6!!gGYR7T3?IeZvofz;YI|8QT~2p`Z~7An}UL61w;) zIj&OXIM{%i<45xoqA{QT26HkvVo$+UzSU}Ujp2K4VHJ^ioNfJr=~SBuFb%0{ri|SN z>jNAQppWg*_-Ag-AG@RTe-F$G`7K$BMa=c@^DMQR4hrb6vR^m4571;CQfHJEi=>O?$1i-=-l-q$z(H6AZpu;?@+>s>JP2J&2&|pWY$J{|{%0J}1RXL? zs&$vi8$ULsMI4uHrI`kK5ng(1;x&AcLgP~$H-s5%hP$0%e<13k6$0{#+NixDx#M*& zASPIE81-+zeMVBVf;<))hnn7_{ts@=b{;Vg->~GKX&>X>HM$rz7Xn<3#oNU&9^P>va{di2#~ohs0xisC{fh4W`hT^@ z5$NzD-#pG(;+CM0hb&Dx4R)@aA$kctriF z91QS(CdaBWIf$LhC329;xz0QeYTzGCE#8Xzol!?}@MV32tmk`9@+q04St)&>y;Jflwc$=RTaq>9YX zK^yaCpe#&5+wx+dYz#|fYY>J(Z7!RtL3sLZ$lsVSZ2#MYAtXcN8iXM*J!1)BF!XuC z!UjM_gH2g?5V(<`!A67dOEp66js`AVWQo$>f378zJ1jkeXp{j~|GLw8E*Req$7uLj zHcK7b@FJ<-x}E~>CzrgKvh$+9{g#y(c7rWcJpzmuFG|iZxU9fxo0dC770BnBaA1_} z+l#DBM|E5D9ou6#Ko(mbsp(|=yv{?ApYno@E2C}LSzm9)S=QY^SX-!fIs>^`vnB`omUanMt4|Q#+Faz&c@Y@J& z_Zx%+2ZvU97kB!23|DQ+>Z?l@~PRi5`$hLyLQ9=e|FpI*Ji2v zO~kr|KBgkiLrr@xBl5);mhlXRO)K&XhI<7Ae1e`HL5M#f&HwAP$U`n{Llv^QiI(){ zCh+)sxVlPbs!Y=3Y?eatANedTp`7pR#=AWW{Tf7m3;>w1lJjQm832w5()vD5&Xc1I zcSsSB^|b0s&)!dFv$Tlzf6tPW^vCr${^83aEioI1G9`XMf_`|CC0p?)Uw*XVd6SiI z;7Z_6T4LRdA49xAQ@ya>#ATC}dV^U%IXt_XROuswD2g_t!?dhWT#}i(_%*X{E2rww z5lGquI+vEQuJ~mEQZh*`p!78PEdyrZ?O$gpH%w%f*u60&-%smAe-$o3ks*7~>0C{S zlR`vRm~KlKRh%EwMyZ|aUnRe!kuz%TT+lb$PA{80hy^UH8qRb*>N^DM z+fh>1tNnD!vgC+F+=~3Gy(jx$A1L(Zi`_sviHF4N(ranE74KrtY zd6Lh(&t6Ac8&W#u!|M8(=_^}#@ zRJ;J!&H`LJeq2`PcQ&Fuo5|-ze#C41Wptci76Prdf9h)RGNr*QU_|q??2nXWcbXz! zu)MlR(-|+2i}-+V^(qWsng*#GP=@5{CP+&;WaYX60lG9&mJ((xFy zSO?89f1Lr#N;Wb{ws{|k@Ttk0pcqUtu(re`dR@!W8Ku~iAc818Wyg#~p>NJu0D^4T zLs(eL`&16*OI}Q}SyG9KylC(=?k8*kCw2cNes`LP&b{GI5;n$=!R4>>r07yg@7K@= z2<#44K1bW-EHA4D&V>r=O+^mRN@RHfdGU{;e??R7EdM3dx`KX{ZPq2o4Bb9B%?l5E zKb$6o!Gym8F}1BmpnIh`Bi19KWHpLa+C64{b5;RpAmeyuIx%Yiy=u=}7cOnyxtCwC zW~9YBsgMAif#+#~?vy*m+wqo%F(x}q4z>Y|A;5~mV;+$N2BrHef+cU>@$->_$CNqzczR+0q(^J`L9V;s`fSU3Vw zNyC@YsOaq{HEG!_h;NMSORUns2*C9DfBu(G_u;hNHy=F4(O^%!NY6P;0SsJK+dB)} z-sxz2r>$-GF$p!cECdR?jG%N1NVwFma(5ifB6Y3QI=c3CID!MT?w_P~1)0lh-Ug>$ z-w-b9Fm_3Ab~4199l)yh{=9xRy|E#E?16k*g*#5z#`A(=ywfz9=;#pdqA0|kf9TPz zX7!sJZ9xXII|dm|HUd{ZuQe`l3%GlO!HhTKt$%83<; zx4EeS=C$y=6;Wta}pYulK z6FSr9LSXD1L34@NtND8pUrQ5}a{7T38XtO7f6=Jlk03iNEozD-@;%tOpHEXFna?~>YO&lYWoT4wri8y8 zXX$jJ&LR>bN(=r%?D^Qxv-#OkS_n?_`%lJk&noAqaz=?b=8udLklBml$VbMutv@?(bc3l^-im_^5 z9kwHptgtV{&;|onBRjM=jT~XrJ=j6;{dl3Q7HU-R zfZFaA$%` zI_&|s5#H{}_am2zJev4p_O1_2Y`e$OBg;7nmgIiQR#0sF%qdapEPp*#T-# z+ipQ>2BCwP8bwB`2s_J^JthW#u`-k)4;A%?1xIV#iOU(ScqZ0VB{6i>vnf-9+AWVe zcWG3GYN599e=k9UNgjZrGH5(&*j@FPyoet59BZO(*JzXNTAL6z;*+#u)axz^JR0;scu0#+Vj>!|6sZLMjgm)-0;vv|8}e~^(MY-% zoz?cIF%t&#XJ=7=R4P+5f2lw5Xvjo|5|fuo$BEU~;W0K;uv_T0gL38nqu0p4>HpEy zf<6)Ewwxxl)mUXkTG~Aea@hziC=ltX*sb?T&g$05Usv^cjTrw{-aq*K>8Bq&e)`$d zuehDZe~66OUgA$i-p+D@C-Uv8c30d2w_8gjc82zKh4Gx0?gz!%EM|C0wSO(*IszV; zxV6CDULq51_-J^LEvRlUrnBsceu$->i`@9^h$tMXc3@s~ ze?OSw4fXQ#C-)u6G%qrG+GLlZ28`=(yLF-Z%-$>2gHQ0UH4&wOWK0w?i^wSIGv>Us zuxVOG>-jmSu5QpUBxk6==+0g)ukGP+R*a|4keXQG*E2TU_K($BVEA)cr1h=aN7h~R z!^YGYa5dGVh|Ve(mvG=)H!s~iy6ZY9e@IX>W4HbbO(*^3%UrAg&eb;UW?n-C1kAN#6V!-a zWfI1Dxn5TR)SJ4~EO^*$Q~OfKHB{{~n+4Ri$W`M}Z(KZovUj*gJ6?~Ue*MMae^=i< z|6=d+51#2k`%xk|1SwVwK2o5!QpMYfl=fDB~^No*HCM4GeCuhNBR8o+Q@~R zJx+>~93eUU?i81&$$9!56)dCr_yG#>^Y@>B`=N^m7bpgKe+n-nJU;|52M9;~+1h-T zRr?bH<&H$b%LD2uj{ugAubwtG>a-Tx?EPRMN5Rr(8;$S(!(-Qq9{_akjdSqnZG(e+zj_HEEj; zwN>cdQ=smq!@8dA8tn#;pgTB$;@{(h*bwpm@Uy+ISp2yqBmT$m^P0rJ#g^RrBRiXe z6{P-e(5g?2p8wAFCDS-?PU&-a>(p^~PK|Vq3pz`;c&;(#c5lh&eSupAY!$8MF`9q&Gd7@}d8b`e*>wFAvH z)p8*Bn!eo%xZ3YrV}HRC-g^jxEG2Z$&lM_kJFj-jg@;Qe_w1hcIUCwrvfRMMEWOa( z50tEsx<1*mk_v)0Ic0dDO|CqN2&ODhtn~J?P4+-G-`qa5)2y51e-tt*i!&1bbVp`X zLov5~xe1-i_pQrISUM{&L?muBFOLZd&&;!9>j=Ea@B(@?jP_XR>-xGfZ5}WL|Je9x z8^)_HyR^$LVI-jt{u4cn-+&msFkh?&>d|ASNOw4jt|h%NaA4M!`pu%sbT#4Us8S9a)Eqav83*-R8rma(xoJIVY;c7RFc+}UlHS4=s>SMvPl70=2de+{FBMPG1SrWKBwNbc}tRJhyg@I#*7<7|pG`!Jr&q@Xrh(20oRl$US1?7Ifh|?F%?iYvoTNnzsK@9Nve_!51$_T6*D_v1S`>K!yMy!@ zpT5vF=`{@fW;@?|5yQ>g-lU(P({BE347RlCcT6@vf7#p47qq%Z{JWO6&@*#28vM3k zV`TNW1CdA@gjS}Jew{`mAPVs>!P3t}$|<1B^gM_nIS;DbJW6e_Wi!_7p6nvU0o=b{ zoL9v7x@XVAtRg>?Xr!15`_`cA&M~5<6J?B~z7?Qu2`fA(|jy$D@-GU%mYY84LKYrs+H7Op$F z&wzdS|J-Bqw!sj?ixR-xBxrasqDW5ExM}Xw;|&#?3+{DWgk$74+zdsom$dqg48jimn)0?&EsC{A5=@MaqDUw%f)Dg=5 ze^wn;3o`3!X*0D}WwP;@1qjX3_F63+K4Xm=T#>aVaQV$AmyxHe`~pN3K+eBGWYiC^iifn^t!cQ4D>g9$J*RD z5&H}?{0GwxkRBnx0bgz?Go=(L&zrV93v=UZd_6;mi=A);ru=sFuvWX4H@1@;uK@-c z?`kEjR;ztWGx$p0HeKwU=br5`F#C8r#%COeH)}l*d)&h)w?ne12Ald69EIz7`%OEhRg&k zDl^nah&1j6=XeP>xDh5Dk*uv=*(J!=$H~5rjBo0O1uygOrL4^%^Xg%sq;|-ag|w_I1J>} zdfjs;jt5Nj`n=8?4}G3DOo;kaPY5@4S%3fF{XWmG$ptVfu;@CgGyeDie(d`~6$pv| z32<*W@}1V}pq!7BAI41$ZY2EhJ+_v8oc3NeTclqnhfQd_=ViN(DfvxHf5}x#$(2&3 z{wz|VOZY0HX@L*4zJhkkDPm@ZQPgJnoO;Y#fR*9U*z;Q?ci)RAf&@EZD#7dxYG`YN z7uOskcSIDgDmw=)n4reCc5RrxF__{{0_~%~y)Vv>_V_vA@CSjNPXY%#3henTu<_#W z8_BXy{=TNH?ce;3Mmfg*e}##w6Eke>$Zz);F#a4c{vePuN%(^v2G$KY$)^)&KL2&# z!1sYIF9c1T;NX@d8?SJH3fhng4D0|2Dk84L1+2*sKZe z)~AiT>aCkxXFo5NhY`Rk73|>00E>R<7SRC-O1y{PqTs6;qSXYU$eD= ze_K|e&tR#ac)LSo_DkYl$F7x1hFviRRE#YKm04>v2)d8mK)5mCYZwd6Xc`a%BO9W( z`te^|5WB-WiMz)Cf5#yJSxh0&0V zjcdE0*_5@bRIJG*;uyKwg@Jx_+ax)oe>28;@dOMl)N5LhTdM`t zdYYGu71=}()FYTq=NaOF9k$6N-0pp!r)%7+!z}%J_q-lkV*UjELq>!?2>QKGsHP;H zp0fDBGu%u@G?QOnAJZSORd@<&0agsK0)XT;)LX)=MuF3{(NCFM9XoH}ra5-CHWaR+!n~drz>}vO#%dcezcEnEZ}brJCO4QP zV&*qk@!QK=_%a>3{nrS+(aYhfU)~z3PVz~dc? zJ;F6uu`7b)D{z!rB;N_frz>KF^pNYU%}5pN_ktqYHJ z%cY0^gXNr-z|L!ajXflRjdTpV*itX-_GR`cf5ZOo2W7mI;Kj&u`5^UlU&o)Eo_wa6 zN2h1^KR?s&`=1e65lmA~-U|~MhG~3`n04+w#5{tgiA|*T zf44$~?D|^kojcdF;$b?wbEj4h&-tPf;}*cS&}^U8M;NaDNm2gDx>7;t-PvlKJX|i4 zRk5Vjg;ka|BoiDKo{2r|8XgY4PJl_&*V}u^F)&_v zoViLs8GhE3FKCaTY9ljQM}ay*2MOxgThO>aOIKOBmPk4Sg-vbPYhC6deyt)+16&9zNg9be;(H~ z@%-ZG;`CS(c&PKfdEl}MJiKW#f47Xn;joDH^HRj!uFsV3f>%>NOMl@xk0jBQon}*N z*pKBDH#vkdA~slhqIl0TIB>30?$+nt%Z!s+k=5t&A+9}WlsO%3Q*%rNY66u5Ilv=c z0eqaz@~h$oEM^PzhbNz$9)EuS;^fT1|B^kn4Nj~-??=<0EPf71eb{^99; zg`sooHmHlUFODz1I6E_#~ZwVxK{;kJMY;WaOrVAHUMVsd4Auv10d5!k)LR(rfO=Zlkd5H`&}%W_Foh5I&$GqJFJKPtmw8cAgp$`A+hQLA|FaB%0N2Tv*pDag z=H=pXy_$GHS)b1-jmpN$y_coaMlnqKygV+`s;e-;bd|1!^ghi~e}d7q;;9fDzqN#T zG(Ev-H#TsCWFt2@=z;5#3|{}laA|Hs@({rNn&$9M!$t=-lP&+ze2N%aA;{pjXYu`( z)-2|&HR~uZag40<*4~z+aX6)p5?tx$6dam5dv~y@K;^Jl(DUs}Y@Vzx>pnVZ>sH7c zW{wENJPV*yIRK$nf1}ayQh>kLdMjvSd-!PDRr|!wPvX+BbpQfX1vD-}E%YI%&$|cp zy*upj>nkk`Ri?*(@@)ttNfdF9vc~CK43~*aH_H~8h?Fc~AiYgg%nFsMSh+eI9Id#C zhbkJt{VZgU({`irC#`T=;QUOC{h(d7%IU{Uae})KJH`;Ct+tqRmwRziF zY1sC&RSetE8Zj=>#%U*`){b$(s3qg79^yW?<&vM})!Tw(fYcn#d4;sUn0jz{F8S{|!v zr=CNZD8HTTe;Q4fl2KK!^Y?|UQ+8n_s_h~IAz}1gGDP7+k+@Q!%4-?Z$|50N&xQix zS=I*f;et`|aP~fv^n}9+QQ2^@kzhBH;q*W-^(y_6vzlVj0(O?uLnzxD0#hSn18gNs z_m6=bGW$AfY0$B!sZm@JouR#xKsvmT+(2WvoK+Zme~_l?Lf=tsp)w;y+;XZFs0wcc zT{3*AC<<-$q*D;vYl*3e(GkPF(GY$ywFlUk*?W6qMd+>>#Bd#QA=M-<8z@qeg!A7B zuGYCEFK0sm@?vdABQ7J;Wzo1sABxjUjEj$X#jRS}9|A#ItX8J=F5;yCkW?A9U9_2! zZvU}Se_p@*A>0n&%yZZH&Db^{zH1?GCfZ}VAkB>4+Z!y&Xf(`II=Wlr>4IVeu;R)- zy4l2{T{AxZfy1{OJm5`EzCJp>_~aXct&ktSL$NF~dLOBu;U*cMQ_ZssH2g05zRB6C zXF^ZA-Od^x9G%~!Pv#n=i@$kC6B7(?@M~GAe?!Uh`$u2#{gv*W#X5&xbut~=42jIoMp4ik|k<-Ig1cMTI~Rskh9rhRz+yLO9Il^t&k2 zas_P%f3KnA&X==U{%FOGR%V!SB?wOz{UmZwQ)-1;5D zGc{Q+$&i~4p_<;`PzI`@3?DKrP$i0IDZM zfds=ts9{49;oWd3vUVp#H%hu> z2r}q(4R=QuWqOreKppwW+RWW;0~+F9)Auie#D*2o9;DMLsf)}f-KaRPbUq1~P{{d0 z04R|LvW5hM?*~J4bizIu8MgGccp{oG3`e_? z493!`KcYcuJ}&q5_se|kgV61Dfc0m^+lA@Ex#z08JMz8+JIU8gwnOSQ#y-TcnRZHB z+P#P1sR!&4pxcFb00AU;AL7DW=iH<@oOau;;v$^u%`1NZi;r~%(tFx(e>9%>yfj64 zU>a0{GT1g+W`|*t&k)l^+y-|MTeUpEz9E)aJ8X=uy+yV`*l3$R+?~D` zqT=BEMr7fWb^QMzYujy2f9%`!laW%O^%`YIR(U};GwVFFj==uiy<(F*JI`!xIP}35 zo4DHTw4V6vl(}W^t~WLT)?JDaXAk)!CVUesjq2~BE84hjgcF}W6l*NIqS~*nt|5^s zcO=z3`tGD2_GSJuTC$!CY5u3eM2)+X2UMD;#DeOhZi&d@dB3JHf9Lmxndo_afNONn zza_S%S)=ku_S+4@i^Jh{)G+E&=l;*|{T=THr`lL2v^$V2Cg#px6A=w&> z9`*(N?BaY@vGh497I^9@?q}1JNVl{1?ykk-rE3-0X?^;gEVzE%-PZ`bt(Q?ow3AUT zb+4Y~cHg_;!p9WYocfD;@3XKJUmK)#GAh}Mjt_Z%D1j%hE2$9p3mbXcNPt44smdkGMC zRR+?XZYw*zDR*~ltN@)$^NN#aAh;Z5OY@iYbMFy_^eLSUjqBfbKWXiJN>nA%-UJIR zF4*n;4s$K8fAfyLN`J_emBxFKEzF$nP;~=q=NJErj2@E&4Eiz1>~WE9yT@>B8}xgK z<*Q5Vd7Q>=U*w8>r(s~=m}TJHhG`gP5{4^fJxA}>N&#%qOUa6`kQh=^Y>fGU+x&4qi}>7_M>s z;rBZAR&PLX%H(vO%d|ucOPI^XQlBs%CT}RDH3$YR%bACE-!gR5dEL>mlamOY=p;?S z{n=W~f6Tb@kw=>~I{TQzss+C>g$W1zqIagMAb+WH=u6kXUPS;lcq-IHYnPhLSNIys zaAR6<7fJ@u?s;B6P6J;1>1Jd-+ee!kn#kJ3u1@Pffa%r3-zMSB_x0kO~t*e`M;#DV?k5B@w-wtX$_% zMRxndo}0ua8%wL(1r$&zZt9!&)btt9>U~RI_;Gc5pAtCiTIgL$0{Bp+vMGkOB{s^8 zf4o4?8-9`Ifw!#5z%_jBPH1HK8spN8fqwn+xl<#~ zms?z~>D-&!0dG?BFP(D}Nu8(%o=+Lp8-Gki1ZE7Q!wp1msrmJa2siYXe36q7b`rdv zL`zhBSj~wv$~oLeo-Sw5CQ3?x_-6AM*s21m@Vx|M04Yc=4v#p)vjZPQ*Dua&ajtXu z9axgAEQ@kP1$8weB`Mh!3q^|8O_}v%j*jLR`A-B3+!r?nrO|mGt;rl2jcRLIf9B7| z6L+mp;zjf04^Q6v;**mzazn#zX&k^9T{$JMOQP@9ke*WjA2fsgQENq5Z^Rv!4x}OeS&j$*CI{Wu4Z?{Fd%k zC+Ib1Ln%1%pQjbX)?l@uQd{cN{dKeIKk<-_`HI-la%?o(~}dKUh)#{rfF2)9Tcr*oc%Ucyz;Ai5LqI(nmCM_sadOyzf9@1kGKq+U=|lj%c#LO?nZ;xQ*Wyc={? zqz|USaSpyNkaO)T0p_Km#`y}c;ELg;GMm1H+txPcA)H~oL?I-|`Q}JS9#AfA487zn z3Y;$?zLAO0!P5jAOH*l{f9F%6**Mp_tRsOg(OpT%`2jc*aa0HWqovq4DU58tNJRDb z-sRk8Q(h`({p(4D56a>=*EfKobKVOv8e;5eCk-Y%JVwO>W zub+xCBO0${zoHji?ANQwW-L(tOWb%wkrI5T59jA6U?)J^iW1Tn+tImv>DRErzix?c zMd)7J63cHPQ!9r~7wh)tW<3r5Y3n3)a9rsjItnF{LwX!`m@CY9kWa__%k-HLx9Kqc zPFpFCt^@0$X!!}2e=Y1^!uO!_sSnybEt;si>Pw-{CPeX>GQKW#*7*v!fU32Z)Op8tZ4+{7T3+ zJTnv`LT-Ft+c5fB0CJZd$s&i|kv#Uv9my5{+M@i`<6=1jf7^pgMc6=_Uu9L5mMiv= zU@GENk&iP(kpNOat-nJuwiFNiBWe=?HO<1qe2~p=+$dcNn_P=xwBLs0o#eHH1Fp67 z`IoTEQ||LV&%?A*BB8TR8$6;&Oo!id(l&&>fY-uxpiNe!AtL+IUMF-Uy_U?@exY3g zkY1rY$cUva%&K& zk&MCwmO2>AK$g8*iRVl)G+Sy=JJNqrr$inthyPH!iOhzKZa!2rG4&X`u#gtmbaLY3 z*m!mn6rVR1betHh<$5mVT+J9oWVzY8)a(1~F!~X%)!zIKqN(GFnHY=_<%oJpkieqsu>&0_<{_@>)KF`YJ z^r!SX`+hW;e0QHCoTh~AJK*ZO_ww}h$w&7;IEci72{ln&k!nM@|51FT$$31`_)#V?tpNf;;& z0X2uFNoU9|1(kZ3)mMV*=o2+g2&#h>;-ET||2fP>ZasXCxA#_{5Ve$-H=q)-oixv$ zhzK~wQ<+g_Q3lD=42FVYG+O)2EZqG%|_mpHYOeP0fFe3kjuhqpx$p$hY& z%&)JrQoNW^N3ifPpHJsdkrbm^Dsrz*`}_OJ5e1Q|?j-?VVNj_An+vy1k{97kOmPi6 zt{4iHffW@&=MR_Il!DO2u)?b(YL)jfw4yXmXMb2l4l@b}v_*qRuiTzjMX4LdEd4s) zC|h8rkB|`wDp$GvcG3y{$V9Xh!H>7M@7xg=l=*B0W`i!D5L~@CjE0yo(T#`1aWjRo zdz1uL|mE(%e|SyJVoZ>|(`c#3UHrzop&GJ_4~j4~@RvQubhj^s|403X7-O~Sq^ zK7Z18tR^n|AeZrre37>l6difvstAX`AWaD#!6)3q5!nf*Y}$$gZ+o<&;A<2xT3;2= z)`3!T5W}M>S@DvF8KFj9T3W#y7Ym^BW43CxeOfjZW&&t$aoBFA^Kf=cM+}{m6N$!1 zV}FzRy9c#(6L6v)_bqw@^<)E8q7SFXj{hz6V< z#=*%Jmy~QGUwFVG5_OczGa@M5Sy#qpvMld_74Tuddd546envTR47Y>_Xl)lUmW*^m2$O6i90J6ZA8s&wjl#`v@%W;K&`w2txbJ24H{bRRtGl=;(wYzy*GJ~ z97-|uIjh|n#w`CKLYOgm0Jm-t&4P0w0Y-vfAR&ZnE6b()_fD_qw(!D*?w=RatXUj$ zxO^P1-n8}s#L{SryA-a#wnsn-sG30V`w>{-W#wYz8K-d|X@uO3l6ub=Hq}rGkiuy8 zKY#b5ljDnBt0L!))+yn{N`FZ1k~~rm>CYcvx<0KH;J=V;7h%;0OKgTW*W74VO>9#M-PnRGoRt8(#1i&-(( zRTr(I)xN!nR6AuiM1MN(BNroIEG;u?Uf6s32ocv6hENb-RB)ltw15*Cv+Ul`rDJV%s?ztmge=}&0+!()YAi+^n&ZYey>O5Q1GlNx1= zLjJv)v!wcKEB^H#IGp|jjlpeYMXEZ`~Me{>7b{@HwP{UhKgJhTs((8eXJ-Aq0UasQm*7@S*?@)Qxc%(k^4?@0} zM>QllFi=(>I)SKlhrLa7b>Vvk`4sTM!8A&WrwnPCg-aV+fZxZbAp7^>G33RAFHer| z-gXMl+nH|`PAK8a?CNfE)P~!qjw57A2aOqw6@N>q#?`E-JU-RU%w+9et0_5YZ_fGj zGZsXBIs=S2o=3{QzmB)*I_dL~xeXw9FP|BDFURP(R~ct>`F6i9XeOJcGj#BhKWdUB zq`svzJSlF0FpOyh?@1y`hJ~W#VHQb1c${i?+qlv@K#J8=JZ~FzrLuji+freNzQ2F* zfPYS7-rUb8ai<^ub^XrMeVb`D-Fov!IQ;J)?9u;~SGM(5`pPRCdi8(hl_7rpUwLJq zXa84T8RXlaz^&Uj79h!4Bb+!2n|bSx#R|ZR8mv(s4r6$lUY_vNe8^Az!T)D{cUlg) zoBCtzbI?A(X&sjC<%9K&!45WAKkSUv3x7p?I+yvhPf?XOKH(+eoPhc|c>dino5pEq zZ~v*rwcSqLsP4FZbyifR0AooM9pZAt4-l+v+itH@QFxJKW6Y|Ml!POvd{Es_B4yG<15^qruQUZ}UW{k1x z^y9nE!D@$pRi}b&r!qZU1390o4$;$eyoxk-?J;QRMs$}qo^$j)D{1=csJvccy{oV@ ztGgd}-J4HCN&@lEItcU-|Bt!9-+%7h6>DQ@;jh*ePke1^$A%<~(q+AEYMybn*(Nw0 z6`;qk-%mxgg=1K+2kAz@Ru}=_aKE$mq~d=!wEtZ^ne9sy!LA8ihppr9zG=q2LJG_*lbxnmbc=|vIK!RQuIiXB*fZ)H)^mA z_-@%0?v`ECQ%sn7RmHsO-dU>ihw=5JW<*E#eS~8Ja+yq)PG;V-2+WE4g`NjN_XNy{lv5HTDMZs@!aSe%*RiK^>^`dd5EYlUL zjOL&|IsO66u^(2uDXurX25#OFB`EWTzX60~`Ra<>&rwy@jenj72j;SETIvm$hpV+( z!9}$XfQpdc;VPu#bg!*nv2hj@pdFL7#9a5BE3HVY#%Vj-X7&S);IIh119H1!;#CK?bV4VV^J&BscN01;z*R=JfN|<{ zj+z35Pup6m$9X|pfEjg3b>#>po?_k(ia^8WPnKhjdXH+}2mA2Us|buP{+{Z6RxF-! z-N0l$rGJX4uODT%;dIBkLvfHX$2*)Gdfs8k#G798T}J{+bdDV)^F-UElGu504RUTh zil1hSG(z=vx5G^L*X&KTu>d@jD{AI4ngf{!fwygh?Hcgb)YE5#yqrP;RcunjtR~=a z4+4>Vro_~fss;Y=)V^{y0*T;_%0dD9>$&0sjZu}xS zfj_=s< zTeDSBc#*IaPwmYuSXFw;9x3LabvfC1?qcB3ahC^bp2zYU(F|h6BX8iE@H)1rs{G;1 ztzZ;@7B)CP8PgmD^+skIL#60VeU8&PZ+Q%Rn@d)Ow}9!sG0^i zaj4cQTBq5P=`+o*EV>o0w_#l&xg8)!+SA6y;!q8f-2|FSFcILGJ>8jzSehSNSjWa0)^>!XMZ1FujI92*|F0U$^dtfR=d*fN|vSFpV7DYZ|Yjw#(0+P z<#YZEIv4*f%D3w78k$Yr+B^zhK>E|S;EMhY+(9{nn1ppFZ9?&kR}21>mjK>SM#AU? z=8o<05xE9$5NI9WNzN`kHga~(XrBmSGULr;c9!DJc@CKC7(~g!b$@syrw|Hp{kfbP zBB1jU#p@w=mHxFxGc+e~*q{p-gS_p%)U!^Xk{lTcrPA8f&%B9D|8O%mSmE+G#h1E$ z^#yO*ije2E$pybSt&+F~hs8^~Wa~DjElALA9Qy`rk$Pd{DBf+o{f0e>-JCVfh);Q6 z{vGexObP4VA2Zy>x9<9||S~EpaG5@FOIa~nA!`$pRHz8{1VPcwz30m2; zS&3GToS7S>=j2gm?keG``|JtNAFQ=As6%4jbfc83J`?lWIm}R*dH29mqH^lxQfX6Mh9NDX7Th3!HVLz%_9!j~00>Z;kbi;`HgIF$ga>i#sQu>!;9 zVFI)c-+!1)FzIIGDOX@oJ)vW`qw`CA%XMKFFrCm0V!6uwxPD+}IlYP}nH7(m_Wea5>DVypda-yQv~F6B|icOR6Ks z&wI?nW?$C0qf*8OS=iV-A_<#D;$f$@PQgYN5gFKVk~IIiLDcEZRc9&JGQAtegA2nZ z!@>43qv4e~R?e2vyHRwT>~3#hEpoeq?!Wa+Z4|1B+Og({NYg%;ysIlm4_VsCCOSzQ ziGO>~(MG1bnWBw73;U&H+~U(EB0rm!3Qf&L06K;L~}L#v8j@ z!W%5^v?vAecC`0V`AJb^fO{w(yA0ZrJLk?}{TOD>e0DKg(RMXS(Pb`DRf}Q=Xpf?x z1CTI)9Ke+f9Dp6-SoR)p1V9;4$O0(zzX&XV(ZV-fSxHfp3jQx0nD46+%9ue|`lDWEq76ri-f)1h84bTb|x6r~Mu!2}$ei;YQida+y zq-_PI;KC?iV-H1vOORj7`7Yh?3}*d60TiIjd>2!EnU}zlr)NDXHP{J6>VHEg5Mdm0 z0zRvU1Wv$lZ5KCT-MaaJnlL140{YVSKoiiOcZ!)1<7f|v3EdGB8Wt>hKaeYnkfU*( z;wA9!Xw-ytZpQDt>S4;iJz7G9H<7dv2@U%Y)vC2kUD$J=HtaNIQ~aBC6)FWcp+D6{ zm{`5T_U1YMADn_H`*DaNF@H4B8e4?Wh;WJr0F6EXG-_9s0DJ~k4S}A4M(qxsfxU{s z&WLcS7RVWTnCJSGA=!D{4D4iA*o=@r(M=^Ej4jjibP46;BRFK^Qvv#vy^5OjZV1vj|q>Dftc?PgDxX#-0uCZWnId206qx6R~Bm)GaWUX;vuu*#$7-=<*;oR26 z?;QxtuDEp=07gIV6n`+IoY&P`aO_WpIHv$^5&rPFCgv$RMb3`~XmjV^_*@t)CywM) z!ay1m;`|R9w%!71=*6z##9;q6jr|xplBLm0b}+&HZoTZkfDWTqBlx%G^me4O+3i$( zPk~|jn45#eWj##Fwv+N+<4p`P8+QAZ`4xx&XkaSvR{IK&=+Lyq?J)Pz}*0Bi&tr7g&} zt|xDI(g1ykKYt?b`;6bwQGG^MOn$6(RtZ=9UIweN`Lug{|EypDfUrlmZcAIeiEi9bywEEQ~w69ZRr z_I&H=d={SaeTS^WoWgb+J-6g_&F9ReO@5Dl(3kHM2Y)-M?$A*5ema40M7TO10k<)I zU^v-pUfh1e5YA+dVfyil9E)40a$@@xab2VJ3TdC~3UY0^vS5?QwMF|pt`>mXpiJck zopkG29k!?Zf^J%x^~xyid8Gh+D1wF#(xX{U>IYd<+Ky!&(^sbK(&PNOuialf_3Bb< zXOt1(&3~lNC|yAI>lf)?v+IlGX!?aWor*;;E>_geq*8{{3lJf`P%d2QUp@g0@g12y zGVU!*AZ?{xiJ1m6@wCw=c1-RxtR1mmP-j>@khKi_tbMIjZh`0Dj4jNMF-k35!45pL z_jRMnh237`Qp+{RXZZwwF3|MZ?oZ3VY#Qxg$`2)|NV@w9FlxZw>t+ThQQQsH8Lz;->+ffW@YuMP-sEvDZ1SWe~iyQGem-2Xd zE;R}G)ECqMHMwqUt5m%@Sp2#NT9XFgV1L}5iig=gYDwI}p!99b_i{M{y7^6^`<8JH z{aEqyq7Q7xM1E?_bl9{)yEDd>4%H3Avv_USr7Yg+rbQ(jBTaI z+!Y3A*JEdA0@yJa2fx=yt*ty|D4^Dz_mL==);KS@FCeXvS#>A)*Opf`7Mj(jnSW}T ztl3nsAr>pLxKkKb?7)3QU^V?V$c{wP0(aH3ruP%O#|1qAts zO<`uKAOdB!flr-5VxeVY?7_UOIc)ww$QV@b+9EP>As{1U2O z2Cx##kqI}o3sH}J%0$A9>3snHyv)w3^Gv2=RvZ zIv=M}68!5rD6)zEP;K{PdSbQC^4Rx!n`4cd+!z3AM^?A~kderYSebL%F2lm+0c>QV zx3I`wg@3Qo15VbZzTip4vhife&!;<T^8vbSzygoP z4n$an;&v2AY^42?8x}1%bbtQ7Skm3UzNH|Gr`gqFNr(QAzIpOg@P#}Qy?o!`_R#g+ zws(ha*b}s~dlM%1@;v-l8k5&iTYurORy;F!Em;BY!J zG}y^3XA|&nVh{r#&V=fa)S>ne;>0EfL_A)e0*N;Yge7k?S-LVrj1Je8O$UcO;>O0? z^fuDA1TIeEyTOZ7(|I=+1zT@w3%q zSi0=&TSL?3?$~e)t&Bp{CCaXty5!duPgfZmL|s!g45BVch=0Y@)fa%(Li-m&6P5b4 zpt7Wx7!Xln6$>L;=&kxfF;a;ZMpWx8il}XAK}3~8F+{b@LWpV|2n<=J z8?&|yjx14hMw0bk|2DC|9Hwx8-e9Ui%%BdTBGe~bxnXqKuxD6;Fv6_y52rYcGOJ!9 zzpbOVRnb_pN`K9!=ngzf&3))uDMOwSi?Y8mXm?!81{_C0XsO%;&N-8T2}TZo&)8gU z;b^JY0Mb%vBqS|8@&*N^rBQAfme!MLb^ZWNJ18_Q`P3G{Y00K{3r`#Ca1Ri*eM8jh z0w&vTE*cW1mTbBepxQ{kdH}19b&UbxYRMwo1gwp8j(-Qx+CD&QL+eZcxRxsifvzRv zZUA0OJ&S^`jdZXU5Vrm~nmUCg+I<*X>Skvk+qOWT5vN6shI)Ye+yw5ERM|T+B5@61 zBWkU+X*bx+aR!(}^_kj2aqPODb&vY)SN6fwn9pRd2gG zCK9z>uzw>HiF$!GOIkwdQ6D>i=~27(P?ywfb6h=Qb1#tfcE|JXFT|dI6idG%fcBWq zLhW&dg6-`h(%w+B6!!2B({nec=e-8O9Cn88CLCt0*VpUlgnxGM8k>#FtbC`CQvdFW z3jDY~Is*wIw6-9b_RHP-H>o8v*TfRDK>$rXa z4%4)!w*D=1Tq?5fqqXVC{U#)fKwqBqPpRqZo|@}yMD>y5JZzS;QI7FTpJF4oEO@9_ zN`FaLr!1Ps_#|GEgx%4kOmCbt9Y~udX;F#OCUv^DZNOecv5Bp)z4jM>b+i#Sjj@lt zSFuZm&BX387h8n6vg~TX6}5|nvsQ?rf+^lrDdSKUcWvT#W9m2RKb#hBhG>0A2{xSa z%tAeh3c62tZteJ!dQ;prin^3TQRh)quYbwr-f!zyR;W5xe9C!c52!*l>)b1<`a^4W z*77dNCWdDYYIpwK(d^tfkPxZqzskTS0Be<|0Bd$6M0Ml**7V5t_T2K`^CJts!30V0 zEj)bA%kzTyO^0+z$uxOyvhNKiGM7=P>yjC@IwG4(O7*~kxlo?mFZIK!$WAYRoHu$@q!F$LpD>y|bmlgEAXO{`z z`t&kU(;cOk6`gCaIiDgHOUC*PGk>O${W<|7#TRfLU z0rpy1gqZjmTN{&;CG?tZph@ULPTVCR)0Z_Pj|P2 zf$SV52u8T+?j<4}r(hPDk0Z)68>Equ>Yb7Ml{QIBtHW7ZN}_36T4Nlo=&E0DB9ww_H7k|riPTwlp`}tc^h+Jb9^2*|&U2-iQbS6#Wl1Eva|9)8wd*y?7YHZl0q2V%3tA1_C>!+D3M| zFSm!~PX&SR7~EO#*=lrWAu~3-vmjTEMhA8l^!F~Z)Arj2ReuyT{l|71#yW88y`}`m zDrG&!cNQGC7vNb4jEnGW=b=SI$3gE?aHr{V&^7xG@2s%hz%Olxr~KhZ{}?XrGs>^y zhZJvH-h31G3YgS`f2Ga9&$t_a0t(H^a=s16P5}Ykqvo{z`{pswtQJsskzV4r`wxzj zD||raP%c-`vww^0c}f#Aze>+C=c0Ch&u&2uZf&5^r}!+?D5JyH|H$=rP@Ie~PttM> zl>sc4(sR<-;|qkHPk{__NV1P$yeEsi{5YaKh;wE#%fUqaWd1W-W^@*H$$PAm$KRfg zi;x_E@c2DDM}8ypr-PW{ZWdy zCC4}L7B@S~6WB&yU*vum#y-Yfsk-aKu8#0d)TNpMQ3~Uiz$NJu-u?UWUe=-%Vl~?P z$T8()J%2SWiLj+RsI(HPx*LagKMHbwgQzP5#SpEN^z!;jzfk|Y!7XK27pTcqFFbjE1b@AbZSk}E;-8?{j~(L<1tol2FX3C3 zV2fG88617QVk@aI8X}E|uj%=Ocw#hyWLzf-VSY4gB&IIdVK|eb4%^~q^~Km>>;t_( za}Z#D{Q{;@dIo*rj}a@ zYJUbJso*^v7YOjg6!W=t7Q4F`oL9+V`I2?;5$bA`?7#C)vWI{F3I6^b{{4%L>On95 z96Z>Q7|uV_8-5hgW^1{?PjrXoTS`bf@D5gO#@|_{eGjSV>lCy|_YzkUhnT@vk&7c) z3MYArl32}^zF|D=#p3sDoV=WaD15?Q&3_l?@E162xxSz|==5-<>jbdPZOdG~ty(t6 zf)|U67ovKYqpx0NOHh9DU0%8U5Ho$`^pd*?D>ir3gm5`-Nd&ZDo-Vj^+FecrmM@H) zE#~y>472%ke!YejT{y07|1>*a(;SAsw)K-G%-nVI7eug@#}B{FR_j>&3H9qae1Eab zvdc9bUSYj(aIJ-pozKB5)>?}Qggg3BH)|mq*0yqr*EY3&mZATxVQ@nP>v)K^l|>tE z69?6{aJ{IYWtDQPLaS9-I2l17}Yuy;huVRQ)6KYWPL1Ce68S;3S@r@ z>ww7D^+mg&qocoo7un-LvlqAfr+=4g^Qay1G;T+HG+)hD*ZA0bRe6$w12uco)&xK zG3kp2&Fm@W86ou=cFj(2hT1$kBD(CMr@DtW#lX70;#s?0^wjL4r8ppiw$~f)qrXa5 zBT~&CYDxe8)#7sWihsD<>~x+l+A0o2v{W4kuPU$KH-M?W0hr?2UeT+;ZoLCc2Ym;a zI`06}>N~)*Q8In!9eoLy7JrJ72a$V911D6;XI~zD{l%l?OE~Fx^7Pr8Z?1V@`BNBn z{@HSl*LC9M^Tn&=d~tS-U+>{Nb`-#s`2;@6l%+YkXL=5mG|?ew`+5!zH8nN{mudW`%$8Yga>f+Rql62N%_~uvZG1%U>NjRog__+ zs{5CbY3neUzPkI)WLYe`vh@4eXYs`+xqk*zc55LXj8o4*VPdp< z1{#&gHPCC(^0wFV_R5yGZ{6}SXjqJDdM+7%K>vGznlU?lpEq6MOc*lh{UJ%-0nCqS zF-&%odweN2c^Y?vi-)kq!1sq$lb=iH=W`kb0l;@g#b7>kV#R06qN$?2L%Rm$Wl18; zS*VUD#&c|2On;M0u72s+F~NpoU6ln_S*%m#5m$NSs-)vyn5)?{Gv~5aUv$?C<(X-t=dbWL* z-s_jW<-$iNhK8}^ytGzVmzj6bP(7B5>O$NTkL~NlV|&9c(+!FQkPV8`#ki3;QK?rd zz3T>y2!EA`R1M%(P^%zADT}1eD;ml|C<%4wh}f+}NQ!ywMDiI+=bC6G2ezpI*2~lo z1}BJj<3qZwU=I5knB$CcmW9LD>SZn_Aie zc4!~dq#Ssw)sLyFTb1R=Wk&=MS#;4l79g#zN`KmwOY^Uo3zh(XW zLRcy&k~|lb58|w-s~|B_%-BmG6qba7@^*1YyZKopMQ4IYGxDh(r8>MYjrnDK6%_v3Y|KQm^%q3en%JOZIf+UvVdI*v0KzchSap%PwxW>7sTk=3T?=W6iYhimp3&Mr(up zmjUX6bQAR#e*lt;Hb{OIBe`fo^3flF4?^svvMj|+`y1>3wSH9{1z-DMvwCT#N<%aXB3;$bnB6)BRZH^~ZCu?8h@enoMDhs@2c&lK67z(VQ;*9jAkQ&arO%$a*)P1Og&4owl*@ zJ4&%Ip5*#V7}D9a!UQ56mM9(+NPnJ-E94i;(r+a%n*X|{a+6#7wR8@zw)J3+gXjrj z)lCIx&=oWne80KpciY;GU{O$#py*aeOHe@3d@kgsMA2`68aDszHJvloO1Hd1>vEnt7_Ua2s3ceDA-{#Fzpn?zg3P_8eXA-SWkkujmB*- z?&kW!xg7Hm&jyJ5Ao%~B(SIp{+tr$ee4G_GWrLr0nohC9Dm2lZuNkLBkei3>Jw;eS zL|usX=9+jEfa*l(#hXxJ3El8Xwxa2_uH;u%QobPvoYCFQHKgNH2T#nW2v%xbFgglSlS~7)ML_2c0THfAb)ultIS)&VeVy{k!M7cffsVg`2eOZ&QkGM5ltA zu{3UN&u5usE0-)m8GpmUN@FlFWU;lT*L*WrHMDEXTl8@>)yaHDRAlW>yS(NCwYoZk4HJ|p$p)3lA6}3_`f2+&%KxRMl8K5w?vtP1|OT_w`CiC_6%H2;6 z%UN50Fod`_&9b+BPpigrL4$ItmaEfKC&hf)&zh8(a;SrU1Ao1-WffUklkXuI&xNHP zg{2-zDgN_?-pfr)-uW*xdFLO;VPmWo$NIb39oE5z< zeyqOEPbtCaD^9JcRnNl4@Lum8C#UdQs^{xzal$3vJ?;d^bgdDwu7g}~>a)|s`zPd* zLod9@$7yjdqkl_VAtZV$<^>J6C=5O<#VyW%HOkrxVO#q1-Rt_kgWGGBL+XP$atXYfq7(y0V)^w049)Mx0YLS|S3g_2dC_4)}h z0=)*OzCg!KFK|S!g!U=A65?xlRcc&#w`qPTei`>d*MEioh~2*fp= zvCIa8C0t#-U_-1;-Eg42pJlTEUSbfLfH4(Q5(4SGyVmx%SVD(Vx`G?;9uprLrpCzf z_U5~`>wjs5QBlMUqxAwnftb$Z`mKz(;LNM#%n_b%m(>N@h{Tk~?jtIYnZUq|CsMgEAcZw_6EXuI_HFh@{MnSU0R@8I<9t|=VoZZdFNn6CN}JVj+@ zY$G(5Rgzc@X{s~YfQ^^3@uV1~xj)v!f!DPLo?LT#$+v;O3=W?BoUg+ZD9bSoK;YOs zdhG>U|60LQ0to~drQv+a zcYoqIPKaEPZ@)8h{f!d+`!txXkoap0uuyHmt8RkNjE<--tQMDv^R;a$P+OU@B5F~Fa6C@$<%6)Vbz5bm zSq9OZ&A+WsMblXwR%ekalSdP7uFV=Xz==Qn+v}e9X(?N$ek|usbb*9w>bTKsz@t$w zIXcq+puycR46Si8)HYZ~lH~tU`EMPS%XjL=e#kB_vKP8m7ni|J0TX`_4PvU1#hhUG zmYu6^baZQ*X`oRY$V_O}PKDKVHwq{a^sufcd9_B^q3BFrt|gaII4!z%+?tCmZ#~!b zkn=lUv51M5)xf-x3dD@FdLhFkqqJ3Tzd_)xO^+T5ESsnSfTD3I8o^kBMu#K*Mqtt zGC|W;!6O7W!#+nxJ+3wrP2!cL{9eWzCV+Nm-=i`VI4y-Qs+Og-*9#416eHB}@ak%7 zkvh>b&FUn72z04ftW@e+pq(52&DSz(cyXhl^!K5xjNJy3MyY?w4G|a{%}a{4A&|sb z{Krs8(7g?b1j1T0YBOj3eMrRE-iAU9U@ZdOZ2r_Jp|`;m)niQMuQ+POwzsF(5Sy`~ z8`~{+fB#m|5&R$qEue?@-c4YAA=LPg`Ni^8F%565Pa8A^&{R|}yWyS1AXcu?6Y^N5p|A zJP<_q&DvY@H;Wvx9mE=F8#-cprN`n8Lq`bUT4w(fLr1h>Z(~piX7n9}l-RyeNQu>K zzF|m-c5HSbC2kyXMJfcBt~3h8LVqJh!P-*uSF^Zn6or577Hqvi6ou_OjiPWvBo}Rv z{Hi8E!Aj?vj?77$z|`icbap3L6D)1132$+@@iC7Cu{qvG{mn7!rWb|xTBabHcD9>z zCMn%--dv_*>}=kw=dFYa$gLq(960zkeR*`lzO<4(!tO4@W3-X9$qmC})LT`5Sa^)} zyV5>9MnivB;_w)c+J?tiYox3@LhhbpK=+0`bNc8m__eQ~Vr7>c@*C(s(4wX@&aouP zOL6L9Pt+jvbXb)Nmf385l8_oTl!6EomRwBNRIjTEx}IWMS0UZ~2m!u-P~4UECFs^e z;m?StvVOO2%_fVJ5(f%dBTkA9Fk91m?xV{3`O}9y`gzTeUu&3yq`roD zp^3c9RhKy<`nO%g$JnAwhoSzj+LOEPQRicYO2lt$qs>*F(+KC;H4q!_@E9KyZuFXR zgt))bMi7XlGONGCtUPCV8 zU6+4IFjhBnOVRLQt|=TM7uSizI?@o7?OoQ(KvZsV=bR4~D&vCP`RM}B?TxL(jw72VMZ?J!fB#JvQulP=so7pHJWMRcI58+9ByBHULM(TpZNOtX}{*8o6=|#HJe6 zN+**nord7)&_^EJ5~m4${u;0H_4$+&4+s-)^ob-bpp0~Eik}fy3D9#r3&b9EFL*^Q zCOf~I*7Ke~`bAAoS3tMM^HL#Eya<0qjgm`_aj5p_X+a4CEl_s(x#V#sM_Y4wdlRMX zVd$Et(oPtHF_f7wALKMAHFT4(*rjBBaD>`O(P5E=D;I?#CctUoN^~}R)w<+KJGrhZ z7eLLhVqc~1x<<83wOz3w2CabLY`CU6KNH%jKKc7Z{f1C~Dmvksnixt{F?xS4M6-xjds(2XTyQ0 zKC+?d*S~$DmHB0h$AX6~To#_(M~<}Xzvcfz*OCwKxdbTJ$p4h5?N9;uIznDK3-e_Z zjtf==sz$RxtzMNA@zK1TsX~7+Z2&?qMjYx|XJ*Iqoi; zUpFcBno%}hn{R`lAjR|nG@WlYbi&!F_Kl@fb9tgOq|#D2hHFqWCJcY|%%&@S+)dv9 zOOuV=WTRpu24X&^I{ec=pDl4>$U)s%6qUCE$5aQzKrVdB>;6k6G7AQOm*?^AmxI|G z^Lkjgvk`+D5gF^*Vje~_2t5x(J82pE+c zU*zKm2^kPCHg-0V0_%VE)Y_DUzqD14qkB3Y#4O$jC#Buw-TR-tm;8{@+o$8lllM~C zQo;cclrzx+6bW8Om-ovbN1H&e8xfsM?SRp7)5c_No^%&!l#HK}OePsd*=zy2^iwD^ zvUZ+9#!nbBto_I;r^IPOV`o0jXC=^KY(AB$j7CKC2$cgU3uu28XPB2=ZRtl+069R$ zzoT%9Oj37|UVAI#t%bh59(3u9*MJXy(-v|8Oka(5tBSE3X)J(wY)v1A$7CY}dzEXp zrPrL65kSU8RK_-Ae}Mun#?Q=H{Ut=`l1P!yhFP!IdklEw7g2SLfGF*^J=}BR1q13N zNnC3e@0fPBUfkr8-$FirEo_8dh>zy#)wNRZA=6LLN`pY!e#dKrg7X`R{DEFmRh}gRevZYBO zTE0`Ecdev#J`9zA^{!gK9UsL%M2X)30lB8JPP2E=>GqA?X&?V+PXB2ft?AAhQr1*7 zp7x`X!6a=-GGod&Pn7bLc5J;C4)1B)B&y(SgCIZIYpzLEX{8qI0kXypnJF2fRNTy|#EI$;lgx_5+Iw;3UxpdMRy+H&*N zT2l(wdE$fPqt8B-`oVnCFoVsKOLA0P*f#kKxKGWl;y?dI z0!vc*$Mc`fuqNmCCIMisy&G&IHd`0TTBbp&W4XqL?-^iw~)&B2Z*CuI(I9q!KN+S-pOLD!gvVJKw)#gI;fr> z|I_qdBzwVObi^I&uPvt{Nwme36$hr?*PevevTbRB)GYTcRv^vHvje=9+_~|*5VrHD zoJ2)`Cx4`f_|#AIC)y26n7;)Ie<4XK2pD?N7|`U&w=i zL3M7*Su=NOkWE3@fmHtX4AnU=D@BWN{E>`*Li50%Vg}#WF{+Wn0xRMRI7{-rWQUwH zwos82^ky=d7X6HXi05B1{pkW#%60rBfz3+a$o&MR$RCP*320);$7;)@$%Rlr{7ERO zBsz$C6oQR}9PC>tFsQbaqieb;AEvzlCTn6olfs-kUWia~DL%nZd0G>%QoW2q6~QBa z*X-d;+#G*^PqR3|Ta)6yRiOG*91E!fIWojIWDKBZXZe_zkPgqz=s4@_EW6Zi-ArT7 z0Ik`x&vwOm(!(tUkQsRmv$!qM+9%*d%zQK%W+P&QiD@d-uRZbRU?*^+92b8vxgV5)4>9a8#s}2K5)C-Ve{ye5V)z_s1Wo1 z5osEt<5+ynejt>!0uY;#=dxlY8fX8I&_kOfuz(_UO0A@L6LGX>*}#K;A?0-{*J^GM z5%hd~0avN%LP&#%p9@infCm{)r#}hmKV-waUrb0=i4FObyG6f$&cKIZW*r}9Gl%&k z1wKR9abG5QGCVpuc@J&jV1(u;h$O_h6o2{>TAkc!b<{?aB~O()QOZ!%m9^7$4>6+? zx1^bzhh<3;MG=igY`Lj_{HyRI!YR{HbI&OY>~h_o7URVTXzU-thEnYyHx@KVZQO)Lb^{NoCOK-8#15&ySl;sC;1$u~ zd3NOe?32UOD|R+5Y3!H;I)1w?yC=}l*}>5#r^iS4@9)2RUoVUF>M=guKlykaoU_ZU zKWCg%G)A?rBu(sp6gjdZO{Jq=F{Yx|;!Fju$94bUv=P;l`T16iZa1JYE9nvd^@0zJ zp*W)6V=43s7#=PM;D1JKkmXCu*!@Q`n; zY9LOuX|7sy1X0Zu=g%r@DG)J>Aes8eLsa#Le9hwmku zX@k&(4Oa>EN|}Zq+#lE_kFFq?ay7a1ke*Y(*hPrNm_$Y7Thu-Y@@NR9UNfkB(E`iv zo{6lkym01BHBaFllZnkp#adX>-(x%RR2BwhvsJf$V^&=(XX-aW@+B#tF7;Vv>FQkA z!xGGTFI7i$<4pGjQl{msaLXP-RP|e}Enb>f)|v;7VrZzoe%$bMPJ={O%{mv00lFN( z$z(pA(11lMuY<1ML~8!Ke;tyvYJj)|K{|mfkBr9wBSj*3Va0BhtD3EJS-lf{;aSetIaG2 zh~r|x_uS^_3-6%lBp;F7mt>`OKxIxa5^H;EbktFtdjZomMpTh>o8?8R7o&JN+;!G} zXNVIa0BGT~5KD?84HKnsh%cM-E})V+A=z8n%CqVO>XB%_6qAGcE(_SwIy~Iau8Ct+j!F$`M{b*qEl|#9tL%=pd8b$sdgw^b`d>OW(dOh zw6f8r!GP&o)J8h|C0&$ia5IMWyQVr=&@0tkrlvzWgmxf!Xam>R$)r(CfrC|ltfYPB zFn5$c5wRmHgrqInS#-17%xPjacLZy6i>`c?l=(|K{E3QYI>+1IbeRbtRf}?!cdQ%U z5r54v5YibJ$D$7{-)Coa!c;nhI$BJ?9?VdthF-*0ka`DJg({Lzo<)_7Nzg>NV_co! zO^BtdLo$R zwjs!{J&1`tSNeWA+Bty+$DFZ8rQB645;0`m%SMIOK!OzA^}9wlD~>KM_*gG48L&f2 z(&?b&9^qUNN#mQ;eUJ~J%II5uwS_S@5Dae}@|uCDqZBGguK;gS2nOA2A#3s8 z3KT(=6*zJU1LNHcqBSdHCj~Jqw9m!V!|`x&zM?Tt3fkOXu2X3O=k=A5+;C_Z zTZG7R{L?;$?z&t+wfu~K<${J~sjyKLv91U#Kmwgr@sn_J_D59WY1_hx=v}GkWJrx$ zQQ3gx&Y+uTC#`|9asX*();?~=ln8G{o2K0j{2OD6j3!)lMpcxl_B4B#PQgrG5Xb0y z$SY2vQ56m`IXA%{T#3%v=(IN(f|W{fv`AOVW;9btSc@{le**!3-$D!g>Xe8no~s6h z5Y5)xn~{YKviXNd)$D6`9A2^=2mc6CNU!H-;Kxf)JtH~H)G68-^EojCDA){(Jl$9) zqA0l=mJ>45$kfRPq|%U0Zx)@A6dqZK^vRw{~JULP9-_XMj z-8Qt!TJq2xQwueJN*x|X4HgP-EEIYu1QjNu%cHhZxhsnrYmTRSbWdDXkH+^i+TbXr z`1u}Tz42We$h^i)I|S2@eN%&;nj)KUiQCprK;i z9;FL)tKkc`xueU(s3;7Oodkr6v&F~Lk$})C$oONfF8~d7*T?S1xR~4eJPi_Kn?gAv zjxoF3OlK3-m3pS@Njg-+nT8MB9WK?dry#OzW)vIm&vk$$_fxvMj4hSfS&!5Wn(9=+et0Mm_zx9_KI8#l=&C~nB91L zG>>{1iC2=~y@C0RLpX$B1t^5z>BTMQszZ4p*x2v-2St!g%5}=7O{;Jt~`h$WV zYf%Y=VPBHrt&^?xi(XbB|1TQ`NiC!ZgXbcDU=EbTJc;|`yz|C<;HSLlx@DY^hpmFn zX5G{onqDG^@Pg6(akdW4u!zk=VUU~be<2SN*@qm__ka(CyX4&RObNObKj||fY=ytX zcDTx_qHnuNW~-a-2owWXQ|x4aR_2#dXeD7>Z1%A&zn$s8pjQyE#zHk@EjbkFt4@D^ zrEEWip^_9K4LMVbnW9IBtrI?PWyZ<~lg$HiMtL~$+O13hCR5vuX~HsR3nRP@$H&p$ zq*1qlveV{#O%e4)E{`=tY^uy2I-A%qB526=ecp=#eS~FLN+LQbD zhZJi4KwMIY0e>h-~ql zG)W<=W~jR{l&_OPDz8##Om$_jxA=G^O<{>#&lUy7z}E{iiOR%$kt-FR*$ z+{S|{)>Cn9k+F)l|0_6%6EN5>)~=M%g!8n|UX>xn@ixh7Z`)VY%#Sv|728%j-;@yT zdoymfd2A)4tz#}}JIC}39c@(=<${V~t7;P1>euW7V~BX*$~cQgtB%TlV(Je^p4bI! z?oFj**d{FVp?^wlZjL4)Ke!z(TQN8rMf%dnRCd5<=IE<2N6k`Pk}+s1HW#VfXQbm8 zP-HGPm%j>Y_`mZDx5VF5Cb8FmUnEgD?pfIC3$_MZW4+0D+=9rD!Eez5YAF23>Wx2z z8ZdB`gfANrXq?#UN5w*a3NrJ>4;xWr_=boHn{YgCEE)za+oh1DYc#wR<3Kt*Q5K~? zVGSRdjG;+phNGQSu)v5bvgaLPpNxk3Wu}e;b=Rit9n^MeJ}7jQ`&8bh%lv&fqVTXmllio1S}gF%Ax0th(-3 ziHU4s$}=@hYd1=CD($B(&M*mvI%xSGDd?p1kGtBtTYVuXvwWf8eE#quDLG7*Wie)H zP*M&m+lEBOe&k8n8y5b`_XfI1`5L%A;UEliXns-ITQuDAQXR%sTNP7LD;5i%r-Ewm zqDOGif_X&d0Cm0f5DtAo*nEGMKUCc zKrSkoeiPQqT3ja8@Vx3KigP`M9Ur=x9#n5zzi(a7_$H*qrAIt@?4Z$(P$m9qdd{c1 zq%D{jC|z%!dhR@ADw{zHTEckrj~0wU1X5jCw02;l7E=d*h`><&U{f!@{&>5Pa#_q&VyF;Uibk7sFZAW$|QYxtykzBVaF= zRq4i>+?z(mkfkxcZA)@3H!Mhf$?YJ$^TQ&d3W(c(m2*^-j9ny;C98wD3!8Fu>>W$p z%b?b&yR?R<`fN?B=Dcs3)8FI^V~rQJmN^v>u!hZ zySgP&SwUVde1y*p0RwUnIQVe?6U0&Y@bKjH==du>HMWN3NN2bJj(S)EJByug?NS9n zk<7AxhkzGZ>cmY=%xT8khrP=>gArrB9j#eA0Hj;UAG8vY9ZY(03eb?@G8a&UkDE0bch=Z4nw6Ty%q+y&j$pkz`c7XKYxl zQ{aw4k;t8TjiA3}7ndkO-?E`p`EGv6CZR&|jtxzg!BaNK+2~UGmBtQ=U#PL$9z8B# zQB#n^OCm|Om??skt>@I5qTZd_3yNHS$-O<`R=A3B(*AvdB(VxTd61<>%0zd>kN+X7e-EA3OHpNYA$~!a5lQ>B@ zZ1~wWeMhaHIenkSIhd;$WSqme#L3*(6Y}t!51UXuzyz#CrYLf9@Zo#+KD+;a-Z68L z%V=O<ys5s<2NNC{LZ~`0pr}T;$NCHfTF=Rz@{P zgYNUrFunsU`|{wOF}p|Uq~q)FZqx`%aNUqJF4lR4m+^}uD&66@WFU2aBhKqjJmlg& z$79YkW-_xIFIWMn<)6&5(S-b?#L*OnSi)IsDyXxO6JgCc(6}M~RU|zdl|WRo`Bw4* zPT~NfO=nT@y75YHO3n}-=ifHq*b;-y;|Fa};*m>Ri3OIDP30l#r^pz$fl7kC*F`pO zW$h^9pxR5ldT1F3;8I3^aOFn<1Fy%VQ7Y>@ak_*XYY$sbhN?q*-VM7X!`HUf+tj&= zbP!=<%7?xptwV{ix{>6I5=FH!OXg`zt8DPshUEq*?FAT0p<0vc8&riRA_!W_6cHqX z)Q}mBT`Gs2p?nzYxoh<__deDY+C|e1E%cdi`i^v&5~5j?X^B{Wk2S!HWX@did;nvDVEUT@uMf$|&v z>pQb#qm@ov#E^=A4P8U5tTjco;bvjd60tDFbVy39ae`Z?`iwipw8JJ)%Lyu2QsiZ@ z+3e4icD^bNTc~4q1+15J)JuPw4RIUVZKrDl9$n)GP&a!G=ujK_+-k~iifSMqWE&c? z(P?gyeI)AC&#lje7ty<{(n9bWtJ)0)UT6?Q5~leijpdMk;HwaJtv~LkDoA^;u&Llx zEWw;%vRRiZ0@PTkXY}2(CRY^KqHUJF&2nlJ^R48SHHwI<{60~c)eUGBv1?5tfgm4i zRQ`Xo{1Kz2))H$!f?Cz8vBsoX-C(daW(2 z*t(LH){@hIW?9uvblhC?EGOAQl66{!fw7`p6o^}mw@oXJMxgE&>43HY--Qz?gg}3u zGCHBP#w)2VyHt_Osak4LE$-~nQd1^#wxkj+hfTEOr$LD$7W zSW@i4uq1A!=tAP`%W!RTqkjR`&KzLrjC09YiXXyaA6=%v9tJXtO%%YWC z)+H9NuISG$3tX)GN?uV~fj#-_N=p)eZ%Vh&q@INdIvC@k{LARkm}da&xa2|llg@DN zT9*!g=`8)Jr^U$o9DGVStJB;>H~AF|qYDNkmOpJ+=T_iNKY{$}4st4Mr|3dsSE*~}h21Tb zXhE$|_k^ugd60CHdPh{NRPh;U#xob6tz&_I+Soc#rDqR6db*BQrFv~`Zwa(R%hgf& zFjSA(_~#yiG#AhtTn}p8&V813cUfm>eOqyh4<}yerkxL4PKS`CP>&rrNz?0jpr`Lu zlx^yAjd`>{N7vj)4SVK+|FB#iNFjue1BN*$Lum_?kL%F}7+`?eHru;}He0d@P?-LA zWXX!Gm7U#f+Pm@r1I^m9EX%Si+p;XI-DIj2b$k%Im|nPM`<~07`L0Dn-BFvm{ZyAU zKdmZ9A|qIx2*%I}y*2uFawq#08+~wp3^R~21kT(>ur24>6>^#j%aNGS85V|$q!?F^ z8zi>405F?CYawjdAgGxd!aSOn_B)lC~UI1m)=m<}51 zeMBU*Hqz&K9wW}Ut+d@tO`sDq8D0U$NLU(5=3X^D#tW*tf~d{`xuB>NQd>2DOQ3}y z7q@{HVi!Ri4aAC)vNl2p%+U*BO3HS~fmS;6o>ZQxkRFt(hmJjNo>$hQW#=|}sK(~Q zoI@7JmT&6g3X%rRAti*lvG5aGT4Krz7O~&SbSY19vUa}Eh22X905;Ly0DcJ67RjhC zx@pUOuOPf8)qsv=mh~rI_d|Jqe?X2HycsMON~2;nddw_sAlgh8Q{a24l-j}>LG{v` zX|WIm$|U-3T=sBT^X~0HX@T-o%1~ft+hfvO;C)>1ZZ5EGXzRNQC{GMb04ru*9Ysb_ z8v+RLvmSzKiuVCJD4aGzwr>PaHAQ}sGvB?{2!!F^dx?>h{xVaZGN2iMq7?j1aw*ua zz4yYmhl^hqxr?Bo0^hul9q=6ubo~_Dq<(_8G^Xy-B-iqS)*+~kznH~kJC?(79aDpRGQ_H&4IKFVQhP-hUaQYZ9p>$0dhJTqyd zbsl`cznH^>eYuAHtGP(I(w*Q;wAY2qt_wG!NJ=S*7PSXkuvA`uvRLSJxo6W>B*c;- z$IVXOO{gVrh537GGtkwg+iK2LU2>@sF1F&055BBL5lkt#-V`EB!f#ORN3fSdv5;tY z1O$b5OicF2~j=Csl4 zt>HpKIKuLk-EM{Ea+=onSsWub_a;JoM_!HrFq>Rpf*UO>=FK_T9tP860dV%u(Al-_P+OP z_F+on0R9nw%qm*SdVoT)8cp4T2KPt_haEz4Oji70gdwa+vroLTEA9(fn~%<+pQNlm zWsz@*LlKvN`q&lmX#PxQq-V z`-# zlnvfJ?8XxH!W)8Ddf#)iK zjb$N9Dr;j!jx`Fv0Y3y7C~&h%7O+?oaIFK@(a6nRao=@|~>aitkNz%7%tR34Z3yXAd@NWT^TQvr|mh|JQ zg5w2zgNzn-n}sD0tY4FHR*H?IoFwVx_8ua%IR<8-fj=|?w?-0)1z-z8NdPm24UNVxRFBpDC24~%NqWJ zJ1}Nv_{uGZpQ(AvJ9T0I0hSr?;?3T`UwaL3lRXbe!p!xS8OB`K*p1U@BHMZqZ5cX$ zEptD9ddwy6v~zbgw?0I!kEwxR^0(=HTaOKm_2 zgjFCaUyo@?r;QcW71(ZKfADW5$`qKn!fUy;BKlBq&B2wi&nycwBjXu=VxlyMcvxFvoWHR6V%Ovm7>o%nS84Po{5VaTgm;_CS0Dt445vuKdS;?8JKDI(-B* zxuS!pWjn&eEzIlM$d7NJkyL|iWwI3?`&JlpTbhw1RbEHF8EU^EWE)@XA00t#+f_7s z&{bqJx~E3|PIZ0`#@!Bjxx<#u7hh~Y+}+uGINm#4)f81M(IDw2)%aL(X)Q&BKG;2Y zkUgY3xAZm!y*gF?f%{v3O`TTObg|$R!?=C*aDO~9NOL&KtuLsKK}J8kDwo^joV>-q#Fq4)-8*bSTFwcS zqnrrdvgWxfiJ8(>-UZNkn9rP2P8Aafdh_5w7`*_N04j|{KCsJw?qvg9GD))gy0=Mh zF5E+BjMFf;tkJ26oX~$Mii@nAV~V`Y;bK>3$1_-N6d1HQbb)sUa;hnuAF>S|t#VSe zC54IV4``*wsk#Y7J9APxkdR>m$z7lG01Ud3MPXb~UvTbFI?wfd5KK}FEt&t}py$Ae zPB^cS^4z`p0>;jNbyR~)HY2YdWU`6xw!3;a+<4>Z(j{n3W2;N)6<*$ixKisdT;_&= zVoao5Y82iOqnQ+yafp)SOY-;%5Xs1D-TPUw`{QpJ5d(^eBGv2!5!Ait?9Dvf?6T+N zYyBuM&)VuFm_(f}vsaBrixXGV>MA`@qE4S1J$yoIpS{|DINFO4gvu)<`ihEwE;cLN>mokpWtMAUlLt~DAgjd1q#mIg19MIc?K+A`CQo*`0{&#WhMObI zXdOFlT*=O5^ZG8C^)h&x`G5jNj4XfG2R>yG?9DQi-j?Om2S34r)|+?^iC^1>Chbs3 zm!V!3zNx&FTYcJdm=+NR9>cgi#+5jKcH!(!XD$vfv0~@!)t=@iqIk)!e|(d2ww3B-WPjhdhPn(abuh(gVaFwRimGUu)b}W*%h|#W2ao9& z6DBc+nxjX?)6w484<|{mqlt6WV4{8lOKSsiesW!(!AF;|1n{Y$M7fHD>L+fYD+%9Cw|Gdh&Kg8S+6kWWja)(+4H2rUqnmpN2X`~tgaDRpt~2J#E(BeF z+l<-RnOUtJYGsh9?89x-I9bcv)RFt%l3L83&TX`nT45U-Z4OYdjyn#Z=%E(xq+aBH zx`u}I`tTKg%Z{FE;%5V>XAeI7bZ>{WWca{;)a#qDY$u~`gFvnbX2?%;LjLltrYkJ7 zb^U+%p|wP%6m0f)n)-dxyz)%vr*FvyW!+Uj;3ulwqgY3a3-{EjvvxyJc(Sb?G0ff+ z@SRYMQ3l`#=^P}5{2*hvfy9~0OFUnocP2vJ!>Rrr@6kyi1SUq0fYsayU>jgS$ZGa~ z05e}%`42Nq^`Vc&TTt)HGjn3`&nu}Y%eim~DX#e;+nT*G0?m5`JEVU8vW3HDy}`}m zz?;;h4$TpweM!EOzo=ga6q3GsQjeejTm9Uf z_@~Jt`tkos7R=yl7rJ&!@3gfE*0zkFv&xT`K3N z4bd{-OvADphu}bQ%Wx+=UJ!8!P8pVIva4C13Z%@}9tSri+Y+D$kA)Iu{}PZr*Hqs? z)3Ix~W8k4g5dX_?9v!7*I?Y6XSi1IPp|AI8F_9P~e49x1$fOjH;NMp3V}BQp^7cR4 zcWddm4YCn}SQ|tu__gg2ZHws2d)XrUerP(?*vTRZ3#9E51(vi<48oo^N?24|DyqY- zZLfq#u4%P|C=#}d?mc6>SQOTRQ82e_$CO%NtTkg>^l^bBUE4F-RM1_2nMSo=Z-ctg zs7i|gWZ&zhl~j$vhKN!I#>KVB!-Hk0*olHcdcrx^LAn47=F+01^!^AzHJ=!4{D_B( z$HMX6SE6n)Ji{`qVa>48MySqIrfA$;h*+em-l$z#>c)gsMs3s(04-Hjg|S!ta|Amu zd>>b{OP~K2PEg;Y{{v@#jkfm>AAP?45bo>YKY(SsoL!vd(*m$r@K5$W-`_cS1WqMC zc<@h(v+|?@wnX8b%f`dqpWOEI4+QVdSf>+3f3)P$C;N|xC?@RaNqG?m9Up$RGyduj z8o{6}J-nqDGqx4i#pDhtQ$|V%-)4S?NH)TcsBGA2$eQN1b}@H*%f~r38vqor$-XB<2Ma|I= zpo>u&!W;WO%p{@!XR{Q9KH77Q(l-)-UY-VB>cwUOllb^7& z%(R-m!Y(osU*2VZRK4Va^tD#cw##o*GQ4S`mMG6$GHA%gsYr-~WQsh9&n{x38I2vs z#8<#J)IMyOS~!VViQ&|#FMG>JSH!m@B+gRoBPdz+bVP;eifEC?O{yg-TpUG0-3W-B zU_5={I`P)VO~}=X4J9#aPp ze`0+i?4yC3+ox@9AxK!RLi+Tn=!yu+WqVyebm&MLGf!s(>s5kYHGD7i08<8=qa{OC z48bHm--S;z$9p0))Nh+O+-NH2l&*f#v%Q8__@;Y#F4$_`mg+wK!iZZQC zSp-I+48+rwr_9W2x(g>VH3icY+NO|q0XWwrc((~x}YTD8b};`RqWhtS~YaUPU^%|&57DW=8j@*ZMpIj(zj zaI`;$TZHN3xr%9FM7^Sz203R)whEfVl_yW27(h;-!V1zJQz4WzwwZG? z-cv%O9O&4JWG-U(E(bbFg2E5O2iw#3Fh{a~?O_h*$zcxH(DN`yBqWWi}X8@u>v-`U-RUWx{ z6?O88>VUNQYv_0V3M80D#Au3|y&9yW$;(C9L}6;aE>7;pOkd7Vn!XIs)%0cfsOcMj zX7X=98Wdymm%m{T=|Zo|3=+H4kAeioaEG;dLnwiLZ(R8vj7uR%)Em!4-W+KtEl@p? zLS#N&IdfFpE%|a1-&M9&;CMq`)-qWmh#z3;9Q~01zKj9?>45br&y>`{ZL<3bwzKl~ zAC7|5C|bHVqI7%iXl^Zhzx!Ve8zq!fKIP ziM23miS7MWV*6C*{g~L^r+NP_i0vJl@Et{r&{!tjq}7!dPT!EU-tQo-_uHklDX%lI zORMvS5pkc52$n{KgGeyXUYMIk#T^jjLtr6y?_oYE7j<^0BpRiok2ba_q>0{t&JZw= zi?f1X)+K3z>o70T_eJ^A8}A}?0v+2XmRQJnnUI`R^}tsHh)qSr^3}CmCTqD|S?Ut8DpUunp zVp7C<=SIb1x1>GZY}~EZTabx=ZC|UFi>D?4ttuR{G5(zyPVF|s=yG+}XL0{!h0Jl4 z;|S%)5DUOr42$XS`Q^HT&~$P()#~bQNdmwz*j00gbv!%W5Q>LeoCqRW|4G=S#q2ac zK_^3iJAFr?A`Y(dw$)`Ne*ifFU-;vufsQqExa5w zF?4SX(dduSpTktnAK^m^(F)$nUQ?uGaWbN*FK2Iv$*IC{^~Lm3_WC=oWv^;nBG<7p z=A{A)BQHC&PqSLwS?$e#trp|+;=FVYDLSnF(B-?BEVFU~=W75;ac12y1V*4;dyF*o zvJi7yI(Q0qxccbc2ye3%UGiH21E8E=db@L7CPj_gW+k`7EjJ}lJ0=u4t8@goW$#spD$(iM{h$p;Qa3yg>7JA z(4s0uv}kg2KT(uG;BNg*&I26yxd0gg4L`{SG)c?~3O8PCj=FmVuy+NAigv=rRnEa* zBZSo}GjO#)IpZIHSaiZ4ZiyzSMzJbU%5(%eOyjaO@B_vbMB#Sg&aOw3A!K^MGPojD z*`>+I?uGkiZuoewD~3xmIQnqe&|!9ymruN30tfG=!uFyOHA2U!wUlvj@fpM*wH)d^ z407HY!@~xncm7X+SFQk%xs4qsVhR9GA?7o(3nVKC*Orlg1wJkw1E3La?$E~=*&1vY z)77Wtte#_B926B0sj#~L#{i9il!*JrVl?8kkn4%!FAJAl-PAyE(A@?eg-~vfLX(hS zk>CHW_0Q2{f^6K_`FtN7&NKRQNQl22CH5a?%OL4d;iIfOJ}{Vm`rB@?B!&n$ zL*S!GSN{)^H3tc@aRZMQxOz-NM40@K94FX@m?)}$Mn3()5++MLt0h41@g(h(o|CBZ z*Bf2v7l?1s@d?%c!)@K+c4vmhKhKsT5yvv^^F^ni#ryzJ`WAHJ@ilu3I(3Qjrf)$< z3F>tV8u}q)ES-ZIbAgti#thaT)R-ZoL5)8_YDu~@B!3jM4i~CbJvIWea8F;VZogB_ z{jo%UvBs5ZMzJ#fF$2Y~QA=*}8nuGKCzSa{bbD(F%TWP72>F@1?5Yrfng?Qj%S+6n zhh?4=XBXLJwSYzgV+v4#RHl|Figm#Vco^py=}2S~orzM9Qdy4P;ke0x9ZqtTEWFzN z7>-V-uEL^(Bsfc5HEKqW7WET)i?^CJ0sV7-omZYfG&t#HRHg-zj3ObybOn(mG7L_k z1^^BtwVA?0&{IK~Ar^udxWkMh)n@dG(;}sKPVT`=QHDLhodU3dE`S)gu1V}8T+|LR zGf&zq#7PrDq5KB>C==fQLUWvA@7Mv6C*~S^0kJ=WvBS83UwSDIdH2#w%)JLvIHqfy7;n$#@LCbseGjq$ zh~H*LX<4rIYX>x6GvYP0LjVc!L1qiW`lJ)>4cdaCe!#CrMSYTQSP08ALp}Q zLUO;TezOAtwHNt`qQfupjXUElST4<_QOZZ3IJ3m<|2cHureau78 z>6+T`_ElVqW&Q&w8-3bhTlAy&5EyEtfyO#Ine0v5vSedOOoCe{Aj=|c}<@nYlhuDgyfUzY!VXdzGG}44SHU= zt%i1tY<)AWg!TecWx$>+W~iJw-7YC9rB8c4hc0K4k@)kQnM+4j%|rEn06d&!Pbero z`YToN&V73Y+woE3A5;$fDq2+dVR5=B&O&{= zOp!T%T7cD11N$J>m|MnwKdkVvKXOrP!S9R(tAY;MICifb1LvG$?l!G(o21Q zd`Zf_OO@lwaobk>1)EoDA$E>)OvUwf(IryL{oAj_jR9K=W*SKiYxon&wN!u|0Y^J| z%{8naTqsvRjykf{kkao+K!i&s==bhYZg#{9JZP2YF2Ny*_bV6 zqNfvWuWz<@j>PPOfjrAk=YD(8t$1t45`;qI<8)RQu-d;wJyK@_1f)eYl5<{X=UApfkIi2^(>p5(uk)q-Ly zuAC9*2yL=`LiVRj)hZ)%pn%&g)o|f_exA227Xj$F3Nd1W#stZ;S?+d|FuiWW2u5j> z&J#|A`2cCfJ`w%rcMV!Gd*BeYq-v_^3m8B@g|0|vzX`VA@jTbp)ydYMUb8}TmyNQC|zM* zH+9%{`GU}OX)CyBRQTiE2GcdH}pG+@YdVKeuP_a^cFkQqsDx-Hhj z1wcW0nt9G)UDv{7qUi8o?;G5j`e;@ZR~?`aAlkRvhPY}6MS<=Ly!Tr^DF{{+y_@BV z6Wrr}rAcd=0cchcGkFJ_w3=+lha+|9Lc;dv#3R}{?!^&brb}ayGkps&hop=Zgg00a zoKA&vq)Er7j~{|(W{z`2J0;^sp!z@%cZ*Y4W^^EZjHGuHgz?ufrb@SQLtX4h$^VO<-WjG=YKJ?@|VFb(;Zg)k&OE zbO027bHIMpk8+xC0uOUp6L>hW^T*9gh8|`B2|aA804U1gdFCTN4#p@CxYylbF@k=9A}u(?b3Hy;XO zj2rSZ)l)wK9Rf9IxCSM7colYKP-C~K84Ml0XdGq=U4XPv@WEqCw_NH?pwU-+6F|?m zy3)D6<9?0YMaQ5GHM{8e9XxqKzK$AycLV=e1-kc;JLYDezTa?%!SC_VclB&IGTzU| zhM-YO7NA*3;Io$k$VW<|{VqgG0ZfvBcQ};x;oR|$A!hC7^V~TnUF2}0F%a}{5LZ!w zj8J^Pfq!0p{Rcqi*!IAkxDN!0xLj(9qvBe?DDC-HN4BQ?K=7Kg`4jiRPOf)_Y~`@B4jJ}Vhh z>%Ao|%R0&&bQSfAABet|T)v_3H1JW7PAQ(Fjc0S3Nsrl!fDo zVcTOexPRG6YiW3$6*(Q2&s{Q_TgD#jHJrlilzd~YNQV~j>&S9PNtU^c5yfWtEP#6e zXPM*+M|sM;>88LQRTmd-$n#mUL$*GPW43H}GZbjrA#xlwcbWee)x|ZrkGuyTe@DlA zhk`weeq9uc;+c1VcfQ0a*Zmm60;!yjOHk%_sW%WFl^zssZt)&H+WzKYJ;eQ8JfNZD z$sCXY93IGmQDV5v&d_yvzBtSA#XQ*m#A%WA50qPgk5vBqw9wPM_!t8~@y7)n^uiDY z`>-A{t$6xDhq}K*Ex2Z(=4)SMe;C-|wmSJQT~IcZHm0al5Xxt>BVG6L6exWvypJuX z9`LV0fO;6Zd~-EJFgm%St3YP#OxQ}~avr(X$U^PS+u4ZnOB`3gMCwh-x_cuJi0d@) zLPlT9zFIj7`;J4shLZyS57E{kI^qdD99z-R3Kn`}#M+_6$OM6mymbaRf8gyhzOOZ2 zal~Hp%(Kt_nxk}sm zjY!N7H;9PsP!aashWlSiiKuhi0XBEIq<^SeG8DRpOX7x#l&0ocAE8xQNAv1pNiuH; zn2eFD8FJm9Xg*T{F#IzGeNR-^NwglN>iEQhYb z-At1m&V_3q`S%)QO%Y{vp)i@&G!qDVJ?ZyNm6_DkV&pmvX$4l-f|)ki39{GU?)Qt5 z#L$X4lxQ0JfAEEFCH`p6SlGg5SMeiWMJfz)c)BgeykpP1c z^P@QpiMXdS?|G>xfABmO@-gzWPxL0j77^$Z^Tpf=*=Y{uT~efSt~qF?7pq}PRanZ6 zOjr;l8++uS3?@Ch=XgSHOAdOiu{?sX>l=M888^SY>c6-OP5e0Z*W7_>^Qr3ITWrL- zhq%O!vH9bQb2|=W2efd(2kwsZI*|LnRLf7F|NRHuB%`0S4}@vtuR zNBE>TD=9$77G>fg(ubEAA2z!O+5T=2M0LdiOpx3%2rdw1$LK~~d6(Zq2n>JflHY#K zuWqSUTpByNvAmpHONfApLs1fR^IRMH^KbT!u)B>K_E+we4`gr+T{mFB8@$kFkO!=z z4eSGt*LQ2Kf7?Nm>$^(_g}48XES(}NwsTIJv>OZXXwH^xS+-?KmgThZHsQJ6k$w=G zGTWNDayYOmlZu`CNsKINuN>U3FTFQoOE-z&Wg7@%TzD~ZE5QayE&-u2P zj?uVQqQoat76E@Hk_78#^j0$jl&kb%~f4bAS{XD(aQHzRN@L+0As8KQA`0!VOw?RH}k%L~~EfQfYk6mMD!ifL$3$i_->8r}9KyNJ&+#L09>Oth0EzLB z2yjJ`Nb$kBO2Ft{WtqUFhWUX%UllK3e>EJ6xj<;LNaxQk;QzJY$%8rycSf)gD8Y(n ze}M43O4SI~*}2tK-(D`<<440H<^!Ld8&m2?b3^DzF@Y4gPy(%SabY&x2`r4{tZ3>? z1llBL#Fc>4F<)ZbnLVMQW5?Q;c93uENEDGBvX?kbqC)IzQ_xgVySC$gG=C*`;#kFD@~BjHyQQOygNtD-Z8 z1h+&Zjy2!LCcMgvoFb@TR2*c#JgBwz>K}xmt&{xx9EKKybkT&8sF)HNqnvX%OK~w{ zat*z^khQmI!QKp5Cz0QOsl5#?D_Z|r)CKm&rG2cB&;Q&8N+1nH$ZfWvR*(t`Z@8PG z>?XjD==M@Ngero3l@*_wvf-CH0ANj57^FqeOK_ROIqXi9P)FNObtTo`SiW{Dn&!sIq zgd=POm8}i@Z5KpY>JgFCpjFp-jUuOmBDoY}1pkSx5aL1*Cd0e#Ruo&OD7KX%7E2M0 zJk~*GwY*twbwOcm?V%JvJ_1c=XxoPr+4!5B4^v8)jbA`9k0gBy^n!q zk8`T>8}jVzGpGB1Vu%yCH}nhsMuK3=KFrOP7g6|~u6yb5gdP%td5KxVN2?wm-I zHQSSJITG!P@&>tZ3~lk^Re6D1BO)8x=0t`YS|?WV#ZL_8SQh&L3gb0&8*Nxv1AOR8 zR`jp)Mhosxw=JE4@QLL^{?htb;Sy$SUQOm#_)%57m_DO_yp&+w#iEnWD;S`bF{6SoWO^Xs5swDTEsV{{b{mJ19NNkrU2t9-p0Li529t@5Te(X2J zgdWOyiMvhYUZ_}nY~ifkmSu#n2Y`+0fa@2};QAlkxv7r^Tr%#Tl}Hs`JN@I5cI8^s zP^?@_%+M`=U+|GS@Scdq7_hWKqAv&buPC%Z7gIJyfg&>ithe^Kx7{AMJs92|3~#NG{|js6+>>$t53A%{ zr##k|yr2OcPXN`MAiYWR&3}cTZsnz|ytI{I7{fQb~C*4d;b zGpUYwBqo*LCNI&ZM?PIeHG=t@4@U2m;H1daA~x}mveVo9mnfkDMqC?O%pI9C60yvF zzL-oVq%@5tPa_z0lL!Ou%%4_OmI;D8ys$tQ05VPV!x?Lw&CA4@n0&%wy?8DkUnhHV z*5b@x?g>`vY%|`&ScY|bgTAjS+dY0vIrj|$QqPylp#dL%F~7{}!WVwu;uUG|>>#$O zjDKjP++nI_;3*_MM;35_=r)aq6 zGi}Mo>-q7}umaAHZUYw@@tGx8I;RAf_Qv@HwTl-3pt5VM4U>w=Ro+zF9N-ld)}L4G z1U&G!krZZs$1)SS#cEKJU%=9y?CmjKh_cS3TxV`*7wVyMY;!lz2MPY~nK~lojwzzM zj0219t@zDQbY%f?m1pdvnHXxxv}lVi6bB67?&lq2MJ8+ymKA&rZ?V9egoKV^R>KheR3_!Z#{ z2Hs;Ao=dR)7K0bY$_cFfXq9?(sxA&u?OWH5Tu3`02`(X?D4Z4 zo7??{TH$0QLl=T^Aqaa2gw5x$W!>AL4hC)arf6wl-zuU?%Dsv=H~EX}fNWNKo_K6l zZc9A2(48tCNMUPk95!_p=gW1Yq9yZxG0m1Z>2NybvLClQx-UdiO4r>0cksQ`;4``! zkFP1HFoQY$k@)@YQxCSjaE!~>usEVv z%LbN}!EO2TH|&vn^k$M5pJ*?C{DyTpvvEx-uMRi;?a?t9-+QoM(8yuHw3APNR1j)) zUiWbWh{2JN>gcXgJ37`Us6S*7^ZtNdM5{n$MKDa7mJDq>fpqdoKEC!%oO|T$bA@AS zDZYP#m{0CmmlxS}UhT>QVMc~7;LkztWS5;gW}%g9F#l(cer#8f8N_@1CJ(6oASin_D*5~{v*y8zi~J?BILU3yZyDQyq#BE<1I`(Ch3{#Y}Y@%@8NxTN3bVjpS?$}a|%?=d; z$>VumsIuEQA-Hp!mLXLTSkmGn@G=RQao#`{Ro(D$x^M^DjUImpqA?ayuYrLD7*ZBw zNr^GS;(gxT`c-xb$zW|*=6dr|cW|-pq@B-^hDm>73*R<3+TF4vStr_Bb3>LCQ&os9 z4JPPUUws-rscl)+?`&PQ!w|$>$`##q@`$WN}rG3{KX>+@S;RrVy$ zsjNSE^2$*SI)Ky+*X0xDsZbPaH0z_laUoA{;qySgxjhB__W`=HJ*0UXh9j|8u*@DfL8J*6IaGi;^qaNI)Ht_r(mj zrH#a>BN2c4NCO?Ak1SF(qVMPyq@LWei1S=eg8k(=tg;ahp4-PtF}{4 z^It!&ZDFkLrTIm??nbQ6BC9}lSoP_;B?1W>R8|gK>K4{vw6Gg6-=iXFA@B_Y1ul#o#Mn3?K~q1bv1=)= zHq#ANJIt)sDKAPYSLx3Dwf zODuUsO_wQjRA4^<#spu7NT94S)Eior!wR$y^H3kgG^5k|3`YddC%G)G>r&RMTF$a$ z-P1SnMaZfOVz`ZPk1i%s4RNVB1I_xDb}(Q~&f|<%Nm!179BgDm=Y_I1hvjTIc#RUS z(J{JIp}-1*^B^DU;r+%z?gnenb47n=9rHUN^d1v*mW=6L1 zDRFYBji0~lC78y6;+hDMs^Pfl6PzZ}SVy(2rUntbj$o}kx=l48+sJU*^{2qtRvs4^ z6Bz_kA&Jr>coNL^>QV8U%k7K$*}R zp+4e^zX)euM>Pz@jfZ1yiTq@oWTx{stj5Ie%^T71hsOxfS;o1~4Ft-}n!Jt*QkJP+ zBU>R1nUSL2ur``p1**@*s^Q{EnD%5|d~rmCwZ2CIRty+GF*Xi9$;jGZA+2PQh@>}VL$^4g%(oA#cpQ|Q*8;vK92;0y<} z#A%UR8q04xuP52-o!?Ciu9TB%piGWwd$Y7`^3q9r?Mtkud0t`Ke%kCQ4#9^dlbgT0 z)(&PTTbr1b93-ef2sxj?B07Rs16?4Onv&ttQnKG7N+JR>#wnxd@F;)98Yx+GQupQV z)%n)@z_1>yiD6+E!u;yN>io)-cG#5<<{u3Mo-sbCYX|C-m*Ka)pI}lq&c~^{*nI&^a$I#>o-K!`*-<7VAjW{+a-iWz%qh37dFAvJgYmJ4JYvlNKN%vAQW1Cmpvs37rq;?1m zQ0gVETjx`QNyjRkDio;@)`v>ZiHRkD1z=zDFJ0EHI|cmh8UgS7T&+fMZtV)-l>L| zazFKkgQKU(6Q%}&3vIySWpwFQ6?#}&FLX(_8i^&9`V|`>`1P{@lNqDV*&19}CW_SJ zBK5d9vBoFZ2oZnL6&mW#8P*YR_Vp z)s;)(!CIIi_KMlKQ7n|D2)AL`;M38_1~f-MkQ|Wr|IWZ-&ToVM_Rz?^&4;|r(MZr2 zQxuCIewykGv*s{o$2?WIGnY%tMDn4-4hSe6R0*pc^ANKEKV=I)!Op{pih%i?>GZ}` z9dxEvB6NSQt4_EThqGN3Lvr6>*m}I{az57?-Oc{6hs8hL|GfL?{@$mL9^L=^^M?=S z$vS(-n>x8amw!ztJbZ8;s@ebI^9S(n9LV1Yvis@7z0bP)kM>q!uQ}+-RK?LSwRSja!9%4qhfGUVf zk6)BSQ^+$UB-1<9IaTWBb%EAGdVIMC1?fUDX2FTVl<*K*NXRGG0OMBh5XvTZErj`@ zf6XC{TwS;TgdOJ8cSv~Ca3R6X+xJ)@j+i_XSaW`%v`^L|pn$j~`C*BRdB4u$&I{w$ z`NDsoTy)8K)9m>TP%=2QrI?Oe$xM6JR<6DE%1Ttr@dCwPOHKsZE;=Q^pTzgBhCzj>?w zox!0YqHra1nU$@``ajww38p(M4)7wx$Ls#Gob z)uqV-L3QG&Ylt<}i&#G-+^|1jge?f6Z zY(P=~$JPSJZw-t;(NlYfqdqtU0IKz4L&p#NOlcRZ8kJO>(RKlU<63`Lc!0D=*&oo~ zkMIA!;6$di>PE&}XrdIVH0#01O*jKo=)FD35wd!5{~d*8Ck@C4^ZiwqR(6N${wUeK zuU2HRRuHk>v?XgL#O0^_5J{Bkf7WXyud1@@Bs)xaBpZes!>OVayDyU+5LFV-ZrOS= zq&GCYka9Ma+e1Ma0ogbk(q{Ky>gL7lYpKjYG?ErYDPq$g82T;>w!C4iEvEo*VX`2m zx<1-|uIMHxW@WFl0+HjU>>H5FUB2a=*S)!k%|mdME9kKp5f{K70nAw}Auvpxtcn92 z9G?v1AdjCP#{nMxIC%Pl0(B+5!)9_c?+2GbvjHl9Rl;Mm@c>GgWu5ZQs_OnaIQgab zV^UVQI(@Anu~c)I!tF^)T!Tl?hJ%B}Ez*3H_VAlplkb?ej(dl_<3%mube4w9C)OsP zG0h;{f>vM}S&hJ#sY$3q4e;Cw+AfpR-@?yM;6>g6xAvUNPwRD!!gvR0o^Ah&37|*_cfX6_@S8EgX`0;ZmVwDuT!Y#-pG@+(H3`mU$ZxPN%ktp0`$m6OUn( zL(H9yU5g>{2shW69q}L|nM+9@ugVM57mBL67hiu9e`6$Q8stqqwB`td;0lUKzhBuHr{HZoPERY@KmQ$?71ckx+c z(36?=D~pa)eRPq?(Ynh~iuaWBjjA3of&a43r_{}k335R{yHKKAjJnYCbS@RH)0^b( z^M3Eyf6>#^?~i^wOf1(HYE-7qlI>CpAj@%I<${5NoXPIA~#ZXIICSx<1l zX!kZ)ie{64Cf|B-iWOR*HOXCM5Be-Wy5!962*mlAaa)V1_*3Q$WewMKT}jKU7i z?5b$#pILsAzhEwtO=r5Boq-i^T6)e-cPHs2oxY`$+m5hf90Z+U z{{(O_FZ22L)n7Epeca&rACI>v$N%b8rttpnke4o3SvF@F+T;bRS<2-9`OVqr>~AL z`85AQy6g1vVM%_#S(EWqV2O``a&#Ha{mAR==i|Z;3Im{IdfBH8+Cm>*P zM@I*$sT;k_Y#-rr8%tJ)__x4|MfHIZp$bhIZzU%#voEUjPJ9mpw^l+><-pRIx$c_Sso3&{todyU;7PC_vUKhXuzfgZ0RwG zv>g|p%iq38DIPIDv82D(EfhpbkLI77)?bKeM7ww^ZopLukPxw;e-Zw7#U@pb>D`h3 z9#!Y_%N#n|T@K4ZMWWo>Py8BH9%t*9&({}!ECfb-?kW%ohM?3Ena6iY|l&pyX z^$DYu*1G@sjbuyB>kX9Ho+p5AZ4jbs$nQT`En%QSVEKVh4b&RKBQFB8u_lx5s%S_U zq)Z7S1XoGf8*VaUf8Ej9-h0-}MTzZ@(kN@>jh3q5*A4%HvIJub#cZ}`gggh;I>p%a zE*LkpX>`k&In~6d4SD{!F6UrFX*I^Li)G=dOKPZ<=`vR!g;t%0BAe?B;7^8&11b!_V=h^u0T2T)8a0uorOLlQjy6sDJ~Xd>&ej8SWw z_1Tm|-J%F5`9%(ECt(v*zQ2WP&Zc1cO6 zBJ~aeB%tsR@pw+254gwIn#8D7svJxK+G)J$(E9gT0gF2yP3G@V?;qsbp};v00@Ga|u-GEU$2_T;o<{Bi-Cw z;N4C^e=Ltf9_Bv` zHX0!elPaSCoW)Gi6xRu_!=y@WqIf`MPwa$QiF0~U*$;R)skDx!C6r}LJi?ya3Yr)}~S{4ZXBx|KM*c9KjPJud>1u&!FnSir<0ev_~^=M08*M?yU zf778p?9-78Ma_pBvoLMC&*ub&2xecie+cTMIINqh>@Cb%w(WnH^N4o z-_48DZ!fNS0}j(2L~;|>%UE%3ASfQ2)D%_Z7kC(#;9rtV+t}oQ8aF_g!+MhW!V98! z`xe7&RoBw$#G7))Gjcfz^)V57a8MfT59V# zrm5`^$JC`SZX}0a)4=r>GUwDMiK$cT9Q>{=kf9HM!k2ueU>s^{=uQb#zyhJBHTDk~ zF1Sh#OOk0@yOv@iNNG7kWl~V9jEDA)5=D}Y&;6+r^yinIyXQhu3BMo`ZgxW}e-iR3 zL+dVQ+n`x8D48z`nI*Ma5tR(AJCR&JM&nCDBZV=BtCwPuwTacVsH_@%v@4bQ)Ln z#ThO4IGaB+Np!x-eHue39#OZVf8c8vc6WjgTiPh_DSS3y`(mO$B+NGplTSpa*HTqh z8abuO<53Ak5-I#ET1TOI8S?T{Bt&?x%8TpEvbuU)oN{Vg#sodcYt)u<+E&7sMF~e^ zPw!-uQ1l}$2gtHVM+{IxC%WHfI+gp3g{{?Sd^kNkJEPg>g!l@r75gCtf2M{CX|#2` zX{=2gpNna+Q*xLCYkXXz?7cU7`0hdS-uU?B@aR)simMpsQ;^feH4dCp*s7f8wAh%G zr*xLZ2oVYw!mRMHjqI-P>e=yFE!#9~KY0E{ zZLG>SNSePGtesj9`nCXU;U>PKeRT5P;n6Wo{4|Y^-~I@%;Ez?`e`pOu`&P*aTJI!Q zB|hKWJb+?YVQg-GF?c+iUDZ3!JqMH19FFGm>>LkE=FeT`bcb~H`0CC1?)LWfi?3{N z43P%B zVhO6GJA6Px|F_h(R_yi|QbFq>WTVD%EjmzedfEv6!ii{Se>{c7N6}m_4ejwIY>Z7? zbC(i?n(DV*Eyq&#h>pg-WUd}0FGBnH0o+mhm_!oU@&-s}1bdJr8=}xYJiVK6M8sA$ zX+SQj*UpW(x!Vy~_GZcDqSV+qm*{nLsB7pVh^^-DPz*08P#s~UA}cy&y|z;UD4+Fg zh|mQOI1pqPf9{4yrG;}FhVu5f)xW=pF-orPC-_8EG*p(KeYB4;-k^S#Q$8E47n}B7 z^hgF~3i>4MvO`y|8?=$aA18oQ$e>9I605P#x`bi={g4c-vO)aGc zPEl)vwQvs0=peP?^Ickk_|g_KIKLkl2g+LE88|!78H5@J9!2F50J^Mcv2= z>hZOkf37cBnowbehw~5cTxrPr2euvN+>=7}Cv;-;Ls94Kp4-W6i1RXmh*RiW4RA`u z0;3HvyI}3f^5g*4f*4!OXw5WN)Cb6_0mm(q&m#T-T%Y{9OENJcH{h(O-J+#V&J=h( zuVGzz-7?$a&WfWN)Q}2DAzK&eEY%6a5b1&df6JuGK$swbMPW{RAV(z_)Nx68xby;- zaMQeMPR79|p3;im0s*23Z1u*w|ffOKq_U=)L!Bm#_IrAfV6DlSr!YvFUNQYqXeJo;et z@PM4qq-SfxSoQY~J{a#oXug9ZYM^Y1e>dTK3aak#D_;Njz40TejSQ7)zpP&6jM5o? zeQxT0@nomBFh&c@?1B~%cQOTg0!3^B3x9n9J*|rgZy8$?fwA8FnHH1e!~qTRn9d3~f2zXEeMK5w>qo=~fAH_! z&NrRf4XwrCuS%7bp>1s?s73wF{YMYSC-$s|PdVAmj||O2`m6dR*mHhaxLLOZc6>9d zaU~{AIvr|wB#^M1ujN^ce0Hv5Y#M|MP*>(urn2qdI0EF^~<&llRN&d{y;OFukKqSvz9Ck-Qd9#LnkVP0OyD348SO^So+uO2Qx9n(7Tg+_IO7etD}SP)G_w zZWH!?xVv&_KIb?XUsX<^f9i@)3ZCpTLIrPpX)iUx!&FMG0%>8#~q;g zW0Z+{wis%+9J3;pTfz6`g)qSPVU?TcPVy4kY9*AxW|~z!bC1 z_18v(#l`d%A~g4Igk-NlOg{+wT||mddWaJN+dRf1285x-E@&f4e<~%?cO$h`cD8{r zYqn^qknp~*k%N*@XvLS3`FVFQ*qb+gdu5fU)<=}cP+!woNj{)y_`c7QM-*`{ty8gcCGPvAdIIv@ zfd@p?((NEtl8IZMe*~hO#{0pG9}%U0>7&Cf+0~Z70PkExV(buZpd6(uG-D;zk3>W7 z=+op-FeI{s!8>7Mvpd{Y;Klr})DQIK{?F=$k#dJEN=6Q8e;9o4V$Lq^RbEpDOkV|{ zMUM&ouIpsNcSOWQF9|U-UgSm;c-g&?-izABwjshSwcV0F3vJJjM;@L#chq%1K{f+@ zIZRKWi{kr~Yya!t=X-b@EEVqE1qE_{ghO<7ViJf!AxWVX(Z5?HGDue=kj5_o4sFY; z)d|Hw4GD%TfBcuk!oD7>5em3}tWX#N%@YC^{Fg+4?lV0F5Z}JK4@IXFoDsp0EM91h zy{1JSYdhppVgJh4B0`778eNM({ln>BKK>jmvJPq1f2(kT1kBQErWr z78mHJlrxKL1pvT^853XQqJ2PpHR)s9M(Vs-3d!<4UiTn9#el^ z|EgMNL0XlQGL2vC_ns@7>zJTE`st_DAvdZseU+uZFlFGI4!Dw*RNIN!0Q%J4Mz?#D zdv>;*e_qmeA=r-9n@*4~vmcAg`DOBblZ`lVM|J=KipVZEhXqz^~lFp7-bniF(^hE27P@n+EE5`rV8+1K^Je}k9)2xy20+N%*g@h!c(TWm$_$cXO4{`}$Cu748X^W}aDdPkh&=!!BcaGe0N@To#3GCj z5UBVb)$xYMazZZKsqDv&oXUP&&Z&d~nT;R5tBk{VXL9D+#P5?> ze@=rLWDx%rsh4O!!bRR9NSq5TzMR(>=W-G8YN9a$OpL%39TT__hMQW*W?xNO@M87Xi7_c;bVtMkWopbu;DvrH z--3)Yq&hs1Tf>M2g4Jhhw8*Yf!%UZI-$G(VcJ z*ZOr~^$rHf`l14haAO7cJ;bW+f0sTDDcTHRONfOH*=K2~zLE8}Tw06Ss=t-Dkp}NI z1HrbD&)UrL>vLw)7io4ebDQ!?Ye}0Qy%s+%X>skf_-RRt$I>mYr`%B4|FeiZ0xI@h zE(-mNH->FrwraG8V{cT%)+yE?YiLC`9_pYSXK|z3;(cmlCp2Keoi}a z?O3^{NL0i_7qzuf47kiUi(h+cHC+j8-B^h0LQdsSL@xxHSfg5Eat@c+{PKX zSzBnPD8=j>9SJwu^=)W_1U}CSyn}>4F6wlW=U00WzHFdICl#zU1F1i^0KZ7%hS)NL zu-%ap77`~0n_#SC$@~>z%@Ne^=AZo+FeW8xQzkLWCFPDpp@nX_e-W~AHS~2>=j%d2 z6REPx5R|>{+Zf#&I4Rh!yo3xm;-I6nh~^02Db)wewhE`-cA}^1%ovx^Z5#)C2`PT!?Bk_P8pw(|P zzBGztkNDYXVLPu&!rhyOX<&rP0k1&N{z%deX1Uoo&=)@Ff7L~-HUQzc)#d zBx}NWVjCSwf0C;3al#H|a^fG|U+KUjk<&TBl#^CC_8dL`F8svvvILG&^9wPJ{h|;p zK%Wq(4-gVS=0U6@6pm1B1s)Q5a)6z=)!6}q?S6Qmtqd^=29Y_%13gh_HG0GEmC^4| zpX~=#j*!Lk0hsNfS9+rtvp({en+F~oid_y;f#p5Uf5IXzJpxS8nWdjW7Ywwag!w@> z;CDQz-gvrNuT?1bGbtK{7(VP|t02lLcfK8>o6q@?1*Two^EduB}Hv*y$v2+utEDcOxm0IF;@f^%XA8 z&;tYn#4XB-#O*EEEWjZZHy=e|JVyiH2LcRgKs5OZMYD`oq3Gis*u$aLW8CSw*j__yjwT(G(%c?FTibOM!(Jb51-Jco$VUa!`4{q^1Yw_!~m6R zYj%xlSzvyZ6>PS&qDlJdRvfx0Hk`GgaMF5E$=qdNSa&|R#0*;a%Z<72ka6Kucf`|s ze@${H_tAp9S8_WPvB_zSWxXQx#qYxmHDj!)jOn` z!@exfH0LlawS0&tn$wmm$}@+cx}}*zf5KLiWv(Ulm8F>@U@}^aH4@wAWtqc|eRIFL za`WL!4E>d00m&Mc^~kwNIB!U~$u(jbHYz+9`zJCr#+s}FW$)p+tS-KH zp22>2cnAlCEk&T!(wW*&1x9J(Ds(IY+Su4R+9hy+^fH<7PIX??j{#0ye*n&6 zO1>umVnY3gI%iF%p(VK5baZuE+l)k|f1#rNI3u|1pu%EsES*qCG`xK=NBV~L>$??51wWgw zhZRKr3e-NzC$W!a?k3|!G^%eS^UvxR{JJQsR6~A9bg;s?;9i0g zWg8PY25>x|!SnkY^sXHme-MRGTS{L@1}{Kq6UGKb1b-v5EQr#;@_9I3j0{|BV|O zvtGXu3dM^~qF~g)ZydM!mecC036(QkNDmYKDo3O|a}Y>F^UF*#e~op}FmQYZSNXms zSGJNusl=w>yIUCrE`}sK#|AUbg@{G8e3dn-&0&UQ;_l}&tjqWrzNFeDJi-T_%1P4@ z_~zyir+ccR%x&^X4oE3&k!G7z)~B$(zIHQ2YW7B$KIha?Di&|-rO6`w4nDu3^PTDu zFY86nwu79ipYM`+f9&bFlm>q14-p`py-fLzO8c4m>E5v7P1)Xzzl-XHP5Qe{|%27#|&NCk-j`{7~85PIUXkqnWZaV-)Q@yz!e_>#HR!^ukTbx2u2gH6U z;}n3C8IC^c!CHsBa4*~;FI+8aVSl&cZc}tG)P>#An92faG*t^KL(1Et1Z2^^6V(XW z0@_|UDKDj5v%}e1;bdo6V&&|I(l*zCb|V<%=gd*Pti^}Bs5A8*e)ZxT?_t|r{7YCP z9$0qd5h9##5e{K0X$ zuRfbm5Bhgtc0u}8^_!t;lBJ#u0(gRSSSJGdZ5#-+8jT|}8p$u_zBKI4qS`4y0J-^XwKa-W6;?*S2PLJIf;#qu z%XfFxqFALAz-yz)H*;EMtpTtOQjkxoNjjvjdqZfMj^6ECCZ%_K)u-swGPlW6Ws*a;XodQqUQSXhhu3*`;l7$Z8*b(?@5PfB!H;=naXW;fvP~8M=7wkYS70?qJA7 z7lhY6#r11!=-c5xg;m^Q@OLu9E~ZINr=c95s*~ff6NM*X*Qlffx2}@l5E9;R>uLZ+ zK)S!R2H2;tmM8cH;M#`2z)Fyw=qIo5#@7sFM4iQrZ;E&0T`j)oXn><8ShypsSJ#}1 zIvyW@uz$|?EdqDGK*xNaqk;FSu@z%e-;d~K_8XENW725{+V;Es$b%BiVn=m5Cafk4 zCI{8VyVl<{`a8`ozO`n5*;XCF?3|eth8Wp(+S*SpO@m@3A!p0az&Ur5jUjm;C)<3D z+B}izBpaK$g29z%3oI*?jFZ^nuNRIh7)@)Thksd0i(2*^|>A5vqQ4XCxX;By(Rv@~y2dqmH9L^r1rZXhDZAwWvGNu6EFCjr6F z4S&&bqePu>=m1VOfc6;skcJdjBmgV!j7{9 z1Jol~{+%W()kIF@_t$HoYkwH0)j&fR2>ktuNe;)TkM?o|BqkIkzJJL0t?JTg9CP^R9P%lf;5lrSTjxD^5^(x0 zQdwn_jD|U%1#?_6x#r1dr)fw9uHgQs_)(`1<5x2>#pF@~8ZeWJ^!4i;&L?sxd1n2Y z2RJjbL~djo2{Xj`zWg;;WMP|KUd}nxY@{I zCVn9#oE=!u3HFxrNJvGPIYII#BsQHlw9B6BEnsa+mzd99vPeq%guv@fxo>k|o)owwj%5BxFiF4Utw(A^h z+(Xr)=SIf|qkRzZiWJQOxN5loSZjAyDhm9FC`L1wg27)eZ`qsuygmhA^lVY=KWA)+ zw88fQr4Rb^H8K?7>GyDd`+uu<4v)SX9eud=1&)OtwRiax7x*SS;w6or?}h4lAC=jD zYk#RMxc!zo{WNs;L&+ifTkrGUp_dC(B5PQ7bfq{H8I(!BHMKLea39ngymn6o)Nu}L z)QP~V-Dg(Zo*M#yVhSr(*k_X?IB(ph7uOzEs_x<@s8x2_IN#5*3V*by*C0#Acj%+H zJTURo_>bh|UVFU?LjdC%=hb^YE+CYL)1m%g0LDacfwv%uw~h{qVQgeTor{c)sIyBr z!6d1j&GU<7KvytZ=@w3)+v(PZcl=b$8lg_1PqS?LZJpAaI$rhQf0IeUu?z?#*U@Yl zbY}H6oIR2MYQ+lzz<<<9qxBrAdk%Ul&D< zyre;y(+jI^wg%h1?wvWkv2abSyV;ufD4`7bJ<{X*hk)qDb^%eKlKngr-@V6~e1;p*+kXtCk6h3^MprvzJ}A!a z;cmbY8DTWCRT@+hQt=i;hB-!oy8$C}?v`wCfc(Ym-@1SPZ}|e)ib!CqzX&9cs5!)2 z@9Q_cXQ1pl*(-;bB9Zf=N?tyC;zD`h0!$W2?R&5n?#AmI`0QdN6D7-Oa@FuNAEM1# zlTNJ-BegYkC4bddhIlP(3cs(A5!A%tR-ldMoTJLf&3LVoqmTAZJ~}$!s^SbH^?zw= zoiq&Yw?tvAiMH)piH|IcKXPB1J~WTxw`tw7g{KB`V6G7XOjCYe zjtBd7o==?}4*6=kIFhX$!p{M+v+7c=?fjbCS`&_5GJgso9jW@fR?Vi1+VIp7t~4(4 zSgRMbRg-fstMFNG9!K<|gNT-sv5GIb711NTno@lV=WzBt-)@Xf-u*BJ;AI!UXf%q| zd&RAHJo*q3TxM{_G8w{Ct_0rRPvR_o)ikDOy+?SJihzc^6Iue{H5bB%`2<2K_5`uL z<%0O2oPVA#0pMFy&kEX*g~rh7!GPMjz)6Vuyt^$7BnJhDZ?pv`@aB&$@nsFj05x~2 z^(7E=VzwGbj!2Y7V`kSr;(@d_OctNU%@}aM9l~qA6WRhj4KWnR#RnB{vm5RRdYUr{yM)vE#D=9qJN0pYR5vH&@+8gd3ev_ljhJ4JVKU>PH_8B}mu}!cA@SJ{Lv<6dGfTW( z;_g;I;F=v5%*AQq6@fG`@tWCS=rjtyF@KO&>3;nX!e$gz3G3u{AS{4w(R}GOKQ(Q- zScsmp(Sp#k1&Z!~<8#m3uu{6nY5xWg`x5+W46cacF^i%vy>WxD(*GKyPhfk{8#V8w zX5Hkr+?cy?L76)N?P7f$xH^iKv$&VJq~Y3);9kZN4a4pE>zcw9nL$dqFLuycL4Q6$ zNE){Y;7L)PR^S^3d-tj;xEEjt;UFXX{yHHWnAFe&7Pr3)xyfENFX~P;o19>s>b_GI z=b-%^YVMWQ_xY?-RlkUvjNHme^AlJB=fr2|Vh10&EtHg1PH_qxupgkAS_XFQVL3I; zrS-^bhceM}n0g{LhGC-m?!XALJAZBY{n0{Yw=;d{Us-OkQqh%Qp{Pf!*s5mF$;vkF zYfIykl@Q%!y!V<^h*Mpl_B8%1pQRIEZzIiW(Ft%bW7^imo`So(G1Wtr=LZJ5K3OqX zhYkv8ZG4=^wR$z*l;mOF4j;u)seb7Y#)U$)+YnX>{sgKx?3D!kN`t-*U4O`dPkxxJ z_Gy;H?HVxl8?PpZREIAp?aXDL!m3FV=*ccMg_`(mR504Ks*KxCdp|3LU+e{=76dO< z*rRA^mX5hzGyT(q2qg6sBsiYjlPrO@uJXLKM8zS@3Y29na*a#22|782h;=3Y+}xCF zMHO@;%-i$(67Z3}_lnI#Uw=nGWCdNalNu2EK+taskHf}c1EC5iyu{#yJe-vhH;^fi zTiIJw;(^3|j>frz@3!;NPOs7@(TkEdP*%Cgot}v5tk&0W((sp_SB}dc83dC*YaJ#= zE9!4sn_A#fXD}G(GyCKL*Viu_Up@~npS8+QQboT&m5ndA(wEQ!f`7Zcp@i$JhBZ_I z*evj8M=|IFk1X2&2bb4^KGGNa4jam&FMRRIX?7ujUpZ*5MmOpl_lv)N1jk;`F0WJk zTfP3y2cx5dy~7U$w(YZ;XcoC?+s(vKM|uFmr+&8S^k6VXjWEAF8SXqas2 z^K#qWA27h~9Xf6MpnoxY2X`Z0>Ygn+krLROx^hiHfmhoX4m7;_&M@4YdUK9Zl2_Xq z3cS4fz7W`(x&nL0)pi6zMYp=qA@hB4#${r6ZtOQz4fYmrb63T#XpcEydEXvUqXD&L z6hpr0wZmV!z(w&sFfi#oXIvy62+*N}NwaNs0Y+fF_PU0RbAKWs73sr|uBsZOP-;=J zQPPc@hy=;@ArY#tl0X1=GkIkH`ViRF4tFMz0NzX_MZfPwCAC;7nFMhOoeu|xc+1T=eq|x}IA(ye*c$4Cby`aG zdoVO|2upHwmw)89VO5S{)l+}>2Mq$8z59aL@jN3>ma4$}D&O~vftVb^wn-}8875)R zJ^AkY=;>C`rHJ}`MEn491~GK-7AJx*!BFLW8Y)FhkL|G`$ZT!hl72p*f3kP%&&|`Y zpW%-GA&fidMhN@Hd&l6)HekTFachC&b-S=;TVQKO(tiSjgTEa;qRNWnCGE-^o?l~G zmStI%ZCPp+TJ|UFl3RunH#O|3xUR*2pxm;5(Q=~8b^f8!>-dGXi>dT)6-jlFw@aMj z_JvLg*C2PWpDS|!yQa7*{a#9lL>yJ`a@~HyAi#r2{UWfrUo~)v36#^|@gBYOtq0{{i-9s>cq?W;ZwdHgS*7%2N81y1< z7bEW0DvAYhwrLba>5CEf&^Lhe4+h597N@@@6R!4K%2iD^I!MAg~^v6eB{ zuRovxB#RLtQf?sm!}1q%{54Hrtf?*}4(7K7$|_%ZamLn+Sxzq`F~4el-pG6mqK>0; znGuf}PqlR7V^2W8$#C_XR~%)N@0cGSjekZ*C&$0)kn)o(X_ca2lywp$tOF}hH9tq` z$%G_LtxO`bTyo|6ax9bh0L|_Ydt)0%DYyIg%&}~9<64Ck1v4Vwmk+tlhWwZ2LZ)7< zoDG?3|2^{|6KU(uh)ihLmlK)Mg|i}4xtAB2tF4x^xE@2l4Gq4(rj{O%9hq7U=YL1m z0q&6@S#tNWlHvW09ZQ>?k3R?U^NFPa#RMi9`A&}CIT@ZFjE)Wt>n~3nLnrb5UyMIK zI(!#FAJLD~qxas&Upw^co#Fn6=tNCF-aS1boG-(VUt>x2Cvktd$qoF@z2O4vv3?^b zAPLN*pVh_ND|)BQaVfuqhn_!9-GAb<$Junw!6oSDIIX_ZpO1NIqYn|%t62y&OC57F zoTtuAhk(Nlp$Ml_b69a~<7Ki9huKxrs@sZ7Ldcav5xN|b;skVT&sV&h2!LHpSk0xf z)PYi=$TS7PFzUvB*A>1wvX}lS$rL%G6j$U$TQ;E5mA$Ao1V;PsA0B-2(SPA-GMr56 z(n0jx=^Xx)Mk)>CvM6pVn1C<5`dl16cLGwL@*WO^ZH+eGQ>QXqtng|;` zIPMs}%*#*MigYz?pUII@_io4P9RVEfcGOP#BtQoM> znS>(H$|t~^7hZon{&Z*S{eP433yf75@CcgUU33?H;8sR{I(+BhpL=6j@cB)Im>h1vzh<($lzs(L!(eBFK5uPd8X7tVX* zK{f_=NfBrGdmt)V1MTBE#xBR>*T$@`!~=CCqiyDm9FohV9KS@Q#D6l15|XNNnxXdM zl)aoTmr~&W_mnNQs)vv~wnOyLx#adV;-2JGPNzKNnB;tZJwXnZX^uOv{KA}Hq*D$) z&*G3o@7y6XQaqCt9Au0th6kStS62W(6NSsmr4@>b?)W!=Z@$aX|e(+PwM_c40%2u`bUe^&xz zS{Llrf0Tp!0V6(ZsTS9+>d~)oZjj$(B}RQ7=aiT1d4CK&|B7@g*z7{n(vc5y z@csrj>P4K2y@3Tvq}^uXA3tTdwJ20w^9szTJh}q%C9i@d`o{{FwjW^uD=)()LEBR0 z37)Gl97&Px=nyNlA_0Eiq-W0T#Q2?+v1=;Nuyw|0jY4|tv5$Qlb*z0yZF&8Ih4^B#tT% z_J)!L%A+VtDcAf<&`uiy6F6FH=^vA%t(pnX5v;foeO!X-jJ~7;rQt{8 zub=<&ov(2M{E%lnNaw}PEv5FmY04#&&AhD@@F3C!`hV4Jc!MoJH=O0AmuyIDMn=RI ztRo^MsYr{s@ zUHx`yPQs;|c~##8rura{>fp(#Y_j~Jzz%rU+!Hn1<&TMT+}Q97ez*CgmzLDZ?!D@m zdKlW|g@1}}hsccSsh}DjDF#nVkB%yep)#U!qq962g2JZJ>(s@p8FGY55hg)W&>)9L z*zi?;#Ea5T-hbiI`%p-w{6h;re&Llz??@s4z%qWp-|wv`6Npq1@#+x61(FaJmUjFo zaGJ<2(8Dh+-mjf@MfPoI{l0I5NfOw7B&~1H`F~cH{VVXIhci{W`A*=Uls2&WbY6hS zK{BYk>Nl-a5CG{r5S2z`Q}*ZD4BKA3*;nru-#+1M_3L7m^fRw`=sW`AW*QG3l!gT$ zwW2)_K?Cw*IYUD61gr3#g`k~pKILup@E}_JktEKBrv1g1#zA{Pw+vwuA#P(t*F$QJ zcz@BdIjJouKY6)t(kK#-0;z4YA7e4preXR9!GxQd54m+@Wd|Y&RoaJivn6MI`~J(H zmeAucQ(6*eg!gqF^PSuF{SxKOaghcvH3xhxDSjq(LY)E@y!4vZEmQ$e{hHRqZ{~Db zh)BT$;+5p3UaN*=oG@7m>A#-rqqY=^ZGZUXIx>(|z;y;_0>>SxoUnL{3s%K9%36(7 zp8nj;t3$jX7hMnV@_yJu$0p`3XL8icv0R7y>|mzPC=6V#x9eOWgK0Y^`QG7w9sL5c zpspxR)K$%uUwGrp2ffv4hUZ7;0)$xWl7aKJ$|qTJdUycu|4eOsht#+FJ0E?5FMm&d z1Fe9@9>7Nz#oGC)ab@FHSFK7S^xa&!PtdwXqYq}cSq^x_y3ie0ly8O%Q)rvJ>9 zk+2Jf(t3nRjeOc|o3;wJ=U2k7rkdyr1=B)M4)TLEh?bByNH32+^=d>Yqc37b)qRV&zNU^^p;HtJ=FeM+<;9jJHamw!lyH&Rx< zO`3c6tUHm9Rl<2Y8l(DkVyY_k@F?2Gl1nNjW(Nmz6_VsMcWJ4_(ffwECL@a(T$qC* zvYi4%@`D;k1W129A*bkE&({Ir?C1_=E0>P0)6-kGe(awd2+G>55!CWOiO9j;l7LJ6 zOvMEl%G$N(lBzSHH&;`d7JpfrKJ1~#mXH=1nXoj-fbsu@+3-)>6v27iQbg>PLO)7M zw1_S?J~=qqN&~Fp<&iJ^~m-+kZ48UYE_y(+MxDMk$u`i zp9EHAyMS+oj&>hrBIM}Jhkt-=#)AX|J7 z;0ad0KhITh(f_2B8}XeJyO@H2M5ReDY4i$oW*JMpm0_B6N>rJClue3$@eED7h9Zb} zO^hE~D8jlDP*AE1Au=-hnU!&HRBG~885lE%5lPp;0C4-*MA6EF!&|Tw_#Z_YmeGP* z=P6s(?&);M?>w{CBY)djeGS-m=9{Bhi=p+TR<9$KuYpOr0QD|8s`{P9@aSwGuSlQS zAD+H<@@sqkcW%1A^^kQv1xn>Th@4ZjVa)j^cFN9Q^1OrVJ@fc*G#b7K4;&_W#UVWD ziNakq%WeQ^--9^p5jARAqFR6oA6I(a#d}`2?Oy_ zk%FiH(Uf@YPV^_VIc+&f_|FObR}BQ5PP=5JxaIhj%RkF7psDyvCpg%MP%QXLlQ>qP+kTV7SJACC2Uj3m@m#1yIBs8_m+$90UHoL_w5T($v0) z2JrsoD4Lg-z<;CbJ7*j8Lry1+d6m>x;kRsRjCqYj9|7QCMdlekD7mfN&+vYyFc45%MD zgzw+Hk7P=G0Lom@re2GV9fX8edsXq47`MMf7QI$GWX^Kj3O4i-dAV5;B&Z`tS- zBNslgiho{^+#>XgIV^3&&7q2$e2tr&i5>bJJ%)v%I_0U^w2|-6s(1KTP*B8yD zQUoGo)soT4t~p^KiJPG8BgCF_-V0IHXWZY~>x7doqrcy_(`;W>MINsLtm-q4VPW-8 zrykCoCD~K;6~g72*k9h($wc`R{Xv}Jj}BJ~j?fw`fl1)E=v!O-E9xCBp%L=HU`wxWifYyt_28R1 zeZIq2+|P*>sKKE}u zkMx-ga#j)EGWzga{J-$+J(KnqzP+#6wSUx8dnUU3slAb`q|xc~&|`aBdri;n8Ckyv z_uRd;Ke*>!ukFD-QyG46&*g!~@Lag;V|ZrbL!QHPyW!{X%KrY(;h8G_l+IzyN{E+^ z2PFHfQpNw&d0U{Z*eCPyx&6s}a6NkJNv?+WfAgg~mu$qXPs+Kl=W|K!=O6J>l7Gnv z9uaWEftQk8xYAq6MFtXlJV-By_>cO$Fu%~NN#jx|G&}oV{$L()DdDj;VqR`BMElDv zE>kS_h9Gf1?>R7fOl^?sLA3K#`~npd?~e85l?$y-){I_zB-^y2v>$aZZC_= zna+0PUH4e8udEo$60fw}*@R1;MSl@(_Tjqk&)G(#4Txvr<}tbjUV`!OBuw9Qu(iJM zTPV^ZVJH>$WNJ&MZ>{(U4rLkjMt58?h&YU_N0q0MlEjj3nC7r=MTe7T>N~`ZR!PNWE$GIO1{&h^W{u4~z+#t{!zQ~9OSjGb zDB0OW%A^MA(Xis{*~Dk@phn&je-TtM0s3>;a`Mnq|Q)Er8Top6rjNV)Ln#Oh^$v$stA2Ivxb$c z#<$R=TN={{%!(CvHHyV(L)9tUp|= z!>L9&S2g6>Tm43e=2-ZRT5P&o7+H{&rr=`t0Z7?~WU?{lnwK z)6WA}WDt`oD}V2vse%6VeK_H$iKwS6+g@_iSJeBs^j5E}JhGSCxz}}j-CQwf_th1{ zh4=RYvFznlZAnP=ZcBnB!3?^wBINthR)pYdJAmdQJ%QFKR2S(gCmo?9Q~AMDYxRRX zMQN5i_xqj;r4Xk5JxfnuVe~s^^@CPxX(Nc_{!=&%ihoh#*>LW}N1%bPvlrN-Z+C0! z^9(PQUyLZAfcKdaBP@PG^{uVp1f23|VE7st_9uLpB7V5Ajma~9byUS9ksKsIEUf*} zr?iVEcS5LY&`?kT-Ve42Zr_w#g8Vi>~g8;W|DY;CE`KmFx9>2wOMAKier zz}JH$`F{!{xd5`1?C!5d`zNPI$M1c0kf)E54?cd6_YmGmqv(ofYIso+>7v)wD&4Mn z_8V$&qMp7yP`Yb^BbeyL4Rjj!Yj?P7JD<~YGj^mTap3^*VvLFcy<)F*^s@xzaL10W z+&SqGYR@f)E2%^h}l zn$2e=`n#myuFH^0U&1(#v&+=OiIs1&X$nG}Q8m71V)UA`t418<-2I}o*ky(M2FD1{ zz|he{g~=TlM0s^XdRRv>M)YMSOk21X&+tUz9EgA)m}>4i$D^tgB~_NH64f$MBdS~j zTYtvd6Bu{`yvkAtNK|_51O9AU%}aLu5JK3e10xsR-blFYD|S@@m5HjYHNXD6Mq8-`XnV=vs0 zO6(s3>8eu{7YCV;6FEL(ShP3Wz9JFJRR!5(Jt^Bb3UW(mQH2L1N#6P1X*stRp-Rf zb^aY4{ZO7b)M7N%?>Mz;wIa74z0_d$2_9_|3xPv+epN!$)>Z{mAe(G$kub||m>|(e z>{0xpHL8sHa4Slllmn}AR?(^+RDbnI^j^-XTU$DKX%TPKKbat7xS8>{X6n{T7a4zQ8 zz$l6wLkZGnEPK55kvXM1I)K%p#N@j$7y3#P;Orf7$M*>Y1WtL4kyx7= zT7jZ&y>o<`_8NbH@$`--;567#_O8&549H8 zr$4v(4+Usp+})9R${&!0CACR!>Ey;#Xwf!D0H>s;H^m%rO3I`Q*+ocwzQ;J9SCx-a zEnUFo>ZvkAEsUBffnW3(i`|cK0%G&lBnIq&@Jnf^&=x>UB7dJz6fqu@{h^cZ z^%Fjk0rfM_V#zpMF#PKm%H7H*sunRn8|e!hf@Z*7Q*!AB?R^I*Y6F z^}%*sL0XY@zhA|dsiKN4-viSU$Y*Z4^VBtm5aJXlQ>M|VCR59ZaTq~Eb@M95%YL^w zSFV5!C-h`roJ;m(&w~c$kfpvW#N{ce+BDZ4~qD3;C`AI=Al$E z7No1kOr%#)^nafRv`F=-!S&8VcOVB8xWZg+Y+zyZ%=Y#ps2xW;+pQDS@_x|biziR6b*h3nGH8Fk;h!LK<*e=aGU!#RUnl{|rmLzGuNbdD&RIU_G4j z`d5-XF&>#-F#Td8O56|B+)ks*0!La8@90$%*g-esjDJKcY@!Zs>c5by(Tr`URqg8| zcLUyVu%!1MRu~AYn_d##g%Ff7q3W40!1L*hQtif(INK=y85H^fw9tpRo?Un3 z)aMPH*_E~Km~`bN=RozSNjc(yocEaRSsK~xSu{xD{aAjD$AX)UnHgoA!nc~2pev_x zHdYfQz5I5L-b9ED>?{fz6k%ZGS;6beOe9Cj9)iz|D%#NBL3nNFAzq zJ(i#g0wmN!C-Gb|2c%okj>OZjeQR>|)y?Q*x7-p}pFmJ+8U)p4csDdKm{vSJowOA7 zVClZ#+NTC;f<5*M-asFeexJ!&8QI2FV1FKIofeks-cZI(+4}lo4J_uf+xbinSrU6= zAm0H$uU1}UGIZT4gzih@(lB5>FKM## zVRectL@rkqZ^F=&Z+-REh(5mulvQ7S1$V+Nt{uVdI(x`NfVho#WLhgpNmHWUa8;m&>#;MDCBAt_D7(B^>M>mv$JolB>|NsEoMz|Zi=)yGEb8IC3|8h=RxKAlf;bXF5hP}%r6+F$N)^2q733tEL66J26O zN;+n`RNK}CBAX~jjb4EH5a5~e!m26>M(}<!0_~1 z{E4O$EQxZcP<3p=MDa_oviAIu@x)eG;WWijnn;Y(P5D)0gPdT=$H-R{2lBIu3zO_gLR zxR@p7{KcCLW1A(nSGRA^_g;E^=Z#H8h#j*iqsY}0LvmR3x?~&}fk0#cKGlk&1KOVg zp&ysUCHNcPKr6miq<>fi#`94=`ks$G7x~LYo`C?>$qUd!1Oub+DGVzbxnYrMht>;+ zQlWdKY{G{p;^wTrl;~xb$XyCLPI9yI{K9%pa@j__D51#9+w_}>;~Y=oTFLg=SzT|T zNTNNc!1$vG;tV40(@dXO?9dlX-@u>RaLECXL4}7{=He22W$yLlhz46b#EQl5@sZiWu;!pE|+=!w^v8=Pk&E_ZEY-*x?Iz-G}so=CU=`A zkCS!B8tem(_@KqU#eE-0eOev{0J61QJB^oWc7&D-+Dh zwLv%=b>T}#9bRG&@lxQEX;0{nvXpOrM2_^u;mkR#(g8SuA%m|*^ZDuFqR58P&Sv&% zUDOL-u{(YQ;>%#12!^sX@?2lryyy5{Pp{sk*?*gq{2jB(`0XmRx3osAX4tXRVkzw{ z3&z7iY2(w}##31=V8crRci+=zvH>gTOR4vDU9nSk_#mKKi~Rf*1JuoS?qM6}*Uxf% zaN2XSvJXffb~EIP6P7ElXUa0J9+Q>dZT2uy*A-%?0ZXz1 z2K1PoZG9=VI4MR4Od^O)BfTmuw^DUGC9=S&*s@4gSz5wS=NB|@)SZxpTIT}kI5uTa zs=0DWP3yGMcs$bR|585fFS|UFE#kX&x$U*~uHd}@{t^8KX%Qm%WO{OOL4VO0%egM5 zft&Rt>dVUJ=`lCs^2RBS_PG3>Sq2oYl?#nLc`ZFSx^O78aXGvW5Ty?owk2)VKXLHn zY(F%B3bO7&?9G#9hElo{8cqdS+mMpB7OyVPdhUCW_vei`X|%w2E5IK%+7D#cGQvO| z35bFMJX8>_*sf32*Wc?Ej(;O}xm()*ba{Yft6dzleC^V(W}Yo06wsY^nb7jyBEb$~ zeUI#y8Wp*%^~Ylp33#(n{B;?5r>< ze|#_d4dSAceTQ<#wQ2wCS17r-ZU0T5nsjRUdPlB~1Gs(S2n-a%s(;N(0Y2V=7L^!P z?5(8HvhMX)SZaY#ss=8FuJk*f_Z*mewmtv9o6&bOOUX!kf2_P%IT2%FsX-68lmwbL z!Vm!23)Bq=i5^O_FPn@A1`y}NKsX@n-v0&e@2KuUI!jx6e+F%`E6BTW%ED>&1>Er< zdDncElsfVWGJFp)k$;Bd?rcBT6=-{`D}YQy3#b;D3JjA~=N6nk`GD#Wx~P}PD`5{- zM$Tf^?>>6WLEb{Td~T_r(J^EFKou+wKaQqm=f`A7${og|f6|=7rc<#JY%(a}fU-z4 z%IZr+ZIb$uk0WT>>pB-mUdfcFGiZ)9sEmH~@GL9f~yevqP zgsF+zh|v?$E+F)v>IYbFjr#%PTi2=|s66;$U;zi_q283iftwN=t6ncl8m`QAW1?8@ z?f939p1IYhUd@O5>VmTB>^3ydKYOxCHs0HvkhKb326iF!%T)R-Ehzw!RMDhfkz`m4 zqA*j9rb}n5zJJQm-&9*2d6|N~s32>1J30N>5bbq?JRiNX-5=wEk{+lP_Icj%wdCgA zs8!5!l!{G};IED6YIA0yrU_ppAh7@F;LCnY{hDxtH5EeRK`ZT1v@sBxu=Wx>;70SC zrpdUOzyQd5Zi!sN2|PApx8)uEvAHYTRx@zBG!fCY(|@cf8yoQN{>kto3R8Xd@!|3C zqw(kP5tFIC@XB_4zcdn()wvyeFFNk8DNs-`2q(**;m?BB&LM3f$+jG@0N9ukb)tHu zQ#YtxL4WK~BdAUK)U}3^{OnOvZ5R4uA6n5iRcj~e0Cy}QX-B{Gs_T%bA9|QS3w`&N zw*%aYwttgXICp#>4c%B`-i#hm)s+<7ZuHsk^cV#3X*giPD@_U?n@{I>)F3gH-#s0| z3%&iLgF`%Ulnl@HH0FJ!gy5xcyVR2HBsUjR3*vCFfAY!cIC?xh9Ul!pIy@lU2S=mF zN23w^sxNHwMXbc9qpzl)qyaqJxfS3il3LUfnxx?ke&~_^wsMt?@y2?Xp@FQq zbI2F#m8QXTjBA?anHbkF(p#^oA;|vP%LF4XlW&k{Pg%RsSAX^=Gt{@U%$gs6hrY?i6;h9`?8)S7Oq( zD}Bk2Q*mYY;sy_wG1d=1v|pq|$jfr6Ds}e(6Avo6qN2hhO zNEOdrA;jg_I_7R&LC|vz`Gw%ElYiU?h`Z&6gkEq%8cp3lLzo%ZdI@#01QS?y7>T64dGO{1(I|(Be zI+yh5-&CY?f3B;TwHCL?O0<{CL+}-BkKXfsp~jX2Uo^GK&UX#--OPBoqLN9kK(Few zrvdGEep*k4WoCY)d+YYe&VO(E*|s{F+PD7_!?m%O>o=3h)16`kJVT)ZFbQcyzgyBCuj7;iX=p9)K8h7tG(2p zv$ant0|mj1<~KKKd1r8)?Vmh;JUl)K;FKyQVR1sS@!k_g5vhxXJAVncM&s!=$%oT% z1AmavgKU<W{ygO@A8&%p=~CQ-uAF_Dt({y~)|wuthAdTE`XyD(M;{HBGtR`S^(S zR>v#TYaG7=T}aLCQERzHuBBsilr|hSCCXF3#B$XZTE6;4p^8D?DumAnTdZvGON9x3 ziREz+qyxRrXR8$;k~4xBb5JGPgHr$=1_dysIusU#y|z?ww|`LdtpTFQESSY6V`X9W ztM<^aRzdCMC}_Iz$-xO+trg{Wb)^4&&aegTNAJup1*|cTgay0K@DDb70JFbZ!x_zm zH^h2SJkkn*ziq$$sq0^H8}58*bZN8_!BE1 zV!ylkN#PBNzkfOleq*wXFJ~>2#i%O}Qb1I1DTtO^?Pbx}DPwe*g`;mCkcZHlHde`5 zXm8^93QvJoojRV9`+v8Fe<|I@rJ6c8l}y-laZnXE z8ReC^e;cW*)@J)ny(QvnZeE_2S67r`W?GatlqF$WNK%v-^1c8)&s_t-Sp|Qhye2=U zcZs@yFbn#3QMxAQKNE&$LfG40*JQNC z?&tb~VSgyk-!6+8;)vye+e|y8mkM>IBf}dfA{~+99>I6rGGB6MbV46S!ZNnsi4zKB`ww!3{SV6K0feF8zeQ3Q} zoi3IVCloM`*1Fr>+uPgQ+q>Jl6Feu`k9h=9o`>|3%646<7muBdN&-Twai~Kx2N5(` z!++x(n!ZB`qCWd@s*hjf14WSQfbGp^r;xC@1XDX?-FD!pK4# zl@i(x*{BuNr#80EFXk$}YPYy8lP=W#_D8JQG?iZ{(JUUt86HJs(^OD%Eru9B!#0}= zI#?}uCaz5@Zu_qZ)Az{7&ap%)eT@#18-J9Hk?>R47H`K5VRvinbZ!k&FGa4kvk8qb z{e2wq?cjQw>O}w8C{oSPe`+>VNbK&WN;0+QD+OE`w+NIcMY{jEej?!oT}D(tlatpd zxn8as4j(QmwNs#N1snDBh*%g%L>I=VZj~TIPT!~~RnK4I17Fr!T?TI^?TvWTuYY-b_%Iztg9_tk!a-~`S8_m*j$a6SF)y6la?L68$ z(t|2=PUYRro>_0Y#zIlg`uaDR4NIl{oyls*w)rd%D$PCO#YjFE7g7J6gBRW<-*n`< zT?0e1Y-?T!X{(mh%CcO;vfS>NHGd&>yQ>jvrBJVcLM>~k!gb(X9;n`Zg@-Aru68Gy z-N}pF?%b|HKWo>=Dn-!|*T%{R)wwmLy9_{ACNeq%8m_mSayu z&7%SEKLjh!_s;z%whZPzbbphXYI#Ul#wzPgXROy*W4-GYR+u+5oU$%)?%>QGOw%oU z7Ezf;*uomjRh?y3Lx2E1{F`LaA)8tRUESgw_TRVEy5vsZW|``yUB3My)g3NTt@`@H zzFuCJ`j_?dyIQMS+~HPhR*UtoZtd!>MwZ)H&#IgqJIbQL%OKd=XMO_EY@gh>2Ie3z>pgdLz z)sC_ucn4O^arMhjLYw3?nx2G%I2m_?u3H}<<(9b?tjp7-(O5J}#8vKjGUm$i z(yNoEo7St5os-n7m6V$nTnejdsoHI9m?|*xf=*!5Z$PSHmvDddpt?uY=!}bQN7|hjkR4J zD@wV>3K=d<-j)I`d53SMW&d6+!>PGR(wU7p4A|g7kebbco!!HugZ&@O=Aa!MZXpnH zDO&~H{r*#q619KYb={;oKZyv|dP!}3CZh6BdQ5M;-h9`$#4@9`pQN-S(rCs4&HnH7 zgxVa$xsw5k#M*v%lHF;C;H~UX|35~i+w^~mV2A&PR;~1@kv>g^x9{iZHg(y^zp6ft z9s1mNSq0f#F-xkPL1o^up`bFZVJ4Q) z^I!2k@3DMdL+Rc|^YA1dywrg92>$;uoy0jm@TwKCKkh%>ef~xNaMw@IL(4rduTbz< z_V@AN!QKQvx)tk-IjF94gLz|GVjr>1YN!Ly;Jm-JS3EqD^A%i;CS+b3N1uX1x?Q2Wx zx*Xej4a<6CySmUB<*?Lc8`ZlpsVxj@aI1dkwQTGiS=g%WY2l@II(KVvTLemz-D?s# zZBOKaG~i*tIGCj8*hMM+Xb=tH7aK^Plu^{ac8SnXpw~>#lRPeTRGz-&gPOP$`5UlL z>oR{qB=nAB0DK96d^G@&uuo&1$e~|`Hzjg>VUqKe02x%^Hz*N+E6c8VXret- z1;i}1KNM|_d2Y52Ql~I=d;@kk!(R9 zESm@#!7>kZFQy()jyzK{KP;5nC-SgzW<-DCj#&*WXB0j2TFKB*2#VEd{W76>oNHO3 zsT!C{Y;yr>Z;c2%v8iq2JGBy_0ftJp3-mOEOw6Z009H{n2-Y83YoRq}yG|KUZ3=}D zhe|lw+v&}JBN6qeoJy%frHx~8#YkFxpboC(>C=?XB^T2BU|3FaV`OR?ec^F#%|L$v z)a8lV`?Cz9$WF%${8jNo{q=SnQsG&AD52&$fm#XuY2Z1ngraqmUu6V0q{&oR0X5Y# zzPZXq6y(L-5qA42H11pZ)>}hxnyj|TTW}ltc(kJ!4sivkQF1pa46A9?U{&iAdpufe zCttJO-AJc^tMLkg8cPH zXM=pbF}g+)A~$!@NNMR1sf$G-XwCWyAJ(1=_BsQ9P?3`Pw3wQX1g`H01de}nZGyqK zIag1K_0y~MHI73NEXj3{A{5Ni@9LB75U8TQb7ulv-jdto)F+en>@y zxV4j5{SwoHIuxj|_}r!1fTn-s8-dlBwO|9RS{MEw5bSWR)2rdHcNNd57!577L&PzS z%__3cRGLrRo=|RuN?}DC6}aqqTQj?Q4BWihQ?{>w!Ul~Huq1-~S4E+Exiu~~Vp4?Jy@r+H8pf$ReOICiwF0k zdMqRUsoR!$F{CsOry$}&m+|$3I}XJ`b$*^~kfN8f)2#dj#O(TU6L#H8nixwW?gUdm z?Ha69xYfQ?xzb9G22#Tz2Lpg-hyyza8n@Gm^=~34|4Z+@GrkVC%x<+bLfPD zC3|#2cIDEoT)LG@cLOJ8<Kw{rRS-{a!>;mYHe560T} zg>aR2TL^!T?YR(0TKUy>R$=Qwj#lwL&_Cg+!kNEiFFf|gf{}}l>Re&3>+y@Pv0wRv zD}Qk15B?+m;K~zh?mMkK!IdZYpIG7xUO~61#)&zk7liRn0Z^Bh-Msi-Q@3TpN!X<% zmjgpeITCg%;TpWHjE_})%t=K;XLECl{_9Y>2HAg49;LG^cg`Yo-r9T+jygTQd3H2T z)2u6{zVqG(o11HEMFEp1$)qLz2b-V)T`qb310W@|5TYF|AXLx+rjRVNLsYE<7%U7s zTb(dODEUo=);;yMe-;C&sCZTb?raD~U=xFB3hhJjP1g$YEbd|fayE#`#hal@($9h! z;AMXjpI^a=L`fZ^wtfZW1mA;~9$$pPV|@F=#!@Mr7coR^!R-pulez9661@&r&0G%{ zY>NsP7n_vIfxh7)Y$5A(iq4FIgJkC zUvDfSo#j)y7bStG?ZS>3iIlE- zQyrLOOJvjGAWP1sXl=){h-scgIp}{7Qj8~Zz5s0vbn)~YRianwWv37-3UPsuj~vYM zco>Gl0x=*4m`ZoTnE0(JwX!(Tj*10Y-gW~*nZZX>5h=O`dLEU7do6zrqU|MQ zJ1x^GKH8HpLT`$0`mwLQo1lB7aScLs(r8b{k%oir^*7vcxbZ!KbM5byl)6{e(OyLX zdvzMstI-ZgyQPZ*H#TUj0t*{W!3re<81=~G<)$XlK~NrSf&-`mun7X#V188Nz)O38;h4{B#G@Bo3PZ`h z-^0Hwj&*<+;@l53`d$ze2eN(Tluc}~xExA!%w!WB_4AsSQ=@Kea0=yUQw}oNmN$?< zLmZY{yZSIryZSIryZV1HPSg5S^eu0qZ%Kdg2Ju;)p!fK^Eoo9CnHieUHb<5I>?M z19y6Y&z|hzhHst*XIYHzr{|g%jI#6;oF#NeaS;i~(7VD^Lg9aO(ku~J!Q#F<5Bc(s4%3AE){rtu_x_z-V>7{ADpT!mQ7>H_2}AlB?0Kq}_UiKlp2FVG6@ z;S8G+p(wm{m?u4QHMNwjXA562b9g;<(8qR+A_V8s)k5zvUV(9F|@hF;&@zHK<8Nu%X z?kq3vhJ8OcO(rvF5Igx1!By5-(aR(qrSfwYAft-v_Cf2@jJDAW8oUbnXKDdNa zd#w~iK{|g1p1|9#+Mh0kSkcT@D z4=cewR5<;~I|I~<*+BC8p}7g#S?ds`CknE7!&M@S6NWV!{=BF?Z`hSf@458W${M=> zmh^v?RHzIn2eom?E~jrL`7TNjx`^l))am#bgcA|N;V>pk2crkGT0%y)n6D$`t5eF- z8>c%x!v}XO^#>eP`20_9AdPy*KQ8ZHIp$@HjN$inRl_XneK%j^yjnF7u3M(iGvpk_ z@Pk^tF!hmECu3@~skDs3Enh+dQgSu<{?30spe0~npgE3lzfQsRc;USfau$`YZh; z0oSz%w!hlEQU|pe*li@mYqU+iRfl;rslr$T?HJ?+vZ1LAb%%T8RqXVS`T>1o@M)c3 z_9v80&PP{4?I!x4no)jI*HOtiR0w}}Wk4ILZsNqJ9ZG0bwGQrj1lj1h6e;}%Br(N9 zmh!Gg8WTK}&8;Ig7qe=e%w4=~Cq6uxO^50EBoNn;fcnGXmuXg%8?3b^I*qdF>})wC zA?$5AguYG2DXhmwLm{VwMH@0Vr$7idBXM|=TB%?H5~w(BQ+$>ajcmjVH9>!jz(G0~ z%rcpuVmgdIGa8YPQ=D3-057^JHyLN~X$rH3X6p#XG82PTa-Bg|35eCPMwrvY_@YaL z7B%Vk0`j&btTAK!)6;*%nh;9=j)}^BO zbQAXiw|Y{LF2O(*WMVMOGNAq#>|yaH-QEsgi1k`+7UV(uf;$OB_Ht|)ei1J3R+~(0 zX=wq8{k))CU#j|b7-9J`y69b5!TOr@q@5_6;kh+Kru_VHx4%=+)ILlzyZY51DWc-! z_M~A#c9L;LaWj0^ndpBznmU!q@JU2V|A)_M{CWOp@5o(i))t#9agy_TY?Q~QveW@? zNjJe?D7t794NXRlE=bct-VO98_=_iDOw3OC9w#Gw>b+NMIbi)4_m6vl$(4O}K&82C z=N(0N05-d8SV5V1`{@LqTt!29*C|RN+AW!#@cm{EmGVK4#@c_%g8b7Vrs}G*V4bPj zW;{Bcwr)niSw=Go8QYAS>1jm;Xwr%TW?NA+m(YqpWqGX##2U6@X{-bnAG!9fG)_~@ zu6n5QUAtmuW(~_^XFv~K&ne6zZ@8V0>}w}dpMN!_(Cn4N&bSvHCW6hUz@KOKq z3I_>osQlOFwf3F9kfr&CTb}e3sksaA2}Ep3`S!V1UVH6S%v-j{Tc)FU;#N{V@-L zY9l;dSE_zG;ZHBPhBYA(HbMVvnhUB#88LZJ^|I*B0R(rBe*n z;-lixi@aL{6aKyyynQvq#X^Wb*3>L``S^cC<01rB1}!^b5g->zCq_7Af4CWZ;>?e( z*^zjEg|=K^ONhdKCl{w_7T4K>b8Gv zV2Ph~>(UF?Wf#)K9g@h+9QcsJg^N>LTkGpT#QFMq@J{dqLUt23xxZKXcr-hWCh+|< zrB9lQ!YAC!1>ZnBAn$yAoqQ_Zl%u;3cw=yQ0YP8M0G~#|N?oM0EI2K$O9|K40aqxz z`O_C5+c*pM(76864a1+m&Ehya#zaMRN_%5PT2&mlAXSB0h$gaYS>@$bAN z%||lks&KfYEf6SyS#E?QbqKn7TzFrwOqKv) zhy_Cl!_+$&MpG6s)`D;!C#Tq3yV40lO1NCBYgp1xG=drGB=D(hqOyM^IhO(2r)+ca zqJP9W(&dUk1%&M$`d5@=g(~>)g%onp;CH31_yU6{8&*_-SP*fs1d*}lq=R5zM#=Bb z=fopWkYfZKNr%%4FyqoFdm}Vu&{`7;iG^MqQ>j+9nF+m(0SZ7UTRH*tFrV_~Edcug zmu2nbnm$U;@iaw`I*5ORfa=;GCsA%NQK_i>9w86_mC6-oo8@7QOXcMm1|Owp7zvzz zg2WLN|Kbv7Sw*^(nJO^ba2ptC|5u*%4{-Hq!0JQh8?uY8ypN|5? z0MG|xG#i}s_y|sUe43yZvQoQ+P*5s@0f6>(9bowcS~#!F9)+tWr+AvD=uuLGFLuA& zKiI|2#_}~oZ-js21#DzhhFfE_ATI}^12Wb_mY_^`SLww_1kpk`)@pXs0MA`yjRfI3rVfiEaZpg5()Z)zISqb-iH* zV_=p~k?0BAUgn)$Rnm`KMocgRbR^H#PW`^|SS~OsVFVGoAL&T+8EeeY>T6=HD1(j8 z7-$YJjH`c&1)JWen#jc1|0O@LT4J6Sg_0-1sp#$G>gvLNgt-_5hzJ+ZG_XM+o}>5` zA;mOG*C%@o_5ulzNkCTuCnAMK2HHReT#V#w9Fx&Au9=FCJssMRi22H-$q=(f$?+_U z*s5?ep_K*c1#_t0oLXxNeX&IO@(kM zqXB;u!vUe)PH*PCMzLJCwTJR;Sms%0JVII zV~)_oD3IXIH{Yxm2sz~_2=UjadS8|8xuP@BI?$NWl$~wzMiahZ#(?SE)^=x?g#$oM zPm@351K9YCiI;g2O9az#0l@XTC+t{9NhW`+(kXTxhOulQAj`yyif6Oya-bHw0C4Pz zy7Y-!7D&&CNClf<;xY7&c*w4w##L$&qJN=Bk-wWfV$43!18~5 z4H2KgfWp#`H*#J3(KF*0v{fR?cLM${SrYKaL3zi~e7cR?))C*I6ak`_$ag)2p19b7 z6Bn0@wC3A1rvch(4fmrn$P@2ThH36hx*($_CIVBIMZ;tUh5_iTulH!UC%NrI56Fn; zJzCIWxSme@&u|-&Nb4lHcr-X)R0V(938>*8z%dJ0E)1a5fy+tqo7Z3wYZUt6vZk|q z(9!96j76aR7o&}XD+?V7lx04Q!M_1OcCL9;lns9ftpmr3Lbt_=5&JwTcoD%lecZkn zMLKtOJJjAjtHKeinlh{XyIvfoM{R$}tF!Q) zI17Sk-2|Qei4c?fsCR)ZRU_^4slgLEDhx34zJPdwFXDB5c&^@&27#Gk-QF%eqGlZC?>^u=@ z4v8ofVS_x6vluOVJihSN=u3YvIJm>C6*A)=*`p{x2yk9gTsw=VV4u6_#OtzMO~XfQ z!o<|Th`zRfhX)IJcyJXDwtN~`WIy@JlK*D!SeqLsVxRdJrUzV79MkrAb|}!h7U%#i z)0W4s+ zb4bf7DlWk-Du!{#Y;AvTd(81U9)t0cbKmmGg`u4VrKcz!`g6R@9HcW`iI?A_X@rX8 zSUp}~<^w%+{G41aa4?MdAzje3=526de8n6=y$Z=2h-@kZDIz{5OQE@hkjz5mAP58Q zRBl%a5z^Q+g=R4^3{d*&DbKV3Gd(Ik+=oxZgBRBOc&^#UiJ^b_BmVt@jK?5>_2g5X zJ0Z4elN1r|ZQ(fHH~T-uEl|~Dm#92p3}W~RhLv>6V^DLXhJvzH={lqH3xQ_;t2x{4Ln0eNOQBkP z!{lOkvrKn#J_2XCqiMm>91T5GZm(Olu#&a7iZu0&^~GznfHk@I4b z5pIiQdzY(uOyCW;KIJ>pV0Sdci`!UOO;Ih^lx(KRn|OB6C11%Y?xIExLF`EYyKBx9 zw=o5_*g#=m*f1tW)azRqF)?zYHYpxv)BU*|aIk-e#XJKeINR)&15fD5tBzCbA-Ik@C9yM6*7bfNJ)lUp`c@o^l^sVH@1uCI%l*N4F) zoEdAU;IkX?G^@5awkPO7A!mLzi>kYU`aakLT*>31Iseik5`|5#uI;G`*a*L=Wxwj& zV8DMF>ml4A;`#>+tfSBurBZ#ev-BiSeE@JjTnukf&oM43Fi8cV=-Rm}bI`LNr=;e!}S{ zrTsuLLXn-oF=e4Q0}E_{f=w8R#j*52!f$_Ur>BX^4Wmg4Q0+ell_7=tXqr%1d>=0s zDWQ_N6GBv-i#~fE+K0Mm(Uk2UFc+mn$r^BKTgSQjo%=lw~ofy<>GpI9g0x6u)uuANnFsDg)>M~3hIB! zLhdGY`JwQPW!@Ks)3eEv%zHIYw`MM>&?;jYo>*4RGXXSqA7n%4o{Z~5>j^IYtW%nYa}lL(cgm= zxEoffE`CKGMCC)+Bi}CtL5R-B4MU*HQt4uKV?Q3&EXCPj!{Fj#IXXh_;v#=!_;m0v z$TT#zHyaf`ud#V}Q32WoNwIzo$inGG$*sCRQoCJ|+M%9yx*%0n{iBgWm?c}_Ut2M& z)&IMp$L89y1^>7Oioq%zb%87BLD01;UH-f6oosI6#lH~ZllW%>PNs}-`Hin@92pQ@ zP}_@cjXNPj7t$rXeTXm+IA4FHUANML#%Jt^sok`ra ze{l8C&(1$QIX&YL(Uarz)1!xdl&=je{K8-VhZ zl-}gyB&K62@weW=$UPpbpz*xAL-BPc9D_7(gsomAcs!V^y^W#UTB?zLy}5aalz4Wt zx%tiD>3sgI*nQ;{Kx%PaL`e)hALWZz*xxsL_Vn4ii@ojb?N{H}9)>t5JYikMG_FVJ z$O9e8MTwkQP#LFDiVA-=j4a{y>6wQHlJUb2ie|z9GTX z()S_co`GI<(1#)T>#AoVxNMRppvy0xgs6Pf=k{D)^;RRVPq&V|e}ICIg>zFWh{Dws zbbnaYoEXBk*Nu(1jF+1E2_vUUl9j>b5epn2ch&=9IvkHu>6lbb$x3fd-mAhdi>Og0WaEgbh<>aOes zdSD9zcg~dsL=*&vHsZq#6yOVad0M3j1^cuG524`!;p6@D6S%*I^Jn&qt{s!vRZP(W zj48Te&4De5We9&JcXsjc@ZzI=cz9xuC#`&8;^ATN(f;VQt@lp%Klya@0bAP-l1VZv z5`1P(5zu$zW{Cx|LEkp`(Fp4%&24^+^AtHl9S6%~m!i;{4^H9-&F`V8Hqo7;E&IQXK|oDc8-4`SiEV42xM*I^ z4PUi|$RMn^Wj`;ompo_xVT+F5@Jd`uHnHBM#*v83$n2nomoO<>`c=<~mOZP;Z0`Ay zcn|6tv*uhG$VfeqP8yU5x1m~V1w11?HKuO^qOb#t0brq!HJG8Eh!$sFaA9#(8kK@DXWv5vuH2M z_r-LYmu}aBThROuVEOPyUO@`+c5m5I`NlbS)mMq!1;;<9*Nf{euH8`9z-5ldx6<1l z^caD4Q4m*g3tYXiJ=1xXu*ujc${cts5t}w-Z=NxrT1TIg=d-t)_W>TED^bD;3IyU5 zO*wxha!*ZbmGC?9t>)Xhv-)VozR5Wbg4O>ZUD;tXg-(HdOK!1#n{tEdaAMO!sn>Cg z&{EMw<^*nL@L4<)N})*6M$DKtSux4W~9(Nizs#>fw^s)ngVG0#I&8Ge7>fYN0)U(cIPBS%-VF^4#^ODeBi_8Tu( zQG9dkJap-d+vX|z7q=nRlOc3{C~~Nk!w2?gvK?fTDix#P0Hi+4 z^sJ;WOdR_0CG$(bSt=r4Py>1aSG9l31OsN=f$)m1ytk9sbkECobc&~dC^}Ayvo$|* zEl#wQ{f-GMw{-=Pm8dZDcCF9%D3utpBwvams8J*!5b7W_uHq(n7ql zxqI>IrYYp(4(nDXn@Cvtl^5Ca=v5>PSL!w8Wl+EKPDekvr*bwY&pxp5akGD(%uvAi z`p~_n|2{)=qBL(JD>8<}v~#<{OW%q+v^sFIen2Zqm2(Ly21eqG!+GXXUgR z0&}I$3S21~PmNBxsMrGT%_zi|xMo?Lz?y)aWlJ1M^^_gU!r(M(f*}u$2~_a<(Q5ov zmoc@VN$n`2oI|&;)ZLuCg%p3fGD4tdjnwSEyPqDdrUOj7#$5VfPt>4Ak_$>}3fzuE^ zCzmPg`$d`TOY>W9Zc4re8J3Z@8p_TJM3G4Kq6CR_=aZ!jMVHMVa%B)yGzZ?!(N?Nd zW*#rOc@XSv0Zl>f1j7(^2He-dkNnjz0G^dPd%zOZifWx15#1=xb;LQ z8&(D3k)h64a2t}yOG(z<|mc;S2C!E)WlpeT#Mcuy&}oaQ?*~_T5Pkk zwY62w@vVKAcHN|7tTctxjYo63JAdCkiq$$D$ZK~B+Tt!dkiUizwKY6eG-KSf5&Ujz z!uU%A{?xx}hn>E7socIsaEW5~0#w|3Yw@2QADyof4Hdx1H6v z7KvI$jVp_J(F7;m6$tU2xF~XH)IMjMv;J&yQPzXPq?WT8C7bC@z~$2{E0URHhxTtr zL63hu;XIywkDh^J7fctRH|xjillu>Uc@`?FW@~s`o!TGcfMglFM7N6Dsz# zX~i3>QknEyhaG&JOy>7P_xmSg0lJS&<`$mfY3_d0tR=;Ah=&$K-elZt;ibJQZhk1Z z+yH=afCl4&>%O}6BG*z|=)i0>oc>J^VfcT1O(u*jmjK&4!Do7;v+3ho zO&_PCocHExZ$ZJ>Iklf0WrZRtG&!)5}>qy$M(n&@0B8u*yK1HgRa1$r#z4Y-% zs~Ht7gQ(X@m5^bCK~8V%O_M?tFaknEj{?tPvx$!^y}O@}Y&+)^WD56cwQW6%k**-9 z)NcuybBsI4K8G3kcf_xKio-L2HC{)grP{YUt}=RBgQ`NKu^!*?vt)NyUJoI*D+O0IgAp6X93fw~7nt8{2QH z{!)5%Uus^QW=&-qnn7dIRCb%6v>A9*7^*zzs-4tgimXyXu;;_Gcy^WfXs~+}EhdmDY}KimY1D+}xCW7s7u(2uV!dOq+s?t7^p5 zj=MMnmj^P9h}|uF$HQDO3<8~{CcWO?oS?%SG?V^yKI`)kH8QgF+(?Cfr?^^UD=Zsp z>@_xQYI2@lqr=8^8DGO%C&#I(&M0^+@*>Nj9%1gjaZqt)JjY>e2(4vn%6B)y3RoNn zFRIaq5G(7yFVuhBBb@<7O(fBCQZ^_OLB z-e)=PCaV9%g*v`!6+R&HvwNKuK0D)S(nJjgLwsWVfq++plfO5{3h<{g_2yfkb8Z}@K=avn16IHm z{s(`&=Cgl&t(~&7j|A-lSfr~P{>fT`6D_O@hiZ#)q6ljdpw)QK>v)_rF6h#`zaoLZ zM2BVj=`nq>wOEgKt1iFaB5Z)9Id>D5V8d#+^3mw>ZUpDo)sDZ3ELl4=pkEr1iY@Rz zJO0Wql=WC4om6HXrA+nbZ$KJJq<~cofOqz)Ri%Gcy~{2AsPyJv29MHgxeTtT&eLg@ z&2gr?kU&^G`ndtfv7xN(Kth8Y5z#yoDJZ^$oIf4?52Olk-7HPKeqNL%~D|eEG5gsei@9Lv7;q4 znQP~0Db;e^32g-cKpnfP;kokwWe_+TS<`bFSg|P?h1B3OL(e65dnkBo(ycu-KBYP+ zo1rt=hpof70~T0!9Fs|>fiQpQNQl!dkIR9R9%1ynS3Ixeags-i^)lhJA}N3Xve18j z4LBQjHK+0?Cnslzoh*c3@JYCF?IJm-r>>KJ3dL zj48#{_p|IL5EgKIc$3VBkv+D_=1J%~FK^mWN=x*#riiHm8Y&d(RDVWVE6XtfI}cVX zRMd?MLh|yl0gaeJ!3l{f7Dob08z{J-+Vp_$CAk&SP(_rV61tdNGUzyT+)95EnZ6*9 zd@z)K0shcBxQ&KX5wG|T`4|tsv!YT7^O%`|NQs8l4=NyszUl~G?%ZB8PAzsApcI;? zl4KwTXsynm$wx-3leFWMR?hW&qPBpjiL*#xx@I}BkqtS=3W>R#K;^z1ARpKEWzEL@)T z6XM-6D;NIFNFnty>wt=BfuQtm!W2d5zbyw+K8~3RJQyt&jA$9-^IU+sDwmccT(ek1gAnvQ>g`9dL*lyt-K zL_8YzILhZ$UKpqg))PAKexD@I>bYGb?Z)tw)0^%chVWRAUm^?kbOg8=X~|I;4m{`> zG#GY`4;;GqFv-b$XXgy>F?hngjUM|O-BcUdIw%)(tP0+(d1GoCm?Y&;bchxBo{Nb3 zl__`^SqAbAqSaFVaxi}|hzBF3-mrT|FshdFT1Pk9(PQn%E}r{M5bsA31C65lJiz-w z6t#>JDu9=GJGh%J;LJi-qmlc=w|IGbXj!=u60Q+{t*ey464YBW)$P``XBk&kZ6DsM zudVJa>uc@b&Sv#}GI|7mTxIzU&b{QdmT%FAhaVq3I{Ebc@HBtO@;(jsk4``Rc>nlN zSbwt@ABH_iKWV7X^LH@rT>325TFQ>Ps;l8iwehu5aL5;=D1D~$jM>lUW;yYG)0Ed4# zNB2&uI@cVHn$CZ33R(g?j+11pu4C!MzCjP0OH!bLWk%I(g7q+nD?T;oKrDG))9dSG zoWfwHH*6euzJ45V%^8T5J&2zrYI-%c@}XV;>u}T%0rg%y9@YEP|oelIN2QL(9U;ypsSLHkFLmilm$Z90I%^8*(hF|)aJ98^BHmiB6^1oy#Pj$51fXKN?EM zyn6ACd_2+)$RBpt0HI_0qN>l;IS%B!o)uaaoO--!B)S__t|W?9_Vc;K1XG6^A=LNGo?{ zQnJq?a?~9X!GJXsdR^nQC77GQ*;JLUZM|6U&``2;l)j7$4bPWuUVUxZ0}=NP{T&4+ z$1p*dUM_GEk8%Iu918O2tpp^0oc+Y{;JZOU_-_Va9ENl2R`go%O0Wa6b`N{Ctv-Zc zR%w4$Y4x&c1-MD0hlIX_Y|Vel=qj0<)g)nr`b*0AY-$3!yKPOnatDb~G@=Ct7Sf1@ z%~n{cIUeYu3mev-y%K7vE4O*+L`%V44CN)wxZ6ZZRYy=E+|`@7?m^sPK>lRC_Ck>k z_tx>fknXA%i8lC+GxhL;&Z1BuLj$#Srxt%WY+avcpu~-%m2<^u0tX$#EoCwqDY`45 zoIxWd2ETE`&|C4$p7ldB2)u|gEE_knPtpJh%lU@l;1N*Q=z&f$5FSRM^1lpc9vi1` zGf}2J&Z~y|%`T^lF-hck89}UBXr&Kva@7)9^Hyz53vq`~75>-S%}d7z19Vof5fXpp zAtdDYJgv+gn<4GE+5nP<~Xml&XiQw5ebA9zw52 zKvqFlyQMR0AU~F$9kKp^cYp`(4q$)LYvz>@BSURy_eQnZhDaCBv1+dwtZCse6i3ux zos<~KZVUcKShu_kM@iz1&~~qH^{FiQLAN?71lS*NI6)LNMK)h&1-*SX22WXz8`D%u zR*~mKH1WK$d$2KAqC`^IvoIRPXk}Th?^o0wkYN>~nmJjLNEP_hzbrEC&%}Q!Cvzz_ zX{1#xuHEe>Ohgk!Emyp(aw`T*gi=rICag?8Kq5WsPDVle$O)vly@GVIJK&96`%SqcrLFuz)#f;(I6|%E-RIF;1&2N$0#whY-E%C| zTZ$Uceg$iLuk?7nGg!7NVWoc)$Il0spFDbHuH&2hw`y*JJucS8o_=SS+z772753Wq z#qL!xFo=Ww3#G zxN0`d082o$zoVa>DvxVb0E2p+hXAI{Q^9HTxV6nqz0EoFLle#yz=-|`J0CiK6(38* zU%299tVkEOUGCptUZJmUbz#z=yKZ&C8$)xTLz zWViYbiG7&0V&e8(zqst>jQW#Dx8$ub?mo>~St~WP9~00T zrvELCY=@>mG_sxlu12;qAOfs^t�?(a3hH8rhC$WZFBnvP;n_jS2|;Kj_oYV%+&4 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 z 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

    4EKCjEC?8; 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 Q9GCwl1RMrx9|QmZ0Ie;oSO5S3 diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz index c17d5e8df30ab557f3d85afbd4c57bb30ac0bb6b..e0bbd04af8fbbb0fe14aad3853116282ba7ecaec 100644 GIT binary patch delta 219376 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≧t%kE)bvldpP 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

    f&07rs+uZ~-j!g6 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 z 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�)Gl(6}&Z-8a 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�LY5rT&#f_#rotI#4Z?F4_fFoyd} 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

2T#nW2v%xbFgglSlS~7)ML_2c0THfAbA$8 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