diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index dfbbb6a90..010905098 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -2777,8 +2777,10 @@ do -- COORDINATE -- @param #boolean Bogey Add "Bogey" at the end if true (not yet declared hostile or friendly) -- @param #boolean Spades Add "Spades" at the end if true (no IFF/VID ID yet known) -- @param #boolean SSML Add SSML tags speaking aspect as 0 1 2 and "brah" instead of BRAA + -- @param #boolean Angels If true, altitude is e.g. "Angels 25" (i.e., a friendly plane), else "25 thousand" + -- @param #boolean Zeros If using SSML, be aware that Google TTS will say "oh" and not "zero" for "0"; if Zeros is set to true, "0" will be replaced with "zero" -- @return #string The BRAA text. - function COORDINATE:ToStringBRAANATO(FromCoordinate,Bogey,Spades,SSML) + function COORDINATE:ToStringBRAANATO(FromCoordinate,Bogey,Spades,SSML,Angels,Zeros) -- Thanks to @Pikey local BRAANATO = "Merged." @@ -2796,14 +2798,32 @@ do -- COORDINATE local alt = UTILS.Round(UTILS.MetersToFeet(self.y)/1000,0)--*1000 + local alttext = string.format("%d thousand",alt) + + if Angels then + alttext = string.format("Angels %d",alt) + end + local track = UTILS.BearingToCardinal(bearing) or "North" if rangeNM > 3 then - if SSML then - if aspect == "" then - BRAANATO = string.format("brah %03d, %d miles, Angels %d, Track %s",bearing, rangeNM, alt, track) + if SSML then -- google says "oh" instead of zero, be aware + if Zeros then + bearing = string.format("%03d",bearing) + local AngleDegText = string.gsub(bearing,"%d","%1 ") -- "0 5 1 " + AngleDegText = string.gsub(AngleDegText," $","") -- "0 5 1" + AngleDegText = string.gsub(AngleDegText,"0","zero") + if aspect == "" then + BRAANATO = string.format("brah %s, %d miles, %s, Track %s", AngleDegText, rangeNM, alttext, track) + else + BRAANATO = string.format("brah %s, %d miles, %s, %s, Track %s", AngleDegText, rangeNM, alttext, aspect, track) + end else - BRAANATO = string.format("brah %03d, %d miles, Angels %d, %s, Track %s",bearing, rangeNM, alt, aspect, track) + if aspect == "" then + BRAANATO = string.format("brah %03d, %d miles, %s, Track %s", bearing, rangeNM, alttext, track) + else + BRAANATO = string.format("brah %03d, %d miles, %s, %s, Track %s", bearing, rangeNM, alttext, aspect, track) + end end if Bogey and Spades then BRAANATO = BRAANATO..", Bogey, Spades." @@ -2816,9 +2836,9 @@ do -- COORDINATE end else if aspect == "" then - BRAANATO = string.format("BRA %03d, %d miles, Angels %d, Track %s",bearing, rangeNM, alt, track) + BRAANATO = string.format("BRA %03d, %d miles, %s, Track %s",bearing, rangeNM, alttext, track) else - BRAANATO = string.format("BRAA %03d, %d miles, Angels %d, %s, Track %s",bearing, rangeNM, alt, aspect, track) + BRAANATO = string.format("BRAA %03d, %d miles, %s, %s, Track %s",bearing, rangeNM, alttext, aspect, track) end if Bogey and Spades then BRAANATO = BRAANATO..", Bogey, Spades." diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 518d8ff62..655e4eca2 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -4180,6 +4180,26 @@ do -- SET_CLIENT return CountU end + + --- Gets the alive set. + -- @param #SET_CLIENT self + -- @return #table Table of SET objects + function SET_CLIENT:GetAliveSet() + + local AliveSet = SET_CLIENT:New() + + -- Clean the Set before returning with only the alive Groups. + for GroupName, GroupObject in pairs(self.Set) do + local GroupObject=GroupObject --Wrapper.Client#CLIENT + + if GroupObject and GroupObject:IsAlive() then + AliveSet:Add(GroupName, GroupObject) + end + end + + return AliveSet.Set or {} + end + --- -- @param #SET_CLIENT self -- @param Wrapper.Client#CLIENT MClient diff --git a/Moose Development/Moose/Ops/Awacs.lua b/Moose Development/Moose/Ops/Awacs.lua index 39fa31530..17870073b 100644 --- a/Moose Development/Moose/Ops/Awacs.lua +++ b/Moose Development/Moose/Ops/Awacs.lua @@ -323,7 +323,7 @@ do -- @field #AWACS AWACS = { ClassName = "AWACS", -- #string - version = "beta 0.1.23", -- #string + version = "beta 0.1.24", -- #string lid = "", -- #string coalition = coalition.side.BLUE, -- #number coalitiontxt = "blue", -- #string @@ -658,7 +658,7 @@ AWACS.TaskStatus = { --@field #boolean FromAI ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- TODO-List 0.1.23 +-- TODO-List 0.1.24 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- -- DEBUG - WIP - Player tasking, VID @@ -1725,7 +1725,8 @@ function AWACS:_ToStringBULLS( Coordinate, ssml, TTS ) return string.format("%s %03d, %d",bullseyename,Bearing,Distance) elseif TTS then Bearing = self:_ToStringBullsTTS(Bearing) - return string.format("%s %s, %d",bullseyename,Bearing,Distance) + local BearingTTS = string.gsub(Bearing,"0","zero") + return string.format("%s %s, %d",bullseyename,BearingTTS,Distance) else return string.format("%s %s, %d",bullseyename,Bearing,Distance) end @@ -1838,6 +1839,33 @@ function AWACS:_UpdateContactFromCluster(CID) return self end +--- [Internal] Check merges for Players +-- @param #AWACS self +-- @return #AWACS self +function AWACS:_CheckMerges() + self:T(self.lid.."_CheckMerges") + for _id,_pilot in pairs (self.ManagedGrps) do + local pilot = _pilot -- #AWACS.ManagedGroup + if pilot.Group and pilot.Group:IsAlive() then + local ppos = pilot.Group:GetCoordinate() + if ppos then + self.Contacts:ForEach( + function (Contact) + local contact = Contact -- #AWACS.ManagedContact + local cpos = contact.Cluster.coordinate or contact.Contact.position or contact.Contact.group:GetCoordinate() + local dist = ppos:Get2DDistance(cpos) + local distnm = UTILS.Round(UTILS.MetersToNM(dist),0) + if pilot.IsPlayer and distnm <= 3 then + self:_MergedCall(_id) + end + end + ) + end + end + end + return self +end + --- [Internal] Clean up contacts list -- @param #AWACS self -- @return #AWACS self @@ -1861,22 +1889,12 @@ function AWACS:_CleanUpContacts() if deadcontacts:Count() > 0 then self:T("DEAD count="..deadcontacts:Count()) - -- check cluster alive or announce lost - deadcontacts:ForEach( function (Contact) local contact = Contact -- #AWACS.ManagedContact - -- see if the complete cluster is dead - -- if contact.Cluster and self.intel:ClusterCountUnits(contact.Cluster) > 0 then - -- not complete cluster dead, update contact data later - -- aliveclusters:Push(contact) - --else local text = string.format("%s, %s Group. Vanished.",self.callsigntxt, contact.TargetGroupNaming) local textScreen = string.format("%s, %s group vanished.", self.callsigntxt, contact.TargetGroupNaming) - self:_NewRadioEntry(text,textScreen,0,false,self.debug,true,false,true) - - -- pull from Contacts self.Contacts:PullByID(contact.CID) -- end end @@ -2153,12 +2171,12 @@ function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral) if IsGeneral then -- AO/BE Reference refBRAA=self:_ToStringBULLS(coordinate) - if self.PathToGoogleKey then - refBRAATTS = self:_ToStringBULLS(coordinate, true) - else + -- if self.PathToGoogleKey then + refBRAATTS = self:_ToStringBULLS(coordinate, false, true) + --else --refBRAATTS = self:__ToStringBullsTTS(refBRAA) - refBRAATTS = self:_ToStringBULLS(coordinate,false,true) - end + --refBRAATTS = self:_ToStringBULLS(coordinate,false,true) + --end local alt = contact.Contact.group:GetAltitude() or 8000 alt = UTILS.Round(UTILS.MetersToFeet(alt)/1000,0) -- Alpha Group. Bulls eye 0 2 1, 16 miles, 25 thousand. @@ -2171,7 +2189,7 @@ function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral) refBRAATTS = string.gsub(refBRAATTS,"BRA","brah") -- Charlie group, BRAA 045, 105 miles, Angels 41, Flanking, Track North-East, Bogey, Spades. if self.PathToGoogleKey then - refBRAATTS = coordinate:ToStringBRAANATO(groupcoord,true,true,true) + refBRAATTS = coordinate:ToStringBRAANATO(groupcoord,true,true,true,false,true) end if contact.IFF ~= AWACS.IFF.BOGEY then refBRAA = string.gsub(refBRAA,"Bogey", contact.IFF) @@ -2184,11 +2202,11 @@ function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral) -- Aspect local aspect = "" - if IsGeneral then - aspect = coordinate:ToStringAspect(self.OpsZone:GetCoordinate()) - text = text .. " "..aspect.."." -- Alpha Group. Bulls eye 0 2 1, 1 6. Flanking. - textScreen = textScreen .. " "..aspect.."." -- Alpha Group, Bullseye 021, 16, Flanking. - end + -- if IsGeneral then + -- aspect = coordinate:ToStringAspect(self.OpsZone:GetCoordinate()) + -- text = text .. " "..aspect.."." -- Alpha Group. Bulls eye 0 2 1, 1 6. Flanking. + -- textScreen = textScreen .. " "..aspect.."." -- Alpha Group, Bullseye 021, 16, Flanking. + --end -- sizing local size = contact.Contact.group:CountAliveUnits() @@ -2201,7 +2219,7 @@ function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral) -- engagement tag? if contact.EngagementTag then - text = text .. " "..contact.EngagementTag -- Alpha Group. Bulls eye 0 2 1, 16. Flanking. Heavy. Targeted by Jazz 1 1. + text = text .. " "..contact.EngagementTag -- Alpha Group. Bulls eye 0 2 1, 16. Heavy. Targeted by Jazz 1 1. textScreen = textScreen .. " "..contact.EngagementTag -- Alpha Group, Bullseye 021, 16, Flanking. Targeted by Jazz 1 1. end @@ -2499,7 +2517,7 @@ end -- @param #string Declaration Text declaration the player used -- @return #AWACS self function AWACS:_VID(Group,Declaration) - self:I(self.lid.."_VID") + self:T(self.lid.."_VID") local GID, Outcome, Callsign = self:_GetManagedGrpID(Group) local text = "" @@ -2533,7 +2551,7 @@ function AWACS:_VID(Group,Declaration) distance = UTILS.Round(distance,0) + 1 if distance <= radius or self.debug then -- we can VID - self:I("Contact VID as "..Declaration) + self:T("Contact VID as "..Declaration) -- update cluster.IFF = Declaration task.Status = AWACS.TaskStatus.SUCCESS @@ -2542,12 +2560,12 @@ function AWACS:_VID(Group,Declaration) self.Contacts:PullByID(CID) self.Contacts:Push(cluster,CID) text = string.format("%s. %s. Copy, target identified as %s.",Callsign,self.callsigntxt, Declaration) - self:I(text) + self:T(text) else -- too far away - self:I("Contact VID not close enough") + self:T("Contact VID not close enough") text = string.format("%s. %s. Negative, get closer to target.",Callsign,self.callsigntxt) - self:I(text) + self:T(text) end self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) end @@ -2921,7 +2939,8 @@ function AWACS:_CheckIn(Group) self.ManagedGrps[self.ManagedGrpID]=managedgroup local alphacheckbulls = self:_ToStringBULLS(Group:GetCoordinate()) - local alphacheckbullstts = self:_ToStringBullsTTS(alphacheckbulls)-- make tts friendly + --local alphacheckbullstts = self:_ToStringBullsTTS(alphacheckbulls)-- make tts friendly + local alphacheckbullstts = self:_ToStringBULLS(Group:GetCoordinate(),false,true) self.ManagedGrps[self.ManagedGrpID]=managedgroup text = string.format("%s. %s. Alpha Check. %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls) @@ -2989,8 +3008,8 @@ function AWACS:_CheckInAI(FlightGroup,Group,AuftragsNr) self:_NewRadioEntry(text,text,managedgroup.GID,Outcome,false,true,true) - local alphacheckbulls = self:_ToStringBULLS(Group:GetCoordinate()) - alphacheckbulls = self:_ToStringBullsTTS(alphacheckbulls)-- make tts friendly + local alphacheckbulls = self:_ToStringBULLS(Group:GetCoordinate(),false,true) + --alphacheckbulls = self:_ToStringBullsTTS(alphacheckbulls)-- make tts friendly text = string.format("%s. %s. Alpha Check. %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls) self:__CheckedIn(1,managedgroup.GID) @@ -3073,8 +3092,11 @@ function AWACS:_SetClientMenus() -- go through set and build the menu local grp = _group -- Wrapper.Client#CLIENT local cgrp = grp:GetGroup() - local cgrpname = cgrp:GetName() - self:T(cgrpname) + local cgrpname = nil + if cgrp and cgrp:IsAlive() then + cgrpname = cgrp:GetName() + self:T(cgrpname) + end --cgrpname = string.match(cgrpname,"([%a%s]+)#") if self.MenuStrict then -- check if pilot has checked in @@ -3519,14 +3541,16 @@ function AWACS:_ToStringBR(FromCoordinate,ToCoordinate) local AngleDegText = string.format("%03d",AngleDegrees) -- 051 local AngleDegTextTTS = "" - if self.PathToGoogleKey then - AngleDegTextTTS = string.format("%s",AngleDegText) - else - AngleDegTextTTS = string.format("%s",AngleDegText) - end + --if self.PathToGoogleKey then + --AngleDegTextTTS = string.format("%s",AngleDegText) + --else + --AngleDegTextTTS = string.format("%s",AngleDegText) + --end AngleDegText = string.gsub(AngleDegText,"%d","%1 ") -- "0 5 1 " AngleDegText = string.gsub(AngleDegText," $","") -- "0 5 1" + AngleDegTextTTS = string.gsub(AngleDegText,"0","zero") + local Distance = ToCoordinate:Get2DDistance( FromCoordinate ) --meters local distancenm = UTILS.Round(UTILS.MetersToNM(Distance),0) @@ -3558,9 +3582,11 @@ function AWACS:_ToStringBRA(FromCoordinate,ToCoordinate,Altitude) local AngleDegrees = UTILS.Round( UTILS.ToDegree( AngleRadians ), 0 ) -- degrees local AngleDegText = string.format("%03d",AngleDegrees) -- 051 - local AngleDegTextTTS = string.format("%s",AngleDegText) + --local AngleDegTextTTS = string.format("%s",AngleDegText) + AngleDegText = string.gsub(AngleDegText,"%d","%1 ") -- "0 5 1 " AngleDegText = string.gsub(AngleDegText," $","") -- "0 5 1" + local AngleDegTextTTS = string.gsub(AngleDegText,"0","zero") local Distance = ToCoordinate:Get2DDistance( FromCoordinate ) --meters local distancenm = UTILS.Round(UTILS.MetersToNM(Distance),0) BRText = string.format("%03d, %d miles, %d thousand",AngleDegrees,distancenm,altitude) @@ -3766,7 +3792,7 @@ end -- @param #AWACS self -- @return #AWACS self function AWACS:_CheckTaskQueue() - self:I(self.lid.."_CheckTaskQueue") + self:T(self.lid.."_CheckTaskQueue") local opentasks = 0 local assignedtasks = 0 @@ -3789,7 +3815,7 @@ function AWACS:_CheckTaskQueue() if self.ManagedTasks:IsNotEmpty() then opentasks = self.ManagedTasks:GetSize() - self:I("Assigned Tasks: " .. opentasks) + self:T("Assigned Tasks: " .. opentasks) local taskstack = self.ManagedTasks:GetPointerStack() for _id,_entry in pairs(taskstack) do local data = _entry -- Utilities.FiFo#FIFO.IDEntry @@ -3797,7 +3823,7 @@ function AWACS:_CheckTaskQueue() local target = entry.Target -- Ops.Target#TARGET local description = entry.ToDo if description == AWACS.TaskDescription.ANCHOR or description == AWACS.TaskDescription.REANCHOR then - self:I("Open Task ANCHOR/REANCHOR") + self:T("Open Task ANCHOR/REANCHOR") -- see if we have reached the anchor zone local managedgroup = self.ManagedGrps[entry.AssignedGroupID] -- #AWACS.ManagedGroup if managedgroup then @@ -3807,7 +3833,7 @@ function AWACS:_CheckTaskQueue() local zone = target:GetObject() -- Core.Zone#ZONE self:T({zone}) if group:IsInZone(zone) then - self:I("Open Task ANCHOR/REANCHOR success for GroupID "..entry.AssignedGroupID) + self:T("Open Task ANCHOR/REANCHOR success for GroupID "..entry.AssignedGroupID) -- made it target:Stop() -- add group to idle stack @@ -3824,7 +3850,7 @@ function AWACS:_CheckTaskQueue() self.ManagedTasks:PullByID(entry.TID) else --inzone -- not there yet - self:I("Open Task ANCHOR/REANCHOR executing for GroupID "..entry.AssignedGroupID) + self:T("Open Task ANCHOR/REANCHOR executing for GroupID "..entry.AssignedGroupID) end else -- group dead, pull task @@ -3838,7 +3864,7 @@ function AWACS:_CheckTaskQueue() elseif description == AWACS.TaskDescription.INTERCEPT then -- DONE - self:I("Open Tasks INTERCEPT") + self:T("Open Tasks INTERCEPT") local taskstatus = entry.Status local targetstatus = entry.Target:GetState() @@ -3864,15 +3890,15 @@ function AWACS:_CheckTaskQueue() distance = grouposition:Get2DDistance(position) distance = UTILS.Round(UTILS.MetersToNM(distance),0) end - self:I("TAC/MELD distance check: "..distance.."NM!") + self:T("TAC/MELD distance check: "..distance.."NM!") if distance <= self.TacDistance and distance >= self.MeldDistance then -- TAC distance - self:I("TAC distance: "..distance.."NM!") + self:T("TAC distance: "..distance.."NM!") local Contact = self.Contacts:ReadByID(entry.Contact.CID) self:_TACRangeCall(entry.AssignedGroupID,Contact) elseif distance <= self.MeldDistance and distance >= self.ThreatDistance then -- MELD distance - self:I("MELD distance: "..distance.."NM!") + self:T("MELD distance: "..distance.."NM!") local Contact = self.Contacts:ReadByID(entry.Contact.CID) self:_MeldRangeCall(entry.AssignedGroupID,Contact) end @@ -3885,7 +3911,7 @@ function AWACS:_CheckTaskQueue() auftragstatus = auftrag:GetState() end local text = string.format("ID=%d | Status=%s | TargetState=%s | AuftragState=%s",entry.TID,taskstatus,targetstatus,auftragstatus) - self:I(text) + self:T(text) if auftrag then if auftrag:IsExecuting() then entry.Status = AWACS.TaskStatus.EXECUTING @@ -3943,7 +3969,7 @@ function AWACS:_CheckTaskQueue() end if entry.Status == AWACS.TaskStatus.SUCCESS then - self:I("Open Tasks INTERCEPT success for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks INTERCEPT success for GroupID "..entry.AssignedGroupID) if managedgroup then self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",true,true,AWACS.TaskStatus.SUCCESS) @@ -3966,7 +3992,7 @@ function AWACS:_CheckTaskQueue() end elseif entry.Status == AWACS.TaskStatus.FAILED then - self:I("Open Tasks INTERCEPT failed for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks INTERCEPT failed for GroupID "..entry.AssignedGroupID) if managedgroup then managedgroup.HasAssignedTask = false self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) @@ -3991,7 +4017,7 @@ function AWACS:_CheckTaskQueue() elseif entry.Status == AWACS.TaskStatus.REQUESTED then -- requested - player tasks only! - self:I("Open Tasks INTERCEPT REQUESTED for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks INTERCEPT REQUESTED for GroupID "..entry.AssignedGroupID) local created = entry.RequestedTimestamp or timer.getTime() - 120 local Tnow = timer.getTime() local Trunning = (Tnow-created) / 60 -- mins @@ -4001,7 +4027,7 @@ function AWACS:_CheckTaskQueue() entry.Status = AWACS.TaskStatus.UNASSIGNED self.ManagedTasks:PullByID(entry.TID) end - self:I(text) + self:T(text) end ---------------------------------------- @@ -4026,7 +4052,7 @@ function AWACS:_CheckTaskQueue() elseif entry.Target:IsAlive() then -- still alive -- out of zones? - self:I("Checking VID target out of bounds") + self:T("Checking VID target out of bounds") local targetpos = entry.Target:GetCoordinate() -- success == out of our controlled zones local outofzones = false @@ -4057,13 +4083,13 @@ function AWACS:_CheckTaskQueue() end if outofzones then entry.Status = AWACS.TaskStatus.SUCCESS - self:I("Out of bounds - SUCCESS") + self:T("Out of bounds - SUCCESS") end end if entry.Status == AWACS.TaskStatus.REQUESTED then -- requested - player tasks only! - self:I("Open Tasks VID REQUESTED for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks VID REQUESTED for GroupID "..entry.AssignedGroupID) local created = entry.RequestedTimestamp or timer.getTime() - 120 local Tnow = timer.getTime() local Trunning = (Tnow-created) / 60 -- mins @@ -4073,9 +4099,9 @@ function AWACS:_CheckTaskQueue() entry.Status = AWACS.TaskStatus.UNASSIGNED self.ManagedTasks:PullByID(entry.TID) end - self:I(text) + self:T(text) elseif entry.Status == AWACS.TaskStatus.ASSIGNED then - self:I("Open Tasks VID ASSIGNED for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks VID ASSIGNED for GroupID "..entry.AssignedGroupID) -- check TAC/MELD ranges local targetgrp = entry.Contact.group local position = entry.Contact.position or entry.Cluster.coordinate @@ -4088,29 +4114,29 @@ function AWACS:_CheckTaskQueue() distance = grouposition:Get2DDistance(position) distance = UTILS.Round(UTILS.MetersToNM(distance),0) end - self:I("TAC/MELD distance check: "..distance.."NM!") + self:T("TAC/MELD distance check: "..distance.."NM!") if distance <= self.TacDistance and distance >= self.MeldDistance then -- TAC distance - self:I("TAC distance: "..distance.."NM!") + self:T("TAC distance: "..distance.."NM!") local Contact = self.Contacts:ReadByID(entry.Contact.CID) self:_TACRangeCall(entry.AssignedGroupID,Contact) elseif distance <= self.MeldDistance and distance >= self.ThreatDistance then -- MELD distance - self:I("MELD distance: "..distance.."NM!") + self:T("MELD distance: "..distance.."NM!") local Contact = self.Contacts:ReadByID(entry.Contact.CID) self:_MeldRangeCall(entry.AssignedGroupID,Contact) end end end elseif entry.Status == AWACS.TaskStatus.SUCCESS then - self:I("Open Tasks VID success for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks VID success for GroupID "..entry.AssignedGroupID) -- outcomes - player ID'd -- target dead or left zones handled above -- target ID'd --> if hostile, assign INTERCEPT TASK self.ManagedTasks:PullByID(entry.TID) local Contact = self.Contacts:ReadByID(entry.Contact.CID) -- #AWACS.ManagedContact if Contact and (Contact.IFF == AWACS.IFF.FRIENDLY or Contact.IFF == AWACS.IFF.NEUTRAL) then - self:I("IFF outcome friendly/neutral for GroupID "..entry.AssignedGroupID) + self:T("IFF outcome friendly/neutral for GroupID "..entry.AssignedGroupID) -- nothing todo, re-anchor if managedgroup then managedgroup.HasAssignedTask = false @@ -4130,7 +4156,7 @@ function AWACS:_CheckTaskQueue() self:__ReAnchor(5,managedgroup.GID) end elseif Contact and Contact.IFF == AWACS.IFF.ENEMY then - self:I("IFF outcome hostile for GroupID "..entry.AssignedGroupID) + self:T("IFF outcome hostile for GroupID "..entry.AssignedGroupID) -- change to intercept --self.ManagedTasks:PullByID(entry.TID) entry.ToDo = AWACS.TaskDescription.INTERCEPT @@ -4141,7 +4167,7 @@ function AWACS:_CheckTaskQueue() local TextTTS = string.format("%s, %s. Engage hostile target!",managedgroup.CallSign,self.callsigntxt) self:_NewRadioEntry(TextTTS,TextTTS,managedgroup.GID,true,self.debug,true,false,true) elseif not Contact then - self:I("IFF outcome target DEAD for GroupID "..entry.AssignedGroupID) + self:T("IFF outcome target DEAD for GroupID "..entry.AssignedGroupID) -- nothing todo, re-anchor if managedgroup then managedgroup.HasAssignedTask = false @@ -4167,7 +4193,7 @@ function AWACS:_CheckTaskQueue() -- outcomes - player unable/abort -- Player dead managed above -- Remove task - self:I("Open Tasks VID failed for GroupID "..entry.AssignedGroupID) + self:T("Open Tasks VID failed for GroupID "..entry.AssignedGroupID) if managedgroup then managedgroup.HasAssignedTask = false self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) @@ -4328,7 +4354,7 @@ function AWACS:_AnnounceContact(Contact,IsNew,Group,IsBogeyDope,Tag,IsPopup,Repo BRAfromBullsTTS = string.gsub(BRAfromBulls,"BRAA","brah") BRAfromBullsTTS = string.gsub(BRAfromBullsTTS,"BRA","brah") if self.PathToGoogleKey then - BRAfromBullsTTS = clustercoordinate:ToStringBRAANATO(Group:GetCoordinate(),true,true,true) + BRAfromBullsTTS = clustercoordinate:ToStringBRAANATO(Group:GetCoordinate(),true,true,true,false,true) end end @@ -4707,7 +4733,7 @@ end -- @param #AWACS.ManagedContact Contact -- @return #AWACS self function AWACS:_TACRangeCall(GID,Contact) - self:I(self.lid.."_TACRangeCall") + self:T(self.lid.."_TACRangeCall") -- AIC: “Enforcer 11, single group, 30 miles.” local pilotcallsign = self:_GetCallSign(nil,GID) local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup @@ -4732,7 +4758,7 @@ end -- @param #AWACS.ManagedContact Contact -- @return #AWACS self function AWACS:_MeldRangeCall(GID,Contact) - self:I(self.lid.."_MeldRangeCall") + self:T(self.lid.."_MeldRangeCall") -- AIC: “Heat 11, single group, BRAA 089/28, 32 thousand, hot, hostile, crow.” local pilotcallsign = self:_GetCallSign(nil,GID) local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup @@ -4744,7 +4770,7 @@ function AWACS:_MeldRangeCall(GID,Contact) if position then local BRATExt = "" if self.PathToGoogleKey then - BRATExt = position:ToStringBRAANATO(flightpos,false,false,true) + BRATExt = position:ToStringBRAANATO(flightpos,false,false,true,false,true) else BRATExt = position:ToStringBRAANATO(flightpos,false,false) end @@ -4760,7 +4786,7 @@ end -- @param #AWACS self -- @return #AWACS self function AWACS:_ThreatRangeCall(GID,Contact) - self:I(self.lid.."_ThreatRangeCall") + self:T(self.lid.."_ThreatRangeCall") -- AIC: “Enforcer 11 12, east group, THREAT, BRAA 260/15, 29 thousand, hot, hostile, robin.” local pilotcallsign = self:_GetCallSign(nil,GID) local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup @@ -4772,7 +4798,7 @@ function AWACS:_ThreatRangeCall(GID,Contact) if position then local BRATExt = "" if self.PathToGoogleKey then - BRATExt = position:ToStringBRAANATO(flightpos,false,false,true) + BRATExt = position:ToStringBRAANATO(flightpos,false,false,true,false,true) else BRATExt = position:ToStringBRAANATO(flightpos,false,false) end @@ -4783,13 +4809,27 @@ function AWACS:_ThreatRangeCall(GID,Contact) return self end +--- [Internal] Merged Call to Pilot +-- @param #AWACS self +-- @param #number GID +-- @return #AWACS self +function AWACS:_MergedCall(GID) + self:T(self.lid.."_MergedCall") + -- AIC: “Enforcer, mergedb” + local pilotcallsign = self:_GetCallSign(nil,GID) + --local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup + local text = string.format("%s. %s. Merged.",self.callsigntxt,pilotcallsign) + self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true) + return self +end + --- [Internal] Assign a Pilot to a target -- @param #AWACS self -- @param #table Pilots Table of #AWACS.ManagedGroup Pilot -- @param Utilities.FiFo#FIFO Targets FiFo of #AWACS.ManagedContact Targets -- @return #AWACS self function AWACS:_AssignPilotToTarget(Pilots,Targets) - self:I(self.lid.."_AssignPilotToTarget") + self:T(self.lid.."_AssignPilotToTarget") local inreach = false local Pilot = nil -- #AWACS.ManagedGroup @@ -4807,7 +4847,7 @@ function AWACS:_AssignPilotToTarget(Pilots,Targets) local pilotcoord = _Pilot.Group:GetCoordinate() local targetdist = targetgroupcoord:Get2DDistance(pilotcoord) if UTILS.MetersToNM(targetdist) < self.maxassigndistance and targetdist < closest then - self:I(string.format("%sTarget distance %d! Assignment %s!",self.lid,UTILS.Round(UTILS.MetersToNM(targetdist),0),_Pilot.CallSign)) + self:T(string.format("%sTarget distance %d! Assignment %s!",self.lid,UTILS.Round(UTILS.MetersToNM(targetdist),0),_Pilot.CallSign)) inreach = true closest = targetdist Pilot = _Pilot @@ -4815,7 +4855,7 @@ function AWACS:_AssignPilotToTarget(Pilots,Targets) Targets:PullByID(_target.CID) break else - self:I(self.lid .. "Target distance > "..self.maxassigndistance.."NM! No Assignment!") + self:T(self.lid .. "Target distance > "..self.maxassigndistance.."NM! No Assignment!") end end end @@ -4855,8 +4895,8 @@ function AWACS:_AssignPilotToTarget(Pilots,Targets) self.Contacts:PullByID(Target.CID) self.Contacts:Push(Target,Target.CID) - local text = string.format("%s. %s. Request commit %s group. %s.", self.callsigntxt,Pilot.CallSign,Target.TargetGroupNaming,TargetDirectionsTTS) - local textScreen = string.format("%s, %s. Request commit %s group. %s.", self.callsigntxt,Pilot.CallSign,Target.TargetGroupNaming,TargetDirections) + local text = string.format("%s. %s group. %s. %s, request commit.", self.callsigntxt,Target.TargetGroupNaming,TargetDirectionsTTS,Pilot.CallSign) + local textScreen = string.format("%s. %s group. %s. %s, request commit.", self.callsigntxt,Target.TargetGroupNaming,TargetDirections,Pilot.CallSign) self:_NewRadioEntry(text,textScreen,Pilot.GID,true,self.debug,true,false,true) @@ -4864,15 +4904,15 @@ function AWACS:_AssignPilotToTarget(Pilots,Targets) -- Target information local callsign = Pilot.CallSign local FGStatus = Pilot.FlightGroup:GetState() - self:I("Pilot AI Callsign: " .. callsign) - self:I("Pilot FG State: " .. FGStatus) + self:T("Pilot AI Callsign: " .. callsign) + self:T("Pilot FG State: " .. FGStatus) local targetstatus = Target.Target:GetState() - self:I("Target State: " .. targetstatus) + self:T("Target State: " .. targetstatus) -- local currmission = Pilot.FlightGroup:GetMissionCurrent() if currmission then - self:I("Current Mission: " .. currmission:GetType()) + self:T("Current Mission: " .. currmission:GetType()) end -- create one intercept Auftrag and one to return to CAP post this one local ZoneSet = self.ZoneSet @@ -4973,8 +5013,8 @@ function AWACS:_AssignPilotToTarget(Pilots,Targets) end local bratext, bratexttts = self:_ToStringBRA(Pilot.Group:GetCoordinate(),position,altitude or 8000) - local text = string.format("%s. %s. Commit %s group. %s.", self.callsigntxt,Pilot.CallSign,Target.TargetGroupNaming,bratexttts) - local textScreen = string.format("%s, %s. Commit %s group. %s.", self.callsigntxt,Pilot.CallSign,Target.TargetGroupNaming,bratext) + local text = string.format("%s. %s group. %s. %s, commit.", self.callsigntxt,Target.TargetGroupNaming,bratexttts,Pilot.CallSign) + local textScreen = string.format("%s. %s group. %s. %s, request commit.", self.callsigntxt,Target.TargetGroupNaming,bratext,Pilot.CallSign) self:_NewRadioEntry(text,textScreen,Pilot.GID,true,self.debug,true,false,true) @@ -5323,6 +5363,8 @@ function AWACS:onafterStatus(From, Event, To) self:_CleanUpContacts() + self:_CheckMerges() + if self.debug then --local outcome, targets = self:_TargetSelectionProcess() -- TODO for debug ATM end @@ -5474,9 +5516,9 @@ function AWACS:onafterAssignedAnchor(From, Event, To, GID, Anchor, AnchorStackNo local AnchorSpeed = self.CapSpeedBase or 270 local AuftragsNr = managedgroup.CurrentAuftrag - local textTTS = string.format("%s. %s. Station at %s at angels %d doing %d knots. Wait for task assignment.",CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed) - local ROEROT = self.AwacsROE.." "..self.AwacsROT - local textScreen = string.format("%s. %s.\nStation at %s\nAngels %d\nSpeed %d knots\nCoord %s\nROE %s\nWait for task assignment.",CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) + local textTTS = string.format("%s. %s. Station at %s at angels %d doing %d knots.",CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed) + local ROEROT = self.AwacsROE..", "..self.AwacsROT + local textScreen = string.format("%s. %s.\nStation at %s\nAngels %d\nSpeed %d knots\nCoord %s\nROE %s.",CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) local TextTasking = string.format("Station at %s\nAngels %d\nSpeed %d knots\nCoord %s\nROE %s",AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) self:_NewRadioEntry(textTTS,textScreen,GID,isPlayer,isPlayer,true,false) @@ -5865,9 +5907,9 @@ function AWACS:onafterReAnchor(From, Event, To, GID) local brtext = self:_ToStringBULLS(lastknown) local brtexttts = self:_ToStringBULLS(brtext,false,true) - if self.PathToGoogleKey then - brtexttts = self:_ToStringBULLS(lastknown,true) - end + --if self.PathToGoogleKey then + --brtexttts = self:_ToStringBULLS(lastknown,true) + --end text = text .. " "..brtexttts.." miles." textScreen = textScreen .. " "..brtext.." miles." @@ -5916,9 +5958,9 @@ function AWACS:onafterReAnchor(From, Event, To, GID) local lastknown = UTILS.DeepCopy(managedgroup.LastKnownPosition) local brtext = self:_ToStringBULLS(lastknown) local brtexttts = self:_ToStringBULLS(brtext,false,true) - if self.PathToGoogleKey then - brtexttts = self:_ToStringBULLS(lastknown,true) - end + --if self.PathToGoogleKey then + --brtexttts = self:_ToStringBULLS(lastknown,true) + --end text = text .. " "..brtexttts.." miles." textScreen = textScreen .. " "..brtext.." miles."