From cdca9733d22d05437ceb567c49e2ba1124e9acfb Mon Sep 17 00:00:00 2001 From: iTracerFacer <134304944+iTracerFacer@users.noreply.github.com> Date: Wed, 5 Nov 2025 13:40:24 -0600 Subject: [PATCH] =?UTF-8?q?=E2=80=9Crepair/augment=E2=80=9D=20crates=20and?= =?UTF-8?q?=20a=20build=20hook=20so=20when=20you=20drop=20a=20repair=20cra?= =?UTF-8?q?te=20near=20an=20existing=20SAM=20site,=20it=20respawns=20repai?= =?UTF-8?q?red=20and=20with=20+N=20launchers,=20consuming=20the=20crate(s)?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Moose_CTLD_Pure/Moose_CTLD.lua | 508 ++++++++++++++++-- Moose_CTLD_Pure/Moose_CTLD_Pure.miz | Bin 841712 -> 848727 bytes .../catalogs/Moose_CTLD_Catalog.lua | 21 + 3 files changed, 487 insertions(+), 42 deletions(-) diff --git a/Moose_CTLD_Pure/Moose_CTLD.lua b/Moose_CTLD_Pure/Moose_CTLD.lua index 2298e3c..c639436 100644 --- a/Moose_CTLD_Pure/Moose_CTLD.lua +++ b/Moose_CTLD_Pure/Moose_CTLD.lua @@ -93,7 +93,7 @@ CTLD.HoverCoachConfig = { CTLD.Messages = { -- Crates crate_spawn_requested = "Request received—spawning {type} crate at {zone}.", - pickup_zone_required = "Move within {zone_dist} {zone_dist_u} of a Supply Zone to request crates.", + pickup_zone_required = "Move within {zone_dist} {zone_dist_u} of a Supply Zone to request crates. Bearing {zone_brg}° to nearest zone.", no_pickup_zones = "No Pickup Zones are configured for this coalition. Ask the mission maker to add supply zones or disable the pickup zone requirement.", crate_re_marked = "Re-marking crate {id} with {mark}.", crate_expired = "Crate {id} expired and was removed.", @@ -121,7 +121,7 @@ CTLD.Messages = { troops_unloaded_coalition = "{player} deployed {count} troops.", no_troops = "No troops onboard.", troops_deploy_failed = "Deploy failed: {reason}.", - troop_pickup_zone_required = "Move inside a Supply Zone to load troops. Nearest zone is {zone_dist} {zone_dist_u} away.", + troop_pickup_zone_required = "Move inside a Supply Zone to load troops. Nearest zone is {zone_dist}, {zone_dist_u} away bearing {zone_brg}°.", -- Coach & nav vectors_to_crate = "Nearest crate {id}: bearing {brg}°, range {rng} {rng_u}.", @@ -236,8 +236,8 @@ CTLD.Config = { Inventory = { Enabled = true, -- master switch for per-location stock control FOBStockFactor = 0.25, -- starting stock at newly built FOBs relative to pickup-zone initialStock - ShowStockInMenu = true, -- if true, append simple stock hints to menu labels (per current nearest zone) - HideZeroStockMenu = true, -- if true, add a filtered submenu that only shows items in stock at the nearest Pickup Zone + ShowStockInMenu = true, -- if true, append simple stock hints to menu labels (per current nearest zone) + HideZeroStockMenu = false, -- removed: previously created an "In Stock Here" submenu; now disabled by default }, -- Hover pickup configuration (Ciribob-style inspired) @@ -261,6 +261,7 @@ CTLD.Config = { weight = 120, -- affects sling/limits only informationally (no physics in script) dcsCargoType = 'uh1h_cargo', -- static cargo type (can adjust per DCS version); user-tunable required = 2, -- number of crates to assemble + canAttackMove = true, -- infantry can move to engage side = coalition.side.BLUE, category = Group.Category.GROUND, build = function(point, headingDeg) @@ -279,6 +280,7 @@ CTLD.Config = { weight = 400, dcsCargoType = 'container_cargo', required = 3, + canAttackMove = false, -- static emplacement; do not attempt attack-move side = coalition.side.BLUE, category = Group.Category.GROUND, build = function(point, headingDeg) @@ -299,6 +301,7 @@ CTLD.Config = { dcsCargoType = 'container_cargo', required = 4, isFOB = true, -- mark as FOB recipe for zone restrictions/auto-build + canAttackMove = false, -- logistics site; never attack-move side = coalition.side.BLUE, category = Group.Category.GROUND, build = function(point, headingDeg, spawnSide) @@ -1278,13 +1281,17 @@ function CTLD:BuildGroupMenus(group) end end) end + -- Troop transport submenu at top + local troopsRoot = MENU_GROUP:New(group, 'Troop Transport', root) + CMD('Load Troops', troopsRoot, function() self:LoadTroops(group) end) + do + local tr = (self.Config.AttackAI and self.Config.AttackAI.TroopSearchRadius) or 3000 + CMD('Deploy [Hold Position]', troopsRoot, function() self:UnloadTroops(group, { behavior = 'defend' }) end) + CMD(string.format('Deploy [Attack (%dm)]', tr), troopsRoot, function() self:UnloadTroops(group, { behavior = 'attack' }) end) + end -- Request crate submenu per catalog entry local reqRoot = MENU_GROUP:New(group, 'Request Crate', root) - -- Optional filtered submenu that only shows items in stock at the nearest Pickup Zone - local reqInStockRoot - if (self.Config.Inventory and self.Config.Inventory.Enabled and self.Config.Inventory.HideZeroStockMenu) then - reqInStockRoot = MENU_GROUP:New(group, 'Request Crate (In Stock Here)', root) - end + -- Removed: previously created a filtered "Request Crate (In Stock Here)" submenu -- Optional: parallel Recipe Info submenu to display detailed requirements local infoRoot = MENU_GROUP:New(group, 'Recipe Info', root) if self.Config.UseCategorySubmenus then @@ -1330,30 +1337,19 @@ function CTLD:BuildGroupMenus(group) end end - -- Build or refresh the filtered "In Stock Here" submenu - if reqInStockRoot then - self:_BuildOrRefreshInStockMenu(group, reqInStockRoot) - end - -- Troops - CMD('Load Troops', root, function() self:LoadTroops(group) end) - CMD('Unload Troops', root, function() self:UnloadTroops(group) end) - -- New: Deploy behavior variants - do - local tr = (self.Config.AttackAI and self.Config.AttackAI.TroopSearchRadius) or 3000 - local labelAtk = string.format('Deploy Troops (Attack [%dm])', tr) - CMD('Deploy Troops (Defend)', root, function() self:UnloadTroops(group, { behavior = 'defend' }) end) - CMD(labelAtk, root, function() self:UnloadTroops(group, { behavior = 'attack' }) end) - end + -- Removed: filtered "In Stock Here" submenu + -- (Troop Transport submenu created at top) -- Build CMD('Build Here', root, function() self:BuildAtGroup(group) end) - -- New: Build behavior variants for combat vehicles/groups - do - local vr = (self.Config.AttackAI and self.Config.AttackAI.VehicleSearchRadius) or 5000 - local labelBA = string.format('Build Here (Attack [%dm])', vr) - CMD('Build Here (Defend)', root, function() self:BuildAtGroup(group, { behavior = 'defend' }) end) - CMD(labelBA, root, function() self:BuildAtGroup(group, { behavior = 'attack' }) end) - end + -- Build (Advanced): per-item attack/defend options + local buildAdvRoot = MENU_GROUP:New(group, 'Build (Advanced)', root) + MENU_GROUP_COMMAND:New(group, 'Refresh Buildable List', buildAdvRoot, function() + self:_BuildOrRefreshBuildAdvancedMenu(group, buildAdvRoot) + MESSAGE:New('Buildable list refreshed.', 6):ToGroup(group) + end) + -- Initial populate + self:_BuildOrRefreshBuildAdvancedMenu(group, buildAdvRoot) -- Crate management (loaded crates) CMD('Drop One Loaded Crate', root, function() self:DropLoadedCrates(group, 1) end) @@ -1423,6 +1419,21 @@ function CTLD:BuildGroupMenus(group) end zone, dist = _nearestZonePoint(unit, list) if not zone then + -- Fallback: try any configured pickup zone even if inactive to provide vectors + local allDefs = self.Config and self.Config.Zones and self.Config.Zones.PickupZones or {} + if allDefs and #allDefs > 0 then + local fbZone, fbDist = _nearestZonePoint(unit, allDefs) + if fbZone then + local up = unit:GetPointVec3(); local zp = fbZone:GetPointVec3() + local from = { x = up.x, z = up.z } + local to = { x = zp.x, z = zp.z } + local brg = _bearingDeg(from, to) + local isMetric = _getPlayerIsMetric(unit) + local rngV, rngU = _fmtRange(fbDist or 0, isMetric) + _eventSend(self, group, nil, 'vectors_to_pickup_zone', { zone = fbZone:GetName(), brg = brg, rng = rngV, rng_u = rngU }) + return + end + end _eventSend(self, group, nil, 'no_pickup_zones', {}) return end @@ -1462,13 +1473,7 @@ function CTLD:BuildGroupMenus(group) -- Admin/Help (nested under CTLD group menu when using group menus) local admin = MENU_GROUP:New(group, 'Admin/Help', root) - -- When filtered "In Stock" menu is enabled, add a quick refresh command under Admin for convenience - if (self.Config.Inventory and self.Config.Inventory.Enabled and self.Config.Inventory.HideZeroStockMenu) then - MENU_GROUP_COMMAND:New(group, 'Refresh "In Stock" Menu Now', admin, function() - self:_BuildOrRefreshInStockMenu(group) - MESSAGE:New('In-Stock menu refreshed for nearest supply zone.', 6):ToGroup(group) - end) - end + -- Removed: 'In Stock' quick refresh admin command CMD('Enable CTLD Debug Logging', admin, function() self.Config.Debug = true env.info(string.format('[Moose_CTLD][%s] Debug ENABLED via Admin menu', tostring(self.Side))) @@ -1527,7 +1532,23 @@ function CTLD:_BuildOrRefreshInStockMenu(group, rootMenu) local zone, dist = self:_nearestActivePickupZone(unit) if not zone then MENU_GROUP_COMMAND:New(group, 'No active supply zone nearby', inRoot, function() + -- Inform and also provide vectors to nearest configured zone if any _eventSend(self, group, nil, 'no_pickup_zones', {}) + -- Fallback: try any configured pickup zone (ignoring active state) for helpful vectors + local list = self.Config and self.Config.Zones and self.Config.Zones.PickupZones or {} + if list and #list > 0 then + local unit = group:GetUnit(1) + if unit and unit:IsAlive() then + local fallbackZone, fallbackDist = _nearestZonePoint(unit, list) + if fallbackZone then + local up = unit:GetPointVec3(); local zp = fallbackZone:GetPointVec3() + local brg = _bearingDeg({x=up.x,z=up.z}, {x=zp.x,z=zp.z}) + local isMetric = _getPlayerIsMetric(unit) + local rngV, rngU = _fmtRange(fallbackDist or 0, isMetric) + _eventSend(self, group, nil, 'vectors_to_pickup_zone', { zone = fallbackZone:GetName(), brg = brg, rng = rngV, rng_u = rngU }) + end + end + end end) -- Still add a refresh item MENU_GROUP_COMMAND:New(group, 'Refresh In-Stock List', inRoot, function() self:_BuildOrRefreshInStockMenu(group) end) @@ -1539,7 +1560,9 @@ function CTLD:_BuildOrRefreshInStockMenu(group, rootMenu) MENU_GROUP_COMMAND:New(group, string.format('Nearest zone %s is beyond limit (%.0f m).', zname, dist or 0), inRoot, function() local isMetric = _getPlayerIsMetric(unit) local v, u = _fmtRange(math.max(0, (dist or 0) - maxd), isMetric) - _eventSend(self, group, nil, 'pickup_zone_required', { zone_dist = v, zone_dist_u = u }) + local up = unit:GetPointVec3(); local zp = zone:GetPointVec3() + local brg = _bearingDeg({x=up.x,z=up.z}, {x=zp.x,z=zp.z}) + _eventSend(self, group, nil, 'pickup_zone_required', { zone_dist = v, zone_dist_u = u, zone_brg = brg }) end) MENU_GROUP_COMMAND:New(group, 'Refresh In-Stock List', inRoot, function() self:_BuildOrRefreshInStockMenu(group) end) return @@ -1594,6 +1617,395 @@ function CTLD:_BuildOrRefreshInStockMenu(group, rootMenu) end end +-- Create or refresh the dynamic Build (Advanced) menu for a group. +function CTLD:_BuildOrRefreshBuildAdvancedMenu(group, rootMenu) + if not group or not group:IsAlive() then return end + -- Clear previous dynamic children if any by recreating the submenu root when rootMenu passed + -- We'll remove and recreate inner items by making a temporary child root + local gname = group:GetName() + -- Remove existing dynamic children by creating a fresh inner menu + local dynRoot = MENU_GROUP:New(group, 'Buildable Near You', rootMenu) + + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + local p = unit:GetPointVec3() + local here = { x = p.x, z = p.z } + local hdg = unit:GetHeading() or 0 + local buildOffset = math.max(0, tonumber(self.Config.BuildSpawnOffset or 0) or 0) + local spawnAt = (buildOffset > 0) and { x = here.x + math.sin(hdg) * buildOffset, z = here.z + math.cos(hdg) * buildOffset } or { x = here.x, z = here.z } + local radius = self.Config.BuildRadius or 60 + local nearby = self:GetNearbyCrates(here, radius) + local filtered = {} + for _,c in ipairs(nearby) do if c.meta.side == self.Side then table.insert(filtered, c) end end + nearby = filtered + -- Count by key + local counts = {} + for _,c in ipairs(nearby) do counts[c.meta.key] = (counts[c.meta.key] or 0) + 1 end + -- Include carried crates if allowed + if self.Config.BuildRequiresGroundCrates ~= true then + local gname = group:GetName() + local carried = CTLD._loadedCrates[gname] + if carried and carried.byKey then + for k,v in pairs(carried.byKey) do counts[k] = (counts[k] or 0) + v end + end + end + -- FOB restriction context + local insideFOBZone = select(1, self:IsPointInFOBZones(here)) + + -- Build list of buildable recipes + local items = {} + for key,cat in pairs(self.Config.CrateCatalog or {}) do + local sideOk = (not cat.side) or cat.side == self.Side + if sideOk and cat and cat.build then + local ok = false + if type(cat.requires) == 'table' then + ok = true + for reqKey,qty in pairs(cat.requires) do if (counts[reqKey] or 0) < (qty or 0) then ok = false; break end end + else + ok = ((counts[key] or 0) >= (cat.required or 1)) + end + if ok then + if not (cat.isFOB and self.Config.RestrictFOBToZones and not insideFOBZone) then + table.insert(items, { key = key, def = cat }) + end + end + end + end + + if #items == 0 then + MENU_GROUP_COMMAND:New(group, 'None buildable here. Drop required crates close to your aircraft.', dynRoot, function() + MESSAGE:New('No buildable items with nearby crates. Use Recipe Info to check requirements.', 10):ToGroup(group) + end) + return + end + + -- Stable ordering by label + table.sort(items, function(a,b) + local la = (a.def and (a.def.menu or a.def.description)) or a.key + local lb = (b.def and (b.def.menu or b.def.description)) or b.key + return tostring(la) < tostring(lb) + end) + + -- Create per-item submenus + local function CMD(title, parent, cb) + return MENU_GROUP_COMMAND:New(group, title, parent, function() + local ok, err = pcall(cb) + if not ok then env.info('[Moose_CTLD] BuildAdv menu error: '..tostring(err)); MESSAGE:New('CTLD menu error: '..tostring(err), 8):ToGroup(group) end + end) + end + + for _,it in ipairs(items) do + local label = (it.def and (it.def.menu or it.def.description)) or it.key + local perItem = MENU_GROUP:New(group, label, dynRoot) + -- Hold Position + CMD('Build [Hold Position]', perItem, function() + self:BuildSpecificAtGroup(group, it.key, { behavior = 'defend' }) + end) + -- Attack variant (render even if canAttackMove=false; we message accordingly) + local vr = (self.Config.AttackAI and self.Config.AttackAI.VehicleSearchRadius) or 5000 + CMD(string.format('Build [Attack (%dm)]', vr), perItem, function() + if it.def and it.def.canAttackMove == false then + MESSAGE:New('This unit is static or not suited to move; it will hold position.', 8):ToGroup(group) + self:BuildSpecificAtGroup(group, it.key, { behavior = 'defend' }) + else + self:BuildSpecificAtGroup(group, it.key, { behavior = 'attack' }) + end + end) + end +end + +-- Build a specific recipe at the group position if crates permit; supports behavior opts +function CTLD:BuildSpecificAtGroup(group, recipeKey, opts) + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + -- Reuse Build cooldown/confirm logic + local now = timer.getTime() + local gname = group:GetName() + if self.Config.BuildCooldownEnabled then + local last = CTLD._buildCooldown[gname] + if last and (now - last) < (self.Config.BuildCooldownSeconds or 60) then + local rem = math.max(0, math.ceil((self.Config.BuildCooldownSeconds or 60) - (now - last))) + _msgGroup(group, string.format('Build on cooldown. Try again in %ds.', rem)) + return + end + end + if self.Config.BuildConfirmEnabled then + local first = CTLD._buildConfirm[gname] + local win = self.Config.BuildConfirmWindowSeconds or 10 + if not first or (now - first) > win then + CTLD._buildConfirm[gname] = now + _msgGroup(group, string.format('Confirm build: select again within %ds to proceed.', win)) + return + else + CTLD._buildConfirm[gname] = nil + end + end + + local def = self.Config.CrateCatalog[recipeKey] + if not def or not def.build then _msgGroup(group, 'Unknown or unbuildable recipe: '..tostring(recipeKey)); return end + + local p = unit:GetPointVec3() + local here = { x = p.x, z = p.z } + local hdg = unit:GetHeading() or 0 + local buildOffset = math.max(0, tonumber(self.Config.BuildSpawnOffset or 0) or 0) + local spawnAt = (buildOffset > 0) and { x = here.x + math.sin(hdg) * buildOffset, z = here.z + math.cos(hdg) * buildOffset } or { x = here.x, z = here.z } + local radius = self.Config.BuildRadius or 60 + local nearby = self:GetNearbyCrates(here, radius) + local filtered = {} + for _,c in ipairs(nearby) do if c.meta.side == self.Side then table.insert(filtered, c) end end + nearby = filtered + if #nearby == 0 and self.Config.BuildRequiresGroundCrates ~= true then + -- still can build using carried crates + elseif #nearby == 0 then + _eventSend(self, group, nil, 'build_insufficient_crates', { build = def.description or recipeKey }) + return + end + + -- Count by key + local counts = {} + for _,c in ipairs(nearby) do counts[c.meta.key] = (counts[c.meta.key] or 0) + 1 end + -- Include carried crates + local carried = CTLD._loadedCrates[gname] + if self.Config.BuildRequiresGroundCrates ~= true then + if carried and carried.byKey then for k,v in pairs(carried.byKey) do counts[k] = (counts[k] or 0) + v end end + end + + -- Helper to consume crates of a given key/qty (prefers carried when allowed) + local function consumeCrates(key, qty) + local removed = 0 + if self.Config.BuildRequiresGroundCrates ~= true then + if carried and carried.byKey and (carried.byKey[key] or 0) > 0 then + local take = math.min(qty, carried.byKey[key]) + carried.byKey[key] = carried.byKey[key] - take + if carried.byKey[key] <= 0 then carried.byKey[key] = nil end + carried.total = math.max(0, (carried.total or 0) - take) + removed = removed + take + end + end + for _,c in ipairs(nearby) do + if removed >= qty then break end + if c.meta.key == key then + local obj = StaticObject.getByName(c.name) + if obj then obj:destroy() end + CTLD._crates[c.name] = nil + removed = removed + 1 + end + end + end + + -- FOB restriction check + if def.isFOB and self.Config.RestrictFOBToZones then + local inside = select(1, self:IsPointInFOBZones(here)) + if not inside then _eventSend(self, group, nil, 'fob_restricted', {}); return end + end + + -- Special-case: SAM Site Repair/Augment entries (isRepair) + if def.isRepair == true or tostring(recipeKey):find('_REPAIR', 1, true) then + -- Map recipe key family to a template definition + local function identifyTemplate(key) + if key:find('HAWK', 1, true) then + return { + name='HAWK', side=def.side or self.Side, + baseUnits={ {type='Hawk sr', dx=12, dz=8}, {type='Hawk tr', dx=-12, dz=8}, {type='Hawk pcp', dx=18, dz=12}, {type='Hawk cwar', dx=-18, dz=12} }, + launcherType='Hawk ln', launcherStart={dx=0, dz=0}, launcherStep={dx=6, dz=0}, maxLaunchers=6 + } + elseif key:find('PATRIOT', 1, true) then + return { + name='PATRIOT', side=def.side or self.Side, + baseUnits={ {type='Patriot str', dx=14, dz=10}, {type='Patriot ECS', dx=-14, dz=10} }, + launcherType='Patriot ln', launcherStart={dx=0, dz=0}, launcherStep={dx=8, dz=0}, maxLaunchers=6 + } + elseif key:find('KUB', 1, true) then + return { + name='KUB', side=def.side or self.Side, + baseUnits={ {type='Kub 1S91 str', dx=12, dz=8} }, + launcherType='Kub 2P25 ln', launcherStart={dx=0, dz=0}, launcherStep={dx=6, dz=0}, maxLaunchers=3 + } + elseif key:find('BUK', 1, true) then + return { + name='BUK', side=def.side or self.Side, + baseUnits={ {type='SA-11 Buk SR 9S18M1', dx=12, dz=8}, {type='SA-11 Buk CC 9S470M1', dx=-12, dz=8} }, + launcherType='SA-11 Buk LN 9A310M1', launcherStart={dx=0, dz=0}, launcherStep={dx=6, dz=0}, maxLaunchers=6 + } + end + return nil + end + + local tpl = identifyTemplate(tostring(recipeKey)) + if not tpl then _msgGroup(group, 'No matching SAM site type for repair: '..tostring(recipeKey)); return end + + -- Determine how many repair crates to apply + local cratesAvail = counts[recipeKey] or 0 + if cratesAvail <= 0 then _eventSend(self, group, nil, 'build_insufficient_crates', { build = def.description or recipeKey }); return end + + -- Find nearest existing site group that matches template + local function vec2(u) + local p = u:getPoint(); return { x = p.x, z = p.z } + end + local function dist2(a,b) + local dx, dz = a.x-b.x, a.z-b.z; return math.sqrt(dx*dx+dz*dz) + end + local searchR = math.max(250, (self.Config.BuildRadius or 60) * 10) + local groups = coalition.getGroups(tpl.side, Group.Category.GROUND) or {} + local here2 = { x = here.x, z = here.z } + local bestG, bestD, bestInfo = nil, 1e9, nil + for _,g in ipairs(groups) do + if g and g:isExist() then + local units = g:getUnits() or {} + if #units > 0 then + -- Compute center and count types + local cx, cz = 0, 0 + local byType = {} + for _,u in ipairs(units) do + local pt = u:getPoint(); cx = cx + pt.x; cz = cz + pt.z + local tname = u:getTypeName() or '' + byType[tname] = (byType[tname] or 0) + 1 + end + cx = cx / #units; cz = cz / #units + local d = dist2(here2, { x = cx, z = cz }) + if d <= searchR then + -- Check presence of base units (at least 1 each) + local ok = true + for _,u in ipairs(tpl.baseUnits) do if (byType[u.type] or 0) < 1 then ok = false; break end end + -- Require at least 1 launcher or allow 0 (initial repair to full base)? we'll allow 0 too. + if ok then + if d < bestD then + bestG, bestD = g, d + bestInfo = { byType = byType, center = { x = cx, z = cz }, headingDeg = function() + local h = 0; local leader = units[1]; if leader and leader.isExist and leader:isExist() then h = math.deg(leader:getHeading() or 0) end; return h + end } + end + end + end + end + end + end + + if not bestG then + _msgGroup(group, 'No matching SAM site found nearby to repair/augment.') + return + end + + -- Current launchers in site + local curLaunchers = (bestInfo.byType[tpl.launcherType] or 0) + local maxL = tpl.maxLaunchers or (curLaunchers + cratesAvail) + local canAdd = math.max(0, (maxL - curLaunchers)) + if canAdd <= 0 then + _msgGroup(group, 'SAM site is already at max launchers.') + return + end + local addNum = math.min(cratesAvail, canAdd) + + -- Build new group composition: base units + (curLaunchers + addNum) launchers + local function buildSite(point, headingDeg, side, launcherCount) + local hdg = math.rad(headingDeg or 0) + local function off(dx, dz) + -- rotate offsets by heading + local s, c = math.sin(hdg), math.cos(hdg) + local rx = dx * c + dz * s + local rz = -dx * s + dz * c + return { x = point.x + rx, z = point.z + rz } + end + local units = {} + -- Place launchers in a row starting at launcherStart and stepping by launcherStep + for i=0, (launcherCount-1) do + local dx = (tpl.launcherStart.dx or 0) + (tpl.launcherStep.dx or 0) * i + local dz = (tpl.launcherStart.dz or 0) + (tpl.launcherStep.dz or 0) * i + local p = off(dx, dz) + table.insert(units, { type = tpl.launcherType, name = string.format('CTLD-%s-%d', tpl.launcherType, math.random(100000,999999)), x = p.x, y = p.z, heading = hdg }) + end + -- Place base units at their template offsets + for _,u in ipairs(tpl.baseUnits) do + local p = off(u.dx or 0, u.dz or 0) + table.insert(units, { type = u.type, name = string.format('CTLD-%s-%d', u.type, math.random(100000,999999)), x = p.x, y = p.z, heading = hdg }) + end + return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={}, units=units, name=string.format('CTLD_SITE_%d', math.random(100000,999999)) } + end + + _eventSend(self, group, nil, 'build_started', { build = def.description or recipeKey }) + -- Destroy old group, spawn new one + local oldName = bestG:getName() + local newLauncherCount = curLaunchers + addNum + local center = bestInfo.center + local headingDeg = bestInfo.headingDeg() + if Group.getByName(oldName) then pcall(function() Group.getByName(oldName):destroy() end) end + local gdata = buildSite({ x = center.x, z = center.z }, headingDeg, tpl.side, newLauncherCount) + local newG = _coalitionAddGroup(tpl.side, Group.Category.GROUND, gdata) + if not newG then _eventSend(self, group, nil, 'build_failed', { reason = 'DCS group spawn error' }); return end + -- Consume used repair crates + consumeCrates(recipeKey, addNum) + _eventSend(self, nil, self.Side, 'build_success_coalition', { build = (def.description or recipeKey), player = _playerNameFromGroup(group) }) + if self.Config.BuildCooldownEnabled then CTLD._buildCooldown[gname] = now end + return + end + + -- Verify counts and build + if type(def.requires) == 'table' then + for reqKey,qty in pairs(def.requires) do if (counts[reqKey] or 0) < (qty or 0) then _eventSend(self, group, nil, 'build_insufficient_crates', { build = def.description or recipeKey }); return end end + local gdata = def.build({ x = spawnAt.x, z = spawnAt.z }, math.deg(hdg), def.side or self.Side) + _eventSend(self, group, nil, 'build_started', { build = def.description or recipeKey }) + local g = _coalitionAddGroup(def.side or self.Side, def.category or Group.Category.GROUND, gdata) + if not g then _eventSend(self, group, nil, 'build_failed', { reason = 'DCS group spawn error' }); return end + for reqKey,qty in pairs(def.requires) do consumeCrates(reqKey, qty or 0) end + _eventSend(self, nil, self.Side, 'build_success_coalition', { build = def.description or recipeKey, player = _playerNameFromGroup(group) }) + if def.isFOB then pcall(function() self:_CreateFOBPickupZone({ x = spawnAt.x, z = spawnAt.z }, def, hdg) end) end + -- behavior + local behavior = opts and opts.behavior or nil + if behavior == 'attack' and (def.canAttackMove ~= false) and self.Config.AttackAI and self.Config.AttackAI.Enabled then + local t = self:_assignAttackBehavior(g:getName(), spawnAt, true) + local isMetric = _getPlayerIsMetric(group:GetUnit(1)) + if t and t.kind == 'base' then + local brg = _bearingDeg(spawnAt, t.point) + local v, u = _fmtRange(t.dist or 0, isMetric) + _eventSend(self, nil, self.Side, 'attack_base_announce', { unit_name = g:getName(), player = _playerNameFromGroup(group), base_name = t.name, brg = brg, rng = v, rng_u = u }) + elseif t and t.kind == 'enemy' then + local brg = _bearingDeg(spawnAt, t.point) + local v, u = _fmtRange(t.dist or 0, isMetric) + _eventSend(self, nil, self.Side, 'attack_enemy_announce', { unit_name = g:getName(), player = _playerNameFromGroup(group), enemy_type = t.etype or 'unit', brg = brg, rng = v, rng_u = u }) + else + local v, u = _fmtRange((self.Config.AttackAI and self.Config.AttackAI.VehicleSearchRadius) or 5000, isMetric) + _eventSend(self, nil, self.Side, 'attack_no_targets', { unit_name = g:getName(), player = _playerNameFromGroup(group), rng = v, rng_u = u }) + end + elseif behavior == 'attack' and def.canAttackMove == false then + MESSAGE:New('This unit is static or not suited to move; it will hold position.', 8):ToGroup(group) + end + if self.Config.BuildCooldownEnabled then CTLD._buildCooldown[gname] = now end + return + else + -- single-key + local need = def.required or 1 + if (counts[recipeKey] or 0) < need then _eventSend(self, group, nil, 'build_insufficient_crates', { build = def.description or recipeKey }); return end + local gdata = def.build({ x = spawnAt.x, z = spawnAt.z }, math.deg(hdg), def.side or self.Side) + _eventSend(self, group, nil, 'build_started', { build = def.description or recipeKey }) + local g = _coalitionAddGroup(def.side or self.Side, def.category or Group.Category.GROUND, gdata) + if not g then _eventSend(self, group, nil, 'build_failed', { reason = 'DCS group spawn error' }); return end + consumeCrates(recipeKey, need) + _eventSend(self, nil, self.Side, 'build_success_coalition', { build = def.description or recipeKey, player = _playerNameFromGroup(group) }) + -- behavior + local behavior = opts and opts.behavior or nil + if behavior == 'attack' and (def.canAttackMove ~= false) and self.Config.AttackAI and self.Config.AttackAI.Enabled then + local t = self:_assignAttackBehavior(g:getName(), spawnAt, true) + local isMetric = _getPlayerIsMetric(group:GetUnit(1)) + if t and t.kind == 'base' then + local brg = _bearingDeg(spawnAt, t.point) + local v, u = _fmtRange(t.dist or 0, isMetric) + _eventSend(self, nil, self.Side, 'attack_base_announce', { unit_name = g:getName(), player = _playerNameFromGroup(group), base_name = t.name, brg = brg, rng = v, rng_u = u }) + elseif t and t.kind == 'enemy' then + local brg = _bearingDeg(spawnAt, t.point) + local v, u = _fmtRange(t.dist or 0, isMetric) + _eventSend(self, nil, self.Side, 'attack_enemy_announce', { unit_name = g:getName(), player = _playerNameFromGroup(group), enemy_type = t.etype or 'unit', brg = brg, rng = v, rng_u = u }) + else + local v, u = _fmtRange((self.Config.AttackAI and self.Config.AttackAI.VehicleSearchRadius) or 5000, isMetric) + _eventSend(self, nil, self.Side, 'attack_no_targets', { unit_name = g:getName(), player = _playerNameFromGroup(group), rng = v, rng_u = u }) + end + elseif behavior == 'attack' and def.canAttackMove == false then + MESSAGE:New('This unit is static or not suited to move; it will hold position.', 8):ToGroup(group) + end + if self.Config.BuildCooldownEnabled then CTLD._buildCooldown[gname] = now end + return + end +end + function CTLD:BuildCoalitionMenus(root) -- Optional: implement coalition-level crate spawns at pickup zones for key,_ in pairs(self.Config.CrateCatalog) do @@ -1830,7 +2242,12 @@ function CTLD:RequestCrateForGroup(group, crateKey) if self.Config.RequirePickupZoneForCrateRequest then local isMetric = _getPlayerIsMetric(unit) local v, u = _fmtRange(math.max(0, dist - maxd), isMetric) - _eventSend(self, group, nil, 'pickup_zone_required', { zone_dist = v, zone_dist_u = u }) + local brg = 0 + if zone then + local up = unit:GetPointVec3(); local zp = zone:GetPointVec3() + brg = _bearingDeg({x=up.x,z=up.z}, {x=zp.x,z=zp.z}) + end + _eventSend(self, group, nil, 'pickup_zone_required', { zone_dist = v, zone_dist_u = u, zone_brg = brg }) return else -- fallback: spawn near aircraft current position (safe offset) @@ -2061,7 +2478,7 @@ function CTLD:BuildAtGroup(group, opts) return end end - ::continue_composite:: + -- continue_composite (Lua 5.1 compatible: no labels) end end end @@ -2107,7 +2524,7 @@ function CTLD:BuildAtGroup(group, opts) end end end - ::continue_single:: + -- continue_single (Lua 5.1 compatible: no labels) end if fobBlocked then @@ -2451,7 +2868,14 @@ function CTLD:LoadTroops(group, opts) local rZone = (zone and (self:_getZoneRadius(zone) or 0)) or 0 local delta = math.max(0, (dist or 0) - rZone) local v, u = _fmtRange(delta, isMetric) - _eventSend(self, group, nil, 'troop_pickup_zone_required', { zone_dist = v, zone_dist_u = u }) + -- Bearing from player to zone center + local up = unit:GetPointVec3() + local zp = zone and zone:GetPointVec3() or nil + local brg = 0 + if zp then + brg = _bearingDeg({ x = up.x, z = up.z }, { x = zp.x, z = zp.z }) + end + _eventSend(self, group, nil, 'troop_pickup_zone_required', { zone_dist = v, zone_dist_u = u, zone_brg = brg }) return end end diff --git a/Moose_CTLD_Pure/Moose_CTLD_Pure.miz b/Moose_CTLD_Pure/Moose_CTLD_Pure.miz index 1c74561557f7b159978353824c5c7e2eb2131eec..9f123864a6b3efcd99d7b9c62bc186124adac98c 100644 GIT binary patch delta 40362 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 delta 33346 zcmYJXb8s)t4>nrcr?zd|wr$(ir?zd|wr!rar?zdk_xpS2-uM3VOlBvWWOnmpH(5Jj zxvOVMU*^c4v`!8h8* z4`trH|7+7=*LjtsgSOmwGmLCY@kYfDTV(m8ul8J&tD0Q>ve?6;oboqvuqi_lvjIl) z(fPGO(q{fISK#j5_>(Rx+wpJC*TXbm8*qPo#?L_V%kL2WdVw9;P646Ol-Q8q@xV1n zZP&8DXsf6G-t>ItojbdMh<+by6qC~S{G|0aE%tPsw-v!DQT3Aev(x?rb_{vqiRzFR`D_*U_&8r6;d4Fh4KN6Iiburo4!Bscv@w)9o7#xd1tFnUa(WTqT% zZ0DXPt-{U4(gIk|yxvvlBW1GG1uSBJF<7mlN$ZC8-M*6NI;XajC1+i<{9_8NHqR0V zpe+xAvTm~eWsM;S)810tq)J3d@~4d!piMe=qu*X)gA*in>ySNQp63p#Njj#cI`CHf zJ7TtweImCw)6dM63$D99cIDnS(Oh!PbGjEVh}FbgYwsqae6%vE_fe4Q20*k_XAA`d zjme1R)}!{Wxz_3yOh($eKgfT@QdFIZ=u-duD~m+Em{(UT6H2K|S3{kI?$kaxhH+)d zRBx{qwU91~sCK&tMiODSN%f1t@Cv8Mo%7T?CWoXpNS=f8&c1Lj)Yd`Q)Xk zZAq53ajEcpZ1OR*A_oY{5bUQf{hMs|M;b^TrTp`PLu1&|PkZ6OLvBc+D+ zcKR0m)*EIgqN)x8w35mmesSrA2?P@Ora1<^x0_mMZpj;&vFu3MJ z;HLzl5e6^h>*xI5zu*f~D4#tc2%qwP8HLU%hD3x9^o#PF@fDIpRi3KA*q1RpV9e`p zOB|?5=WGid5D|rcqPtRC<2Nk~Pe|;Ef1s3yFfkBjG%~^fK9~V77hea@4h%O$?&PC$ zx1{bL!%?~WgnRf9;d4|M^Tn7X`#xV2h+YO)47)$y7YElXd?R!4cLswvCOLGC2{El2 zbc(Dp)~0Xq5cr}IUNI)PRCZO_YSjc27K}=R07e(|Tq}oPziNB_`yk3AsL-1J1+owP z$on{qS~Em|l#ESlL+m0km1!kdpm3>Z)#Cc50n`rAwaZ9 zlr6v)YrDcAC`_?86bw0$7zCQyvBV#mnNz(#V}$i0osbl2g+WLP^FI~Tq7Kodv@i=H zSS34S())xDGRyrcNZQ3x>p!sC5yprznUvg(1)%`SpN4`^HnX6#f^)qElnQ2IOQR^r z|Da0Xe<1fi@F2E~L`4)`Kw+?x-T6knzeHE{R+hTw4hJLJ^>QhO=85fasL)(jlY?HA z^>E1!)@i#q`2xeXUB%GGMg@YYOV`;SN3Yh6-(s+(3l zeGc)V^G>K)=N*-#{i(8%ijlNwH-{Gs#uH9=09w4BUF8E6d(xY#gBwW@-$@a4%{35q zhn)AcXZ!W~XSE-&!{&(Oe$f1~T3*{Lp0=lv$h1~7W=~jcmCh&1Z2@2f@qSQA5cwL^ z(}1ssLneq6ln0xtA{-K!l5R<>uc{??Os-NpP{)cao4A+h+o@Kief^mF2Lz^9mo6)p z5B_0Nd)ga^afdRpK3%QA!tSjjbl}}gIa8;GeZxm>M5}Wu+PWxx7^QD3UYC+#*#L=;3q^eRuiRBYALNt!q(Y zW!bIG?d9!%-=+iVuE+nKSGpqlxU#wA{ZHe*M+e7qP zt5K-b_mu#P;j&uU7!~cQ^@4rTVyXrwBD>VW*`$%!;_b^6r{A&rkKvhLffpOFjp-5YLD3LSP)4+UC~sEHc!SFm&PFoV0>p64+;044{g! z)jnV4v~n`hR%Vq^JO7<9$1GSMxp4b6rk}`1 zzrRwkN?9w=S^=m(ck-t#RXlk$_TUZs+p>qB@Tg5IIEIN?{Sb#%)T#6(Rgu{g$Q$8_ z_RBZnxQzfe%5Q%DJN=w|_x(Z8=2nQ-LN?Gy-kv*0Ie1HtemW^$?3X_N`CtmeE1T9z ztY~C8+p52$4c>eEYM+h;E2>NFk*cx~dl17z^3o{rS_JG6EPl+`8-jLn#Tr`H6^HPZ zNtna_ey{v_sv>!b_6}O7BWFFjF()wD11POlOk7nzP0p(qTbcc%nsN*-Y@Tz8Oyj!d zPgmkQ+&-mtM(mnTjFRxinCEc8DOHeNWlXRDN(t&SOaPDHb?W=d~ zE&XjhWb?GyubXOd$aCx?`Ak@&m~3j*UCMf!;Naaza)%{||DOx!>@*4qU$aRm6;J!x}X$_iEM^;wI&pAiNa>h5kW zpo$zN?3ns=G`117r3Zf&0TKu6-i+hAK!|(Sy0W?oEm>>Ib3M>dF|X-zh5R;3<=l>1 zbcOSq?M#>Q_6=`p;|=7hPaFdr5ST8OG0h!a^aw&imfgHic9W%V53h#cX8N zU81rGgb$y}{%TG;q-0!CpOj(bo!#4yc5j_Ja|}NjSx7vyMetXghZ%J<#IUFbz{lIW zSh4kX1tHU{~oFhP{|>GwBa-JyBhnOX(xKwt+q zFrS!Je`t){G_O$}EkpAJCcEsm_^eAN6(1UXe+cgp`~ef1v*QLRtv_fGFj+j^rU%`{ z`Sv-DqjPlqXBYG)*gJBH`W7jzOjC5f%$ilQ^E+DQIxl7 zGCOQ!xM2qoBW%5(=e_Yr&edyKCAr-pnFE1O(6C|oQ0Exl;LY$^(2@VF(S=2(=xh zBVNW!`7B*gB%!hQ@P%OFI$X#bhuPU{)&t|8CZzh!)5YxD-BKZnp&Sc_1%=Q$2| zgXDMw%^(tyG7=&q4yhRE?HQUj2!cO7;OUs9fa#+WaqL=XZc@AGnAulf zQC=2c^0oCc+d`k!B;WJ9H~|!_fbRUm;aOmVhp#d-x?xAQ>r7fT8gWPXzz$Fn8+>l-+kuU_fBW%`5 zn&ihmXGS4VBNX5dv@vnb=SQ~m2yfgk8+x722ycw4I~*ktU+@g;AywQTkT~`VlpTeF z-&q@kbmfUBWUrPZ9u{g3xFaqJ>w-HF{u6viBV_P#MgU}KCKjucp81{s0zf7wg>+f| zZ_s(G*7+;WNUw|$u<6Q%z#MzX2=|i)!2!v^`hM0(6RrBe0bne^zOR9zz!%%f?*D(x zYeHKNU{2@7!5wYcv~B;d?ej_@-T!+a#~zZE%~H`U8!rI0(q>4RWD~4pk}|UAT1q$L zStzzn5qB9Llr4(en7PenZ#20G99b6 zlLKm`#KHkDE>Y!)#kM42Y5mz0jZ~TU`95GU0%2w-!rp-w`g4$dR5(i?X-aRy z-UMHEJ@Yb*q;DwivStk1*Fl5`0CIjjD>o5*RW0G4t;WW@n?&xPLQB%!$vVy&&`&s5 zn$yCJlW{v?M9!~wAeta?`LOqY!O_FHlX^|a?2-U0(`1QT7q<%)qj0|rhcg!oQo+F8 zcXu3N+2fwx*YP=PZ-k%K^_S;pH?1-!28P3v!*&FRo4dC=CY=txsXc#7j?E!|`g}p! zgF$dXai}7Js%Z%U#y!zjh#Ysce-=49X&EyB+X1UTqYZ?z#*P6l|GowDU?)Zh1jFtL z4Ltx(0+{?0a(fRvwjbXWH{ra@BT@*WIqqctEK0%$vH9_jS{j*WCh%>2A!p8;vt+PFh*9h5L6sGPEwjJ3lp2+Q363D=2?*Ce`tqS2Wk ztJ(iUT!QEQWRVu~n=mgH#}nsr|9YKQ$4HPlVH1!}$6%oRA7C)a=K-es{c6++2nRpT zA`L(|1UvFpdJA5U+uiD*4x|HK45bkG$(FDC%(SIf28Nfkt;X_Uo?pv=O0Xsg?8z4y5ad7tkk@WwtbzF+}SU@@2d)Zuk1*ZXut`Bf&K(3v>qgJC4P?ViN6cHL21Ba&x7FQ&RUdF{@Gs3_iG(zNe|49bjs}lB zh#si$IaOXvZ2L`4S@Kvztt6i2b)s;=iZ*ZV(Ta;^2~C$k0b`QAH0Z7LhCQ8a&ABPd zS#7ieu%Y|m$R|FApGvce(88-5Kf&Q%*@oA`7ao4e%=%JMBuEG5D@dN$C}ZAK6zk7M z#gitZsHTO+E9DmgYJ>Yu6y)+*wB6_LTHaZk_?MkU2LrqX8mtN@F#%Q+bJ;D2el^sd zhPWw<%q3D@8ys&fc(|c2;H!M~o|(?Z1@D_cQ3evq;q@h>`414#)jSYT0(SBf7jiNx z>Y;Tu)hLKritpoNw94VLv-F=-S4K1}Y++Ti6SK6DQ*(5TU@#TwKQ0H!kAGa4g{&Q| zS_Rp6xkkpxcDNcznJ5JC%Jm>Hxwmk0ohsWzHQ>}Vs|%{D6SC5a67tIuqM^X(f&S+l z$CS#t*$6F}G<}%|jsS4&x9N+8C;U$ua=7($PBa0a!|3Iko46Yd1k5lVP&!+UC}tm2y2V8FyCG+V!^g#qPRw zO@B?E!n-%eBDeVPF!|fPWrDofscV88MnT>u z_w&)2bshqaDBEmVi2XXg$(VXG;|F5QY%3qAS_*Czp?37A*!=#f@iHx9-s#`=~P zBmLc%XJgi)*a^@VabUzgd$KS^`2KxcF=EdjO8?sVHt5=>i>m4C&4eu;{e(LP<%eU6 zaqiqh*|kW6IncMVW|b!NxP4ac3)4@2PWNJ!C0`(;Y0r<1(Cpbjx07x z+nX6zHY{;Ey@0n|pI5p6=z}nj^;Ke#-TgcNBcg zDU+v6@p9^7`A2_$X4zUUyaz<-^plb=oSru}ZMoXYpCy%F*R1``E(uMHdnV60zv$6v zr$0z&m=Iv}LD8?mHg2SRgk_Pd|4C(qM|5+k3{p$raeyGgH?8s|SWu*Ij%r zhTp!UWH5(>2T1cD)nqO74z^8v#^_-GTn2GmAHo|z#;}7U{MrH80?HZY7aTXLx)b>u z&A;{gw&Mj758NTYzJ-->$7#P_+ zgBU|8T|2jo!F*xuk{myLYyqIrJ)9x&K%J!yHZdsc(yqitAGgH!7qi$x=y0i^9e#Z& zTvtpqSp~U(skC?Gn!T|{{wzgnhfLCCiTu-#KK8{PY>yDfQsTpe`v#?nJ0!(?JHSi% zTnAKI?nt}cY~wa`P`Jq@;`fbfMD%G~pJ68&LR=a+o$29!y9%!gDRfM9vd*8rr zUe25Zp@wT7B@Lz;X;iUcrhStURGO&Weu}tD`K4F;Q&Hdq3^Vfh1hD{wY?jQ;h!>j-by8kH2La~BRSqf(8~`9! zwZpLwX}-UKSyZf_bt~#KKP0ZEtUQG=SlkKP&y3==#R#ec(Cv04M1v?!=-=qC5C}o= z_d(Gp039|%r1Ixmi0C@;!-hV5XUv|@gstzM*}HRapL@Dzwv}K&CQFHTp!Lqw2fkdN zSp6!`wI1hKYN5hLhHtlZglxNI#seU~av0D}I3ZB@JH`(!wM-x9#5Ts8jS_neL`{J7 z2C`-YO^Htz;~&o7*t;-e$Hhb?qZbNb_0H+tg1w0-xREIHWJGg;zjSBPwRoC-1rL*3 zGzDLyvll@=6d)O5%i|LoIIQ8IqV@3=^0%jGHwA%LN1X%1=i$OY_g4XmMTtdi4LY+* zmNz8+zO4P;6FeO6{(S5f5_~h|xB@;ee?K-2ekq2FFd&pSb0h2q+6SBBXTTY`7fDJo z7w4iy;Bx{8wAKiS{;Q|sg8+ncWn|fdqJ)=aEcu0LU;eJ(EFHW0Z<#M3UToXT1M=Y2 zz-KMdM^{GeE+il}40@nIAR0)Vt=j&H@d1c~qmluU!MXva?Saa?-3e60aS4)Qu!@*sc)*Es5{HWiFJxCx7n|*6 z3gGheJz=xi2=-_W;eZ_cCy2}4_UAld{vFx{N+W_7g9^(+$0(6cET%sLu8EWzI z(i;+y!f9|tGE7~MVFN)>vn&OkzXc)^2`%$Yu1+B7kO6mc9>uD;W5cD6{;;%Egb9!8 zB0U(+UqLtALw)9J4Gmp`lw2~Ra)^n5FP{#;}i zK$vIpV9KGh?@Jg!km3^y>2mOYcl)=M^drFHwO1E)N$d$Y^Y`<{!Y+gp=XsylIjnx} z?>8baz7U2{^FXit6xtj_0RQXit6hjd!x7M7wpzJ+)m~YEd^d?P7rj@^WYe?`X zoV{!PdFs|aK)EEz*>tk6NQbNjlMug#%~5U?%^C6of=8-8qE6x*s3E?)u-%Ldd#jB=`u(xMp@4EluAhbpKp?~}Xxm;cKBV}XY-lPc^A%Z) zJxD*^UI?&y`yMIv8SO7*=%3q$VgZk03oYrC!{K*d&tJd~N5VT*!AtnNtEU2BSlgpm zZ_mq0t8U*P@(Dp|+^(;rnzLY#EG9V%qh|C5WeH&qnBKl2tkRIiKTFBSj}r_%DBCF! zDIT~SKpGE1GuJeTWs+0}#VGv@R9i^nav%b&!MbrDx*P=TNs+GT6^_e2(E9lUSB{x) zRaf{p`fy+jR+Ml)6y$2y+ZJ&D;adPe&11wB>OHWX2qzc-f&ey0c*&}1#!}|zn_uR- zF}=box(DN|^J-+Y+q30@U+|iD`H~Gmt|IXUM45XDZAvLLtLnXc3VJtGRWSv?O8LX? z6$ovKVHDf)zJ&{xvh+$+azE;*`++y0%z&z=Ff*-r8+J--#kl*hdm- zLicafYT;J6tNCON{{({7`RXHeCi{!m2O#b53#DMMHh-K+1-iAThu!l2LNN<=^+CsS z2dkNb#EGEqg%vq~V!2To@JN1m#-K|AYzo*7FQHJ5w5ov*JCQjx`QLx##8)P?f~1uROcWL{_g!1G6&#Bvf6M{MgiYBnFinRDNC)poo##u=1i%vCMo_;)20tlu&i|&VoZ9mNxhGzt z^CLCO+;*RCB*Ey=b>IdV! zF$r-Q*w9GA7wF(OesZvZb2_OGczF^=T+LD2w#rP3uI_e3SJOfQ&u9BELAQ{dQ#qtX@XIw}_|;WL%q(u=!7 zQLhEDi%qZJ`nvDBb$c8@Jl7#!9PrAB$oo` zVz+txuH~`madyqeVjcm&$-^123-pr>U(@;7^!QAWmmkmZ%+lWS4*B*f=A9lpzCI@; zv%Ow)W|!D2=r@Nfrzy!?N)9qw@U%!7F4%(_=^2?KTyQ$*=f(n{W^NYF#mR8Bvc^a= z$(VOgNIOlgg19bwcxTLwyJ6;PIdTS1U()F~VWH%7heEIKwEmA#iG@KrG(GY{u8^~V zXI+%hI|V}Tg1n}K9=WI?#>wkJ8$%ZgN(HgjgTOK~3E$z}oOt_IthlGAj$x8oov#BY z6h`|8%w+FlIQxKwfNkzsK+?2fr@{;Fo*6(~o4+eB7RGc1in4idNJ}$af>N*mdNHt^ zqz*+NUzSFv1*ass`vhDFBm%xlf2#pXuLH;E^Zua<3wPAU`10=qPEuB(qfs%Q7}{pc zyb>A4VdAVaFIb@Xi;Li9UzZuu=s@}KqF5Vd;?}`E2Mz$osD&I;%0DGj_L6cA_@MrhJi#Urj z|4Kt9van2+Z-#|q_L4u}QR3J!AU@qQBBDbftj-?BKNwJ=Ou>wjGTsJCBAaP!?Sx`5 zmJweVHvu?4Cd;YL-*2OYsV3qK6w=e-W3_~uV02bb+^V8aGr4iXc}|*8O1#M0t3X!D zPw15`7xheW3}~UGtsw4Fy@i&7B|T%wWF}7-=|mW!brtts||F8 z3hi*6YyKG&QY|A?utMT=*SRQ#p!^K>3=9kkMPU^sJqwwEYNO$K)`Y`o6OvBap?u#+ zK?1}e47oxiIWD11QkR!BUHMCa;nd;|5St)gxQ`XnnDfUiVf8UO?`6>$6k~EL_yD*pEangf13}%}30es2nX%~uk9MFiE(e>4 zj=_lGA~B%oypB_Df*kPAQ_%L8xQQ=0XU@rDoK&#GHKEU`7yP)$4R%uA1o&fSYMdc2 z0lMTR_ zci;2yNJgZp1J=FdG6=C}8S&d!p$nndCTe;vIg7cYXAaM;f`GrRP?Hg;c%klFXT)1C ziCZvM3?AkpARw0ayIy1!hY?JY+?)9A*1?{8$Bb2H1tTaW7DlP-$GU(-TnD;yjKVsk z?e;}1r*pjok|o+sq@1M^A6#Yb*d6T4ar!jr(F4YD~0hz8T1m>VOY8|_L@ zKXY>OUT9cJwFQ}3v6i0yc7fPKPH!f|*CSe$CvoTA%tVvn`7>q9l5Q&7{sIn&FPGV1 zU!HhF>;e&-+}l7d5x0Ewf;PsE#z zIIZHjL)RDYye?{F;}{s$b^>;11d^pai}g-g@yK3XxdewhUGFG(sS-_zCS`@T6NUoD z*GG#$Eyz?2eYjCd58+>RD`BASY(l?yy<5a^dNnqqxSzH4!7Ih5lVaO8$YyL7lRuS; zwPEwG9A4Wl)GCojnHLN*8Nv8X%$S@t_u(5l-$UZDUeErH}T3v>Btsl?`(Hme#`|187_U(@bs3y}FhuPaeGx^WD(CV8SA zb5$}rcku0%{rHPQngU3Di>>~)c*0mvFnzO!C(i!5TCvEvV- zm1+)sm&G^P=&{^`?F8B6(fz%#a%q%B`hS@v62$cm%Teve$i?>M66Q<`DG&4BXR%t{7!^f5zOd?5*MGTWYcPusWAUw zs{T==#bFG#y=u1Qp|~*GU1gt$tUksdA`0L_qqVj+p!0kq9Vv+AY!`hT*@KU;TQH|k zk9ULxf`}U&0|#`G^a=$cFeJEPZ7^FzJVD6$!e|1ohC6cEV$vH2BV*-Y8o?}RlAJ?5 zfXtqSv*X|+6wH9*Ra|up#CdJ~ z@T`NS2W!_nM%!3`^#zQA4jc{Y6`@}Q#~wP4kIZ{OEZ)!RxjNY1*3MQeOpkHxf-s+*^5c>sndgvi4xl@AzI~u;EtU86ZH_y8y3L zo-dQ)6HD|a^B&P$D((*jQ97?e&L4C)kn)uExTKnX%;l&jurgukJM*iRZ`Y&`*(2l3 zDjgv87fTbY030;8dAjE6#VPvA`T$_|RhJ9v?YK)e;1vrg2&6*$RvEMkt*xXL?c<9a zieE^{6=p270MRvTB*i4(c9dC?c=9Pq!6IAg1l46QAIM2x!ss!nq6ci!)q-JYhEK|> z%3=wMxr*1A949n_)9xdrNr_Kjv0}RvFZkwAu5ld1dB&2{~V~7Rh$8}mG*#7pEt6p$jS(-{(jB6mt4qI>4=Q$r)xJ%ueNB-shMr=dT9) zzCe6Edv0#8=6*5%eV!Z4ZtYrq2h-D8p%ZO|Y!X-y_)D<*e0qCo2?%fWA6cyPbA#Fy z2%pcJF8v^`A9YFI!7GsTkPb;N(e5CEInJw#xr4b^Y~PIlaP+V8gAv^1MnCd=1h_t1 zaQ_k1Tq-kZmxHXv^(ZId)z+-36KcvFENuE`Islb)qX0n)t*{xQArL?*zGjgfqStN` z_;FOW06HD}s8hqx3m{EI5Qcy-2qrB=lFQ>$4vD0(3nV4cw(jC6HA%KzaLnMd3DG=H zsP(P2q6r>O{sUo2og~>TBrpbqI~H=iggVf{y<7Zt(@B!Zy_UW12$yP!K{>xJ7^+mWGcJU8{?beQ++6(Al# zarpXah5Kr@0=_&^iVqC2O^|>bzlGQFN`GU zU{C8Tq%&;uPt;wc^x9k0Txb5y->eU7yA!E%#91?{0^r6xtg&ypM%1(Sz)+ffOQS@<@K(w^LY9Yvsvl_Y0s%sFI>3GNZ9B+A|kCA;X}m(o7OrD z2jcgE1B|0F{$f_z8yknwI{74P61V}qHGG5gr0%QZQv728sm9T25;=BWP}4x7RjKl) zCOEucLx0Alf3)G1sWcFrlL!s|1jFton%{&RMc`HvKD`nX%c5Tvq90IJqLE)0MIgK6 zsYjF~jEi!3`gg!6(_V3TRKVuj6pVezOn|z|3z+PchgX7E@FSqzCy{r?AkSt>EF1Ad z`-ACYY?h;_C(fm5FXEJ!JS8NZe|K|{(%uJ*Lhs~5doB(I*kyV@p0D7vU)}}fN7<)O zwzJ2AfqLDgM$y~|{0UPdxOF7iI*;{~_(M#oP-sl5nDV>@etY154lYmVQj5&(Xah1xZ}v)cbg!i&8Jb2U3oqaeL(_@=WG=FaH!qKNzq1 zLWI(R(6 zJ19)^{AQ!@p#k!W8@{H2q1|u#aJSYenSdb4cfeWEZrU<{D0nF4LS@`*u~S>*qov#- zK>7XNMb(-**a_}^3Mk}Kax*hzOa>*i%{j8Nl8~w37IC;pWc+I?1l;ME^1WNQ0oM^8 z>aP{XnzS&)Sdfzf;9(QcpVFjL98%G&kua*$6d_IWv4S!qx)5OfZLOYPW9rBEI3!2P zAli!c%C9Lgsq}?v$@^1XZ>tjZRpr3EDg?#7_{!eDuDMziVeQ9yy|IZK+fiqYGAI&% zuAl~n=?2WY(1K^nb_ii9Ha8@U0d(I`T+O7ePuM$opD0J~hXXoCfeAQLiUG#4MY?}) zxIOWXO`c?nH(jfdHff;-Ae#sOih9;$%u1ldL3W6^%Nv>yO0Y0XU=G6jIdvHIIh{S8 zCXU1MKfKlM{>smTym)@f&PC~6%+IO%h8|4j&IWtJk>aJ5HfttiAOib+09YC=^ar`0 z7S)wNj-?o5{SY9fgnxi<>@9V|r&RpjQBTWqMAgE}rnzab=f}weXo?q5O4);4F9~~F z{dbbK@)tLA>R-iqgqL}2F2#jSG0JYZHfkyd0%NdP9mWn6xLs>8MslXi)n@!dj@!`3 zV<3PGoz{!iyyNwGL;~|G09tP98VJsJ^&p@Xf8FDf&q?smwHqIzEHKckxn9@0C&nfKoopMT%6g zrx9$oin}xY5AkMAy<^j<_5B(PSY#MBd8KM(a)tUk|0pB%k}I370dlPmjoYwGRvx#U zKpI`3P_)S%f|-L)`p~{9*eS~(|1zan{*ji8;8a=`%$W${5@)nCmK)$GZ8%rOErK;( z)bn3CCdxfI<3o9i35WEP6)u9b#WBzPSsY|BJ8iK7b~M95`Ip)CIU^zmy*yAgi>Y%J zH4poO&8LYPmm5*e09ZrP_;YTycCR)_@6f`riDUPm%9J`mC1Pz!@u&Q)OwZTWm$f45 zWnHkRsW`+so&Z0<9rzX>iIR%Bndv9K7aLxE@%UlkKc8e>_uP#F5s4yeL%Ax|j*`+rIcs zu>dvTUh+FwyurY3ydD_=WqQ!?YQ%`Nb3gl0vqN*%RDB3mZ+! zyHm%(SLDIlKQ7*{M0KXD6-bzH&Ebnd5|Jb6Q(7FBM*D5|*Z`@i!>;oo-Sw3Hh1OtU zC>RbNkwi(|_0BdmqDFXBFjP5n7eUv_Dio9yeyGfBx<0yeS9}PX*b+x@!&g80UAE+0p|rr65n%MVB;14 z=hLP?kciSK0Cf0aOdM$pUYqa?118`(j?<%EB5Zto6%En^qp=9gF!&fJc$07K7#*j5 zM-{DgD`p$}LPSmMnD1(}sQsAwBMxO8P}TD?tk!JNKZ4~N3Y8~V*fOdMRZZ>DP3OK+ z>*%+aZL{*c+3lkN(emGfl4LU}95O_Q`zMfH&ebN}8u*dv#-?xSGY<=$h2S4$9 zb*Im3-}KMDy^Op)G77H0(%$bOLloGJVsy@Qb4o+)=W<*f%IDd^a7|4uLzry~prz>1 z-jWkPkl?v?G+>@mc??>Xppn-Oea_lQP-nxoSPLQ7FT+v@L;@wYnGMtJ=|dmkrk}022#n7N=mQqTss)*Ad)}*@E%s zQM|lgHADXQp(-(StVN`jHx8uSl$Psvfl4P8cW$aJnb$)jk&@?fIIrnAplh!!lc?AY zU{HN5aj8ah!zp0wqJi$^HncwPb&w>Db{ILXPTxuSW`&Kv^UpMsn4ksVvnDd)cMM?v zE!WbAue(1$x%^HjUD=3Up{b7c&k6;1?4RiZG1OPb8$JrGt^)GQ5>s2iuBY;{X46%c zsP9W?F~bt4+B58w9toZLM9A2l(+YzfXvCo%ZVLnl?IPqS`A@<_y8gK z7K#iDd3r;6=(hFizQ116=2!l2ZU}9CL!oKUdhMc*m^M{FtKYN=m8$ER+hk4_7Qe?k z;sOHjg9dQ%^#B2ai&jUAj&FAdYI+BemizZpBEB;+8( z8ifufYt|#S$|}%X!S98Ks%1ZMrrvFA4;{Q#8n8{Ag{zAT))2vsk3%#hp1r|OG(`AQ zImzygA<_o|o63@HFnUTxd|3`Qb?n*s->hy7C=Prrj@1DoXn#iGj96@-oxJWC48t+rIYxoyj$x=jXYPENqJdV8L?8jKcFYm=Hl|1P<@| zjYW-aK#JSA^sbPr88(f`K!5*`=WHHcdFYxh*nO9C&R%wm@!s;67Jr8y|9G=&j1mLo3 znMN}_Ig^ligvp1de2hkG)fxB^scltNGedJZG4NUWuSmAdfA-G{Y~6utR%@9hV`inJ zw$jthh7$PY{rqMkyUn zlmdWub|2J(G4UvIsB}GwiYav*%v@ejsIjw#>rhOaa-pPz>Cwrs zh~ylOw&Ja4ZP>&M^m90C_?M_WF2M{vnv}zY61~zpGHA!@uwGLX!TsnsNH(3~lRZGr zf3mZ3Yr5%nWLcI28=1Iwf8~nGCvr zm3aWPAz?jrI7I80cH|>oiueEeU*I9b>?@qWNG(oXULPz+PCQjV@EDuBO)Bnx z%>@2%>gzAK0}2)k*{cm)@Sg6AYElq1&Ti9b5+ZW z-1$;#9IO$j{P3LN8@qIGR||=%>o|IXmTTvRvg{g+-Hg9Xvc0oS^@@R9`vibX{twh; zwOA|b&{`joXh=P6vl*_9)?lt={Zw_Rs9|^t{otH_*=Fd zk!@OD9r$MOTGFyqyD-U8xuR-hIZ0A6@Plrol}jUZkEIxUXIW6?$T4sA3e6yGyExm$ zCa#Ypz8d9|gN%)(e^FZAB76XT!B8hdXU;spypbXXi9G8JN!=jH22nwD*qc1;i@tSw zcTAN9SViiLHJ;-Imp^);43s7fyHiV2nw@-EKuxX3MjznCErK!ai>UB zw`D?3i0)W&^Hj=;p?sT$xBThW<*PPBQw&oAR;E(eaN0Tr7R{*|W^HfCvs7#aUcD5w z`aZ9Atnea#-8(#6inkfw;N>-%7-Eb-8byP~>=ujyA$M>SV)pvNvc;ILUSl*on>27a zR0oKH!jWL53e_%a6)-{)g=@WFgowhUT;ST)bvSRg zzHgjhd(4->K!#CmpW2+?QIHTG9Q7+Go@)sKiMY+tmW~|1;7{QE=>p6d=5|MX2KtuG z{WJ?I0{5xB@>aO==1}``ZGAA>7RP~!STsc>%gO%q#EjYLlL;s^05VtF-AL|0y#Idy zK0v|0`!C#U`WlF{!=^-uk7x%4xfUKwRsT73q7`1Iv8q^v zU}S?C3>#qLlsNuY3dfyNEPkEck@!_SG~EJsQs7P(xHGupInhVop*zZ#^Q0652i-h^ z^DhC(JVR?M7?2gLr$Imu&rO^$tD3uX7?TBVZ?@u=rgi~}h?K}& zjE2lO*Hk7qnMC&>ImK>1yN#_NIEudDO_65FD}R(hsH#}KY-2fnqUK%6Mw)Ae*-lf+ zMUa1eljjR_uJgO%+3gDzquK;p0~G@5oq^Ek+{Nddpi)JMZ?jJff1G>D+6=@JLr!sb zE3uyn8I4dXVs;_N6f11whci4oxYo!ecdqi{wT|ZhC&B2M=vVr06aucoS-sX*lQ;UkY zjg^@syyk=11dxaL4EjHuI&o2u171|Hy|j4SgsHM>u^r&kMg-0^Nryu*=Rz3l8^LEOGxyfB=}#(LA40)*wuHv&2*c zDl|Jw4~sq|!CH>9=Zf$4?MtGP-3iQqZ{ce3;264*qtv_7Neupwgw2*A<@!jto+vf3 z?_oS@AQ$6we@KBIaHG=F^Yk(o$$A<{c|Z`btOUSG${TFL$YgFbbS7}BR(7p?kI74r zmO-D$gf_;o0e}btN@4+hGl@;?6~y`2N73*zRnguLy#3Ct-B(?)e2d~a*WZh3T$}qb@BJKB#02aNd@Nqi zfes8*e?|*aLf1x0geGIVFZcJ}9`3&(#)@q7%QQ&~{Q@och(>`^Fn%Su9uOgB_1ApK z*@wYxoOEXs{O3pQpm**^C-mclUz5lvUhA3%T-6+> zBB}ivbB_|O6)89FY%M5n{r(G?f+R8sZ_|aLe?e}j<#_PSxB$l2ETc5FlW@%|QbF1B z9+*EATmC0oA$9IXZPOfxhnh+U;C81}%k#YCHrujbZLfBlt@&LbP5|@L&)}v|W`}OL z=IWT}kd3~;2(ME@V_-_tDP$%?Th#s~8napW`vB~HDDM7-nENU5_Muq&(KyS5IDoW& zfAO(4NH~5Sgg4H$%`o0Qdzm@J9Jfg|i%!?k*klHT>}#WZfGM!xra4`5yd0A#2(G=& z509KYp8$x+SQS&s9mCw}-)xwc4UcLvXP{`OP&q1fB3?6^5!hG9?N>{nq=fyF9f57GjS-bV=VhJ`35N!&sB9bM~zfYTCJ4p!( z2!b)q=Kiqk42%vxVtoi)Vsiez=4el#4;I|gSSdLz8{%1Ga=1+|(mQZ^RM=H8=b}{( zM6*Zt#u1?D2+H1NoV-y7Zffzpzx$)4W3v@&d4Ov8TQL+kq1Hxo;ehqEd2M#Y3+ZF1G9;?yRvthv?*yH1?%g75fY?9F0Bc zY~$G#B_T3t*AHV*CCz9uxs{G$A3e1i@<&aq7Y1(Cv|4^@wUcU>`_xlfFLwWk8C8Hk zYC=7Q$%^?j?qRjlX%%Zen?_h)eX*a1?F zn%Jg+wu9mD{dOmf8g_FRM84seUIyfwPIHI>5Eo|h%~F#!oRcKVj|@`af64^%NV&%2 z_@?E>Y6{hSv%lw7e1jnnR@ZyA{}x2@hi+YY*{Yr%V@8?OP12u0m8ON}av?!$%$5=7 zkJ?j-iY3HqL6SoXuoQK>Q9Sy7lWl-NH9*GbV9NsU-H;5W4i-U4+*1J0wFQ#0QLrXspsmJ5uGybkUV{3jHdT zv?GE96HG)hFI_z)?(eVEMfMXi3ZHIfu!$z~;+1PYD}o&MuaB6Ks&oF+O$fBmWIo(t z&8LHRi1i~l8FJw}L}N=lpdqC@NJ^KJNy_1f!H}m53O6^Xs>G8qe{@`1f;Wv6^A6`$ zPHZ4|Kfn8;_*r)Pw#6s(zCa^o7&$(*c`)#lFk!*3GD|&7E+&@!+(G&Ec_Tv5jy|`y zFHF_v{x)^CnpeK<7f(KJA_#Y*Uw$I|U5^Te&&_VNr-65+v)8=R^wTc>k&}QZ`)f>s zx6w(-^10rj_8iboe{^@4SDJrX<&(rdMuCMr(kE%`;S8!)*xcWl#lUOq*7xEr&Wy2w zYRCY*55NyGfRqD`5@Il2&Nhd91um)CSB+g#L+DyuqWrSKT zUW!!-8WJ+zq7oL8kcHnL!7TXM2)u}2!fgOdxng7Z{VF%tn$8%+!eAH(wqY#H<_uV9 zPrxoZ=)F)pe~oqqpecRy5`1RRss!c>t)s}r9Sp6&C6fw6#tyj zm^=@4#vjigT7T@qn9(QNk!v)}iDr`?S;WTo(Tbxf( zfmB+O@i@Q920IX{XP#bg>eHmIso~ttnZy2LZaY|_4uA;QpqMXVlYNHWvyCL*4UI)| z320pfe?5VW$7a)l$D2B2Y%jQ(YytL5)9GEJ7!1jhR^rEvwy_qIcJosOnwNW^T=K<4 z*xI0&>HRffxp?MT8x!@>kWGra2u4y96gsd^-F9>{Pa)<9+K{0g6=kJXe#;W`5loXH zc2htGvU{`_lM@ew&H>3EWr#X=W2%_G0SP%ee}c_u_tC3dRwtQ2OV9}&V@Wq+%uKF4 zg=?j)BFq4dhYngTX@OUE;7~girnR~i72DCbqnSuv=<&n>;V>`3z%*mFO;JK!$DxoEWqWAGu4hH ze+-ZnC>*M->W+qQccy$W?n;8P6YfMg8BU=-^t=ek8WVwvN$nVB?@(t7uuwz+d8Z2e z?4eAcK-Jh(iMCpl@`4+2T?wqmMVk3UqmkM%9&n+`F)ARHV+<5nJw~XLI^YgS2e+bUPV~VLRPQSzeC(6^4^U(C%gfr@J;i{oX z*J`Y`7pZb0RXEK-MvkHSyye$tvWLf74faMvWyib{WkSg_B0HZZ0UYEU4{haNoA}M+ zn!UEVP>EdJh4ma|+ZOn+fuQHFZm(>WZ>suJ7dOHtwn0;K&FB8Vg_0JQ2u=EEe>9<0 zUvJsTV>!m9N6$t@IR3s6K%c;;a3;;@NW+n~4#5{i-pP4YoJ*(+gb+|7)3{<@x1 zvB21zihuWT;;`tkk*yQ=WIJLbDs<}QHp`fAg2=C2PULLT$clsrZCN78ybei&Cs~Ki4%*l@EKFz25zFui zLNBH|#j!dK$(|IwBF%XyYsFN;P0@q}%jZ;(Q(`Ywsvth9;Ealc>%K3sCG4d zO-H)McQEPf4$YNKz6Q;(iz_ZS*VHxq3n2BvC}G_ks^?=Hv3>ZGqVTLsVS&r-= z({&Mmyl4QGs#^!exe4QXw5CBw$&HQk){EBNNl5D&ZgLSXzPcYj1Jk|VRd}ef9=~Mr zOYT>twhr)o?f8IM28lMQ(ywkZL^v(^Q zvd;P7adsUrfw^+oxhOuF+#(0a z0Q)=)sRAVlYMJcVOTty`n|mWG3$i?;s{5~Yo*jZ&G=@u|ZqnH77+=QXPwBPFIxU7Z z=AJ8f8-Kkvl0;W%TQ zB1reQEF=@THmg@Qo#es@=zPB90MNK8C><*G!#*Em>$q`8s}BNGULL+O;Z9v!rI1S< z4|4lors8DAFff+gzf50S*Aae00zd1w_QK?!EYc)om`}Dj8{q(>b4?-eVPd{R`U4Dv zs0t)ne}&SP_S?#0FlaIwPR6A_c!q@rwvDP{%|bm@E|O%kfBcGV_K%-GZ&g?MBMs?< zy*M4W=wKZl@OtfV9lMDDy2HY@qpgkAI~#-C(1QP@qT)aVnfhHFOsE*zZG0ca@HWnx%bEvRpegx5) zSvv2Ve2I;~3?>e4o(t#xuk7VfQF6A9BFnYwa?CSq`>qpg6>T1%0o3k5^V6UpWnQ7_ zAuBdXAJG9MMP1F)sJI%Cx>aF+RBa&W@KI$$z=mj8$8v=+?>FbTsxf*6`(+cq zhSO8aku{&6Uzs6WYla-|>;Y4>nqiyQe+UfzjoJD)W~+|bsx!?e&g;P#t8WM=d_$<+ z(A!wY1Qq2P@q;Kz6(?BJc$g7fvCHeY!Uy!bno+FjcomrB1c%Oz+AT$ZMju=r|7nPd9AWyFsa*ZeQ zLoV^`OjcbS{o$!J`oXh(q4H`^+$BUMAO_FFV;uW9(xLTW2p1XY2uBzyM}--B3hFDd zs3=q{Cnqb!MFymg=5M;3oM-d$e>LM!0p__^L>M#MNNra~rjz*;N-`|zLsfA|?6-j_ zM8DZ+9%`S5f6BwBc>B~q%;rRJ^noc7n6J^z#b%Co56`v}B;?x10c=B9p{+gsB}k4`w=^e_ew4pcP!% zikDVSF=4Sjx=(&oRICVwh2eY>_|ZuVab>AQ>7%8)XfS~h@GUZL;4Pp?!PU=|*&Uk9 z8)_k@neE0Q`wO*B=OU}4`Q+RXobiC1tRx5vXI892f|hV!1Oji>QofKC6Z*>UB0Iu` zR_YZNTWyT2&@)k2>p2@Pf7p)*N9y*uP{Vc%X3yG7Yn@cdl5s3Dw#)6I=j>B5sUtcz z#BwH;!qWZ8xBr%xyE-pa1FS9f8gLbCd7)Ko@OWpGFmj9K>;k9641A%m7&vy!pJM#ngdY)zLP@ge<%#R)n_3hvaJFG zbcQ_7<0Tr6rC^PxtwPCnnSH(dAVtnBNnVo|l$uy}&|mnj9n>w3``SiuY*~4V4WOe1 z9CMtWald87-b4)KzvPK|He{20w2RY6JENb(8FS3_YQq!$H|5p#2c{~KIJ=ybYv({iMrYzwe+UcTP zB{!|}cr@WS|5uO)L`AB`_^k7VPXi%uAKmVI(Kr4lD1S3`NQi`!>TOD@c3@89&#fsF zU}X-BK(!5Fe|k6i*_%i|J)JdS-y67uCEmouUm;r!=|qrSwyJeZH416&_3dP!SRcfUid)7{BT9qdagnmz)WN9k|Iub3pdCDWH;0ku? zT)b#Ve?K_MKJg^!RcG*2HS9E=SS6eb7Tlk%rif9jl;azeja|9}Nib`2jZNNzEb{!s z(0sk&jflZGT>(E>P+_Fur9UARA*tHVh1j)ZMo{HD(Nt&3uns6Xw5PQe%=PxU&|%kh z*$)>81xm85Mz*(s`EtT+6mGQQIBsquZHc(nf3zt#AS;U?{8Fv~`wufqC{C%E@$Yv= ze@nx-7y2n1IM8pG`y@Wm6af-O1WBE!R_^$RntdCiZ_ORp*&=CEeAnZ}brL%5!YyvO zKt2B)3c?w}@MV7@M4V0-Fje&JEvcMsvKj@@A z-su8S?*|m#IJSc_#5I%jhOh_%)a%rGw6|%3zAIl=gq*WXi*ZJYwd9v2*(wP&f97+m zSJcG!YE`{v<`i9vzIOLkY9VuIJDI#cCu(D%|OSKRRIKbY5|LEOp z z@-N$m7h1JX4LBvmrNH?7iK#svFnsRdKsdr($swU8JA%tg{Om;8F>VUIe}}sk7!N`N z&WWpE?f773PED2dh8!LW--Dr~)j_ko5k^~4VT<6nwx^a;RF4)AR029?J53_{)JY|# znapuK&W33p^gJ0@_>FX{o)mlyuI0gQyVvb#>G)>ZXBY7-BzGAkYy0q8eA1bc(`kRL zGr1#Nx6My-%UVViZgdv;e@EwZnc!`iP!fgcN$xM_WE)AsaiqI(fnmyWVja8*sCBFI zcHQgagIA|#Kkn~7ChL$H9Tb>jXV$%Klb_XBhQkTz{`)HZd|AVPw)ZVM5b;y=ko?TqlqHf0(H!>#Nu*dMNvKkk(~IKk*Q`9OchPhGHo2B|-jtu!9-OPD zU=5GXwdjTR=7bNde=#-;TpTa*?)we`2cF&7Uhi_aMA&*cExir5 z!Lo?G#R&P@`T(fBJgO4LBUDou;}~ka(*B|H^1e~n5Ob>~IyX?^I;(BPef2J(yQAM# z0s4yN*!ViH<)2x{!&PQ=_Zc`RyL(fAOE}C1$kU1%yfOz4e~->~1=r4%l&%#1xet<5 zn+d!v^_wbTYeimsu_oTE9$KyG?aLdaGGuodP$RuZjv*R z%z{kT%T}Pge>6rHw-#Y$w@GYiffiFKDfpjqDgGHgTL13(Onx+^*qRte~|DmK0Sy(h&Sjcjks_wE$ItxT~I^ie(+yXdE{N+i^OS zB$b}o9>2@$g2F9<+lA0}kmPHaqOM~K)^-J2J3}9nx|kaBPk8PfTYrD**;v(^d#d3~ zJr}+qe`oGB6rqkhfty0vI!_h-Msk0{V%@1rm;-&my`JARom;8P+Q)6|HYSL7)Vw^; zB3VY44Kh{D`xzUVL&uUPcQ66K{vJ;i1U4WcTlrZ=xrQ4JP*LO1t*PdU)+p{pGjlwP z46J8_N3qhzc&>?g+akB!ukrG8LBfiWgvM71e@HD|BGspCs2{8Znqk{LlRB-|fX_`l zBn`ktF7f7Ak5-jYcAn~kD>AM>0cmwH!zvn3^dS_(LRbwtw^$<%=3{9A7jYBS0eOVw zV5lubaR$+m-HP;F4v@~O;nNZ14FZov+epHMp9VNZ29m?~AQiG)I#twZV^vE%)8Qck zf2thP(|{Qgn(&IfRnYKq^}?-hSm}4gg+|r)6>c>W$7SF#!h_i`u5NB8%6e;A&h z&6Ru4vwQxDtV1sD8W=yTERyHX;OUAQ)-J>pVfnVo_!;zvvUAV{DJ54r*yk{#o$uAY z{V2oek1&d66WfolkS*nrjodl1jiKFZW~Ie+Q)_8of%hQ8>7f43ww^Al6fXxui~W0< zrN~l-!hH`#MyRJ=v_BkNj9Eese;$SsZz2%`jD*mUq zMe#ayX5ZHJ-F0y}>zfb~oTw!Z_K-W?mz)6ji3)dBmVhn_Kwj;&d2)Ou>@Z+&-Pm~E zJr<=3os4Dc_|-BFnLp0kWk%n4CfiCr4|B&)ND`mJf$PLBzfVfm<&CcGe>InMzMYlF zY+sy08?q@*T~M+Vnh4lM1%>Zu?d_h3$cl9rlt89c8eX6e(`Mo7Z1(Ata)WDE14VA_ z_%K8aEMy_t;0vKw*o0n*Ip}(x2%Iz;Td(m6_)Y2WN;38uXKM~>vCSY>;*43{;jUb zGOLlF@yOX4S8h{o8}|()vY%c?MA6FgYcg76$0ueg$bd@DlXSgf5opK{_}ZP&jx0UPKlRFb^Phbb4wJ*)j;O?i+2-n|Zx^iXW2$#Ta&E9k&}VS%z%OJg9Ix z3f*)J1Z%ON4F$<>VVY$FUofG&gL;%uBks{hAj%ROjke0Ph|?WO7+gAj@;Sg17TqDy zp|tad6r0;qDtrOjeR7?{PPDnLBx&F$Nz;Ozrp%D|<2zZ8e~@@Xh7dSg@s-LEHMjg- zqwp?uoTr?DiG!bocu8%PdB@9EcGNZz{M^V9(UlJO5QbJoelY_tjNzs4*-sb{E6z5+ ztCC)Nv%EtnKm((P7T&FxV`}Xeo#GOPkk2O1NDMm>h_c2Q4BJf;UX7gSimTTJ>#WMN zWrh53$g2*+f0VY*T_G)U*KsPx7&!~kI;35ivqzD9O04;nn&(*ayj1gC)jTiPMA2W0 z#1AUl%4yw!PQ(q99`{_oJeQZgw-o^U9$?wwpHN3*A7jDzH`*Oo6Sl3kQ_YH%f{wtd zg70KTiZfFS9DbWBBvmSMY=NC{F#=jwu&9f>voe-Se=x+iKD>B0N{DYdu5Vie!Ox#DUMP2P+#^5cU`2N>)YyC9J_7OlBrQ=h7ffa$&nTOf?50_Wg zgikSf*0ff=Kq_T{wxhz4FSbSJH1M`lrGbOu03e-l9VHN95mQe!qc0_YOkw`gbM)@* zJE74iNdN+xIoFQAk4R^$NH!Sk0h1F7Y6jNze{jW6anH&j&bn@hGkrUuSsRg>l|zJS z>7g$>+=CDoyZP+a1mAIQ7`y;RL+I%i#5xtqymF5{YNjpqy+cnG_Yb}1=K5DF?ev?= zLCwipXWGwZD6uUlwJrFQIurh~)=!)9iv>T7r)0HXYq0Ox>W8G3R(vc)$w{qm|LPe2 zf0v>(nJ;F=-P)cqICQFX>^O}=Cgj0wZxwQdjFZ5!WSNe!-i+v&L-{)XIna#w%pCHs ziI3Zqra^Bqxa>Q`hj%GLq6_{w!+orRssWI9g%O4h0Yd&a>=#Nn#|55Fmrf3U_}UAVdzIu%}1IrjH*j@+3?FsyP;Y(8>@ zpLHFnap;hz9H+Y%L&ee%JPMs6G2w~Hla#JXkE=ar6uNMlAl94d+H-)-CbeRtxt$%rrZs(brCcwfxrU%f0GlV zX@>*au^UPsFCHbUn%kMU*92igxWx(gBJRfe$}EJS_7cGTTPNkFBqBOAMKS*D=r3HgtSPSxz!rtq#oRw0>k9}B3HAn0e`QQR z4&cUl)Xr?o$AQ=~7w{6SK?fsapzBWGiqv^tBsSa-K#q5oi(I1JSb#{nE#Co7-9a~&Xsc2QNTz9cxJ2W9LFqFfjyJtP8ifqZ;T zzM&mHa_CT%Lo>=H0eKlOf2i2LK3dgL+?CVTqbZ@3=Quevxz0JpP+*R{ma9S3Y)3Rd zzL24gFnE6(4gX0o2XUSY06bhm@B?r2j4s^9RsO^JWQY%RY&SXEQQgIC$P-TFB#(`oxFe}X-->$f3nn~99x`^A)-TP zG+ndreXM5n{9`&!uvT@u)bZCSnk`6)`hdBgsoH7`k1K{yYg$v{BYd*w=fiA5`bya{ zYsudn`5c(Hn*kYw%yYEZJUlULB-0D9~L?CphX~@nL50Nigc&v1wyGTYDJJx z#~TEZ7zW}+xMvl#@Ljaged63wN~Yajlp^=~_!*>>fm`7h#b+Q1!JYnnPt;&CViJDx zm_bB=Jxx~9evMXMs8nZRU$U@6&9W?X>ka;kD#pX?V$rI=e~JsQGN1?407V$w!BLjf zdIo_lTA}lin=O0yT(UA8T-g_4AYFgI25<9@CdJ8N<6#r zC*a7A$e%7qbonF3_NuN;VZN$r!$;(%HUg7?yx@1L{V)R|J00+3pimly8cUrHR<1?s zYgt(jOW)2kf0i=rG7@q!cbvC&`+n@;c|&%tD|SdiS5 z*6v!b+%l@*VS@Ybv}x~U`+cI$U&0AOo#zYeHQi*_=>B(lA%BzZgQ#l#-ap{>g;(kh zDoR;7e=q5{`;bWzGiMs)7X}ltpF?g11VAJzI{pDwDtLS!{}8&lSU0rFI|?*kxe29f zvJt-yY{ZW_A3y4Jl<^a7L!O+5;TBOdql7x&D=I;RlkiSagrwf(!88_&uv!dd55b8Z zzi}K|?nw-v0VKUYdVRt{KaMb9qT z@p^Tw47`r<$L|zcaZ|6eIVy%Ynrki5yexEIFHyXMirFk6D0Wg}T=J9_UGS~|xdlh= zfB#F*AYHh{sH!1iVQg4EOYB819HO8_f%1I_a1}N-WnlpO9C<+az7|41D^u7ATq4D`046*vd+ZvBq5Z>|tqaFfugA2I5O<_hLaB9@-hp1*u17^AY9He}s@` z**Kq-1(a3Y38CyqOb}R(%~#D$=|$tITFcopU@#H3T4-SQa0-cNXY1q~Q59T^2;6x5 zMeWRdwkXyy+WfR8l4Aa_k6BOqZajX=rkI2MV7H0pX z&XDnUlpw>2edYDExl>wAnuVa>f0<>B1#5@FslCLaZXT5eX;{249&}l`>+0x%RXJ7e zx>^TUl~~2}u_C|98mUwaEXUPB(9MdOVRBIfLcy)d|KK~EP^SxntJ!1|$YP)I;L=i>4TGY;}FxmuWf9;srL^jSo zapde^P!_m8rhVkWAyFJVIiZ~(CM!xIn(9*wVh=1`ln(y1Bm-@ou6vwH+)X})sK*7f zNXC2MgB9wEZfe|^#M4DM>@(1MbMX9dzh&YwH<+Hn;`&N0&>RF^0p3o>-f^;)^*<8g zUiFx5`+vDj#`w_X4zBG3f51%yjQ{_2nEzKsJMiMBp~0A*B{^PC*yK}TBt)DA(KqmF z5ZwptSks9+18(FsH_1{;{smz&)uZ1*Pi(cqvu`eLisV+H0GE?j2|UE+B5f3V;{w7!n-uVo#% z=S0cA2Cg24+oMCEO&gaEE4u5dw~Ms6DtgF&;#051?&=t_7hSAc(s`Pyo=g~&SY%WM z=cX4jj;EP9Ia@U~dfQvMu;`v22qj_Jp;v{AP*b2;EP-dvmO7fHndj93B7_btr^;2w z2@#<%`*WGEH9|sIf1Ynm2;m@`jq}?F#AvAE_!S@CfOUTjNhINLzNFZCO?dtKuO!fC z-+v6w0=yb=erwzzDj~S%02U*+J}5-~fw4_88O>BYGK=ZeuZW2bhZ{zluu)e=7w$<=pWLa}%_}8i0-7MJQZIgY5B|Zmg9oKJ2m(Oyd6Qr*IF4AY2uk ztD4?yG>IwrD~J564EpyAh5f6^ZtO9Qbc(6-dx5cPC`y2vRIDstSIF(74<~!Ul?FV= z9mILK-g6Gqr;<8z0vFv8UNLAzIqx)V`>W>O2~}G!e-Jd!umpuANg)Gw8iXHIPU7mV z+;w*PWW7>KEymH3t$4qyL*)H`h4pL4j{AGS>4&4IMozsI#FbBuZ7?fdBJx0|F-b-r zgI70F6jZX_zr;O4@%w&7KVSK9gc)L3M@dTyOfb!MZ3IeYmMdgPM;YkdrF6VFA1B6( z-HK)oe;zpU#EJjoWG4<-037mE@uc!i+%CKdsg51_t}g$)q+jY?|T zUjXG=1LODKqbKd}e|L6te0;KhMi~!SCi(l{8p*AVf4E&#)&4I~O9u#nGJSQ=TmS&F zb^!p88n>q>495h2#a!!dqevG1-%`IrX{1q-UE?)&uD$XPLL4U>-`e10r&l9HY+|Ee z@B;2hy4BJ?#6ICZ$(~b~TTv#)8CB;;w}Er&)K}+PMNyJORNo9O)eKF?n;WX$yD~a2 zp>IyZy0bPvevl-htV2(lTdswaGxFqnOM-+*Kn{m1yl;Ddt}*f)(>Jt*Z8@_e60FQW zT=UVfsDOY>J@?6;(+0;@xc1$Em?T63;ysZm5|NqpWV<#t7LZ_VM^B$TpNjj`xBPkB z)59a$(!hhJKhd8O>6p_6vE0yqB?~hk&(>@337QP1zP-XW|F*Q;b&brXfol45Pk&um zHR4C0+2P8w-LOU$mN~QC z`IR+4+Vnz$OUIJdfP;3%hW6-K5YM#;z5Vz~u2hYL(1AKpV^QQ6?N;yn!Z4X+xpqQ3 zYH#j)>lHCqE8lyumoVz?oCL2yXe|ltu?xIG{o{v!j~^UwYC7a;?M@LnV8BjIpp8Rp z2%$rN2_QyIBy?O<1pcDtTytrWHVL4A?z|3qfi4^#{2EBV&JJoMZn#F^_M+~a?#x>r z$_@OhUC_UyTyu-r99r8D&kj?esEfvibkoD{(G?+I?Z5`BXg`@w0HPdFivoTBN=-1n z8=Ap?bI|_&Bl^`o=)$i%bk7vK>sNyiz*y-6;NdbbR@vG=*1^u z`o8&!J`?p73>rE#`xZ4@O`$t!fa#t0^mG`1NjyrFLtdbn&ESx~(hhw~?tH^L(7gz9 z+M;6zArO845#2;Lw`*%+yTo3ZwjYBhGcO*}h;Ic<*ok$0_Cos!rdJ06@U!(7`zR)+ z!J}@wf#rvXD65tl5uqao?X2rzqUEAxqw1u@yf>sJ#$8L>rvpMQh5ktG1TJCJW5OSQ zo9-ql1L&rn>Cg~f$G};~yD`PMb47|2 za5rrP!tBN-XgG!7_y~9It%W^xFfe0tFlIpZuLJyT^kunuZfN@Wx4X{R=y$b)-?0IL zv0mN8?DhfE4g!Sd?E}h9G)NiGmQRp>yOzxuTL>}Z&k9;7LyEl0_t zjU7!hNE@}Zs>hwHcgMrY;A)ds+L=hr5l#m`1OBw3w2YCW>%#%yrhgT{OUO<}W*B-d z+{M26pMM(NcQ58M*4*RtF>^jrc_ z=r_VyeK(b+aXD75dY#|)aBbiwmypvP>y>NjTmo^foyull-z%3!zcaeI)%0O?*l0Qg znjn2^wSZLTvEiIcAPP3c7RxPvxVO?&4Fwe5*Y;31auemzHA&d9iL zMY#F79SVUswZl*2QXii;mA#!F*d^qzZF71qLDeyVjsk!6F^PqzWf|o-e4lfm+#x!lcT6uoRo2QJGk?{{*QA*+J1Vx}Y<0%3Rw z2rmG=I6F6VWdLP)0(BREpuk3S(}jwcpRsua!hoXen@(TX;~p@eI}c;ydZfwnS*qT* zK?4^Vn={iVz$+m$Q=V}NM1hV)a=e+TO!V9CnDyly;Oq9>f7_Xn>OIc9cPs$<5shgbLY3=PJGjmkWXsKd5_J3E+N|sdUfR49x%{<75$6csP5gsCdmzW z&+)XjoQ?l7^AHY!C{0Jg8KmgZa!<~u>MAZxnQH}`<`RfPiXsX0Amh`DAKDHK`719+ z_r}`WrApF58qATetSI9W>^ca|_Xcwm&ctu6-x;enhT1R9&PAl!((8<$aS)GxZU{1yeh`|xHy&I9k%+0> zLiyEI2C!1nJgXMKpstylE-*^XGp>Fk0+J^Xg*Mkac2TG)8(moYuBu;bOeS4eS|(W3 z73(f8fhfc%R>ESMfjjDbX`Jj6!GKX}oRGfvXv034?DHJxh)lSGBUqUTrYM}6tJ@hV z;Ki@YUk9)T#7k5u?^gY{c~rslvXW_+16Tf5_?v+UN{3HdUS zn!K4Jmq64^krAE`(Av#y@9yn4QCYNKG;BwLx7rKa*;G$Cv|IvFXj$QTxbXDk%xG4L z$-rVzp4ygLnoA%MZX`Ujw5Rk*u)xJV*yJ>~xEqTa7iWfY-x+k1wI9xUNWPuS8(H8c z%2x}2Zu;E4H9P`glZ%{ic0P4{Zm2g3q-88sDg!@0C+fmn;Vwmo3!FzF40ujB1AIK} zDFayZyV6P*wYLBt!|rF;dxzZogv})o1w13Xu!qd(-3~gJih8$?ou9%IiEBNY)8{RA z&La@^9wR550>|y==E{bBM(K`ef8HAFIcCTyEs@K%6% z1mXt9r_zn5z%-n=2dp{l4VbboirUo^~_P5kgx0sW|e>vbT%_>{Ft+~ePto4Dz|eahwF zs*kcs2_Nh>-(LSP1^!S|jElS0o3Dem=o(qcFfg~)gIoepD-$4>Tqw{1$7L&hecb6O zvT-qjSAo?{9NBOmtL2!I%*%#c0%7ZaiyOIwqGPt{Oa|SFcBjDF>ggW9n|IA7(bw*L z9XxXvR=EVCfCHvfHdo<|ervDzt|=0{VT=bBTdA>2=o|vk3P-VV@pJQ8Ix8uCa7=DK zpXJM*YGZ;DjC@_gY_rEMumqyUB6tFhlAFyVb_)>Zt z7fJ=d`6-5Az=6*NtiJ;=ohu}NcsYRep9whR10JcPH#W;{2aLSi>PRkuP{6C{ii=o% zP~M(1Zb3|WYbA(T0-=bff0%qFGkK&EnN^4B_Z4ThD!f#WWC z(iq3hOy1c9mh7zXoOvAj`Pm=)9IZCuKc~;-CPP4#ylEmKN%C5%_$Y;c?XpZ(RD8sn zWF#Ut8!D^&m}ZbX6=mxQGDBspee(!*D5O4K5p`QzWc|(Y;HZ<_low8s@NF;5Mp8JqVthM))N`)KS4G-fy7?_? zFXvhLZErjRQF$a5UYzj8ptG)58FbdOxS(?cqCp46Nnnh+qiSy?%@Wke%w1dK5{O2P z!ndH#2As;M%Zi1VCW$#!YlYMWle!>hpoP1DQgFSHaiugAWlb%LM90x2rBS4btb&#Y z2~kj?cCzf47Qh3;fcOi7Nkn zB~#>`amf@JYxYW2#a2&Tk4obb&*HYsbhzp%nd)5m@LCUlj#9xdiSxS|KVR%{%tpkX zZtnUlUBEZ0=E}-^x18VIg%r6Dn*Z#)tK5!9ur05{-QJbZq-VCWUJoxfzC{iR3?nk&l5PIudk)TJsmn_Ai!Kf2E^<@%mKulK+LuMizWBwx7*pb@Fdx=g70CQp7(*ri}A(uoga9#rGR&% zH8U_U2r@D-NC0UBm_PmB2Od|(jOi{PdCVDKPp|pNBPEU8TbD+t1+s2V-}sS7Y}#iY zmg&1c@rX>n4OGtbaoY5i>O6YWRX_0v$Rhhd8Ab2J*$mU)eBzOup8bhOdipew&daN& zZ~DliIsN=6Ag67{^gtjzo%J)1q2lH%JPainsfi^;sR7=sY#@WUf$#+r1H&hv6axbQ D4}nTh diff --git a/Moose_CTLD_Pure/catalogs/Moose_CTLD_Catalog.lua b/Moose_CTLD_Pure/catalogs/Moose_CTLD_Catalog.lua index 3d7152e..8a79ee6 100644 --- a/Moose_CTLD_Pure/catalogs/Moose_CTLD_Catalog.lua +++ b/Moose_CTLD_Pure/catalogs/Moose_CTLD_Catalog.lua @@ -123,6 +123,12 @@ cat['BLUE_HAWK_CWAR'] = { menuCategory='SAM mid range', menu='HAWK CWAR' cat['BLUE_HAWK_SITE'] = { menuCategory='SAM mid range', menu='HAWK - All crates', description='HAWK Site', dcsCargoType='container_cargo', requires={ BLUE_HAWK_LN=1, BLUE_HAWK_SR=1, BLUE_HAWK_TR=1, BLUE_HAWK_PCP=1, BLUE_HAWK_CWAR=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=multiUnits({ {type='Hawk ln'}, {type='Hawk sr', dx=12, dz=8}, {type='Hawk tr', dx=-12, dz=8}, {type='Hawk pcp', dx=18, dz=12}, {type='Hawk cwar', dx=-18, dz=12} }) } +-- HAWK site repair/augment (adds +1 launcher, repairs site by respawn) +cat['BLUE_HAWK_REPAIR'] = { menuCategory='SAM mid range', menu='HAWK Repair/Launcher +1', description='HAWK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg) + -- Build is handled specially in CTLD:BuildSpecificAtGroup for isRepair entries + return singleUnit('Ural-375')(point, headingDeg) +end } + cat['BLUE_NASAMS_LN'] = { menuCategory='SAM mid range', menu='NASAMS Launcher 120C', description='NASAMS LN 120C', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_LN_C') } cat['BLUE_NASAMS_RADAR'] = { menuCategory='SAM mid range', menu='NASAMS Search/Track Radar', description='NASAMS Radar', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Radar_MPQ64F1') } cat['BLUE_NASAMS_CP'] = { menuCategory='SAM mid range', menu='NASAMS Command Post', description='NASAMS CP', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Command_Post') } @@ -135,6 +141,11 @@ cat['RED_KUB_RADAR'] = { menuCategory='SAM mid range', menu='KUB Radar' cat['RED_KUB_SITE'] = { menuCategory='SAM mid range', menu='KUB - All crates', description='KUB Site', dcsCargoType='container_cargo', requires={ RED_KUB_LN=1, RED_KUB_RADAR=1 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=multiUnits({ {type='Kub 2P25 ln'}, {type='Kub 1S91 str', dx=12, dz=8} }) } +-- KUB site repair/augment (adds +1 launcher, repairs site by respawn) +cat['RED_KUB_REPAIR'] = { menuCategory='SAM mid range', menu='KUB Repair/Launcher +1', description='KUB Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg) + return singleUnit('Ural-375')(point, headingDeg) +end } + -- SAM long range (BLUE) Patriot cat['BLUE_PATRIOT_LN'] = { menuCategory='SAM long range', menu='Patriot Launcher', description='Patriot Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ln') } cat['BLUE_PATRIOT_RADAR'] = { menuCategory='SAM long range', menu='Patriot Radar', description='Patriot Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot str') } @@ -142,6 +153,11 @@ cat['BLUE_PATRIOT_ECS'] = { menuCategory='SAM long range', menu='Patriot E cat['BLUE_PATRIOT_SITE'] = { menuCategory='SAM long range', menu='Patriot - All crates', description='Patriot Site', dcsCargoType='container_cargo', requires={ BLUE_PATRIOT_LN=1, BLUE_PATRIOT_RADAR=1, BLUE_PATRIOT_ECS=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=multiUnits({ {type='Patriot ln'}, {type='Patriot str', dx=14, dz=10}, {type='Patriot ECS', dx=-14, dz=10} }) } +-- Patriot site repair/augment (adds +1 launcher, repairs site by respawn) +cat['BLUE_PATRIOT_REPAIR'] = { menuCategory='SAM long range', menu='Patriot Repair/Launcher +1', description='Patriot Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg) + return singleUnit('Ural-375')(point, headingDeg) +end } + -- SAM long range (RED) BUK cat['RED_BUK_LN'] = { menuCategory='SAM long range', menu='BUK Launcher', description='BUK Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk LN 9A310M1') } cat['RED_BUK_SR'] = { menuCategory='SAM long range', menu='BUK Search Radar', description='BUK Search Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk SR 9S18M1') } @@ -149,6 +165,11 @@ cat['RED_BUK_CC'] = { menuCategory='SAM long range', menu='BUK CC Ra cat['RED_BUK_SITE'] = { menuCategory='SAM long range', menu='BUK - All crates', description='BUK Site', dcsCargoType='container_cargo', requires={ RED_BUK_LN=1, RED_BUK_SR=1, RED_BUK_CC=1 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=multiUnits({ {type='SA-11 Buk LN 9A310M1'}, {type='SA-11 Buk SR 9S18M1', dx=12, dz=8}, {type='SA-11 Buk CC 9S470M1', dx=-12, dz=8} }) } +-- BUK site repair/augment (adds +1 launcher, repairs site by respawn) +cat['RED_BUK_REPAIR'] = { menuCategory='SAM long range', menu='BUK Repair/Launcher +1', description='BUK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg) + return singleUnit('Ural-375')(point, headingDeg) +end } + -- Drones (JTAC) cat['BLUE_MQ9'] = { menuCategory='Drones', menu='MQ-9 Reaper - JTAC', description='MQ-9 JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=BLUE, category=Group.Category.AIRPLANE, build=singleUnit('MQ-9 Reaper') } cat['RED_WINGLOONG'] = { menuCategory='Drones', menu='WingLoong-I - JTAC', description='WingLoong-I JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=RED, category=Group.Category.AIRPLANE, build=singleUnit('WingLoong-I') }