From 8bbff46efd862350fb61c96cc2b1834413e24292 Mon Sep 17 00:00:00 2001 From: FlightControl_Master Date: Tue, 6 Mar 2018 12:38:22 +0100 Subject: [PATCH] Reworked the DESIGNATE functionality and menu mechanisms. --- Moose Development/Moose/Core/Menu.lua | 16 +-- Moose Development/Moose/Core/Set.lua | 4 +- .../Moose/Functional/Designate.lua | 133 ++++++++++-------- 3 files changed, 88 insertions(+), 65 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index d4602daec..87439acb4 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -413,7 +413,7 @@ do -- MENU_MISSION self:RemoveSubMenus() if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItem( self.MenuPath ) end @@ -500,7 +500,7 @@ do -- MENU_MISSION_COMMAND if MissionMenu == self then if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItem( self.MenuPath ) end @@ -638,7 +638,7 @@ do -- MENU_COALITION self:RemoveSubMenus() if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Coalition = self.Coalition, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Coalition = self.Coalition, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForCoalition( self.Coalition, self.MenuPath ) end @@ -730,7 +730,7 @@ do -- MENU_COALITION_COMMAND if CoalitionMenu == self then if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Coalition = self.Coalition, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Coalition = self.Coalition, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForCoalition( self.Coalition, self.MenuPath ) end @@ -900,7 +900,7 @@ do self:RemoveSubMenus( MenuTime, MenuTag ) if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForGroup( self.GroupID, self.MenuPath ) end @@ -992,7 +992,7 @@ do if GroupMenu == self then if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForGroup( self.GroupID, self.MenuPath ) end @@ -1133,7 +1133,7 @@ do self:RemoveSubMenus( MenuTime, MenuTag ) if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForGroup( self.GroupID, self.MenuPath ) end @@ -1244,7 +1244,7 @@ do if GroupMenu == self then if not MenuTime or self.MenuTime ~= MenuTime then if ( not MenuTag ) or ( MenuTag and self.MenuTag and MenuTag == self.MenuTag ) then - self:E( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) + self:F( { Group = self.GroupID, Text = self.MenuText, Path = self.MenuPath } ) if self.MenuPath ~= nil then missionCommands.removeItemForGroup( self.GroupID, self.MenuPath ) end diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 812f85a91..37f5988b3 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -1792,13 +1792,13 @@ do -- SET_UNIT ThreatLevelSet[ThreatLevel] = ThreatLevelSet[ThreatLevel] or {} ThreatLevelSet[ThreatLevel].Set = ThreatLevelSet[ThreatLevel].Set or {} ThreatLevelSet[ThreatLevel].Set[UnitName] = UnitObject - self:E( { ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set } ) + self:F( { ThreatLevel = ThreatLevel, ThreatLevelSet = ThreatLevelSet[ThreatLevel].Set } ) end local ThreatLevelIncrement = FromThreatLevel <= ToThreatLevel and 1 or -1 for ThreatLevel = FromThreatLevel, ToThreatLevel, ThreatLevelIncrement do - self:E( { ThreatLevel = ThreatLevel } ) + self:F( { ThreatLevel = ThreatLevel } ) local ThreatLevelItem = ThreatLevelSet[ThreatLevel] if ThreatLevelItem then self:ForEach( IteratorFunction, arg, ThreatLevelItem.Set ) diff --git a/Moose Development/Moose/Functional/Designate.lua b/Moose Development/Moose/Functional/Designate.lua index 20ef38b20..13c174ebc 100644 --- a/Moose Development/Moose/Functional/Designate.lua +++ b/Moose Development/Moose/Functional/Designate.lua @@ -353,7 +353,8 @@ do -- DESIGNATE -- @param #DESIGNATE self -- @param #number Delay - self:AddTransition( "*", "Done", "*" ) + self:AddTransition( "*", "DoneSmoking", "*" ) + self:AddTransition( "*", "DoneIlluminating", "*" ) self:AddTransition( "*", "Status", "*" ) --- Status Handler OnBefore for DESIGNATE @@ -756,10 +757,8 @@ do -- DESIGNATE -- @param Wrapper.Group#GROUP AttackGroup -- @param #number Duration The time in seconds the report should be visible. -- @return #DESIGNATE - function DESIGNATE:SendStatus( MenuAttackGroup, Duration ) + function DESIGNATE:SendStatus( MenuAttackGroup ) - Duration = Duration or 10 - self.AttackSet:ForEachGroupAlive( --- @param Wrapper.Group#GROUP GroupReport @@ -776,14 +775,23 @@ do -- DESIGNATE local Report = self.Detection:DetectedItemReportSummary( DesignateIndex, AttackGroup ):Text( ", " ) DetectedReport:Add( string.rep( "-", 140 ) ) DetectedReport:Add( " - " .. Report ) + if string.find( Designating, "L" ) then + DetectedReport:Add( " - " .. "Lasing Targets" ) + end + if string.find( Designating, "S" ) then + DetectedReport:Add( " - " .. "Smoking Targets" ) + end + if string.find( Designating, "I" ) then + DetectedReport:Add( " - " .. "Illuminating Area" ) + end end end local CC = self.CC:GetPositionable() - CC:MessageToGroup( DetectedReport:Text( "\n" ), Duration, AttackGroup, self.DesignateName ) + CC:MessageTypeToGroup( DetectedReport:Text( "\n" ), MESSAGE.Type.Information, AttackGroup, self.DesignateName ) - local DesignationReport = REPORT:New( "Marking Targets:\n" ) + local DesignationReport = REPORT:New( "Marking Targets:" ) self.RecceSet:ForEachGroupAlive( function( RecceGroup ) @@ -797,7 +805,7 @@ do -- DESIGNATE end ) - CC:MessageToGroup( DesignationReport:Text(), Duration, AttackGroup, self.DesignateName ) + CC:MessageTypeToGroup( DesignationReport:Text(), MESSAGE.Type.Information, AttackGroup, self.DesignateName ) end end ) @@ -838,9 +846,7 @@ do -- DESIGNATE end local StatusMenu = MENU_GROUP_DELAYED:New( AttackGroup, "Status", MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName ) - MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Report Status 15s", StatusMenu, self.MenuStatus, self, AttackGroup, 15 ):SetTime( MenuTime ):SetTag( self.DesignateName ) - MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Report Status 30s", StatusMenu, self.MenuStatus, self, AttackGroup, 30 ):SetTime( MenuTime ):SetTag( self.DesignateName ) - MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Report Status 60s", StatusMenu, self.MenuStatus, self, AttackGroup, 60 ):SetTime( MenuTime ):SetTag( self.DesignateName ) + MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Report Status", StatusMenu, self.MenuStatus, self, AttackGroup ):SetTime( MenuTime ):SetTag( self.DesignateName ) if self.FlashStatusMenu[AttackGroup] then MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Flash Status Report Off", StatusMenu, self.MenuFlashStatus, self, AttackGroup, false ):SetTime( MenuTime ):SetTag( self.DesignateName ) @@ -858,33 +864,32 @@ do -- DESIGNATE local ID = self.Detection:GetDetectedItemID( DesignateIndex ) local MenuText = ID --.. ", " .. Coord:ToStringA2G( AttackGroup ) - if Designating == "" then - MenuText = "(-) " .. MenuText - local DetectedMenu = MENU_GROUP_DELAYED:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName ) + MenuText = string.format( "(%3s) %s", Designating, MenuText ) + local DetectedMenu = MENU_GROUP_DELAYED:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName ) + + -- Build the Lasing menu. + if string.find( Designating, "L", 1, true ) == nil then MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Search other target", DetectedMenu, self.MenuForget, self, DesignateIndex ):SetTime( MenuTime ):SetTag( self.DesignateName ) for LaserCode, MenuText in pairs( self.MenuLaserCodes ) do MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, string.format( MenuText, LaserCode ), DetectedMenu, self.MenuLaseCode, self, DesignateIndex, 60, LaserCode ):SetTime( MenuTime ):SetTag( self.DesignateName ) end MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Lase with random laser code(s)", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 60 ):SetTime( MenuTime ):SetTag( self.DesignateName ) + else + MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Stop lasing", DetectedMenu, self.MenuLaseOff, self, DesignateIndex ):SetTime( MenuTime ):SetTag( self.DesignateName ) + end + + -- Build the Smoking menu. + if string.find( Designating, "S", 1, true ) == nil then MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Smoke red", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Red ):SetTime( MenuTime ):SetTag( self.DesignateName ) MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Smoke blue", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Blue ):SetTime( MenuTime ):SetTag( self.DesignateName ) MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Smoke green", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Green ):SetTime( MenuTime ):SetTag( self.DesignateName ) MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Smoke white", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.White ):SetTime( MenuTime ):SetTag( self.DesignateName ) MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Smoke orange", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Orange ):SetTime( MenuTime ):SetTag( self.DesignateName ) + end + + -- Build the Illuminate menu. + if string.find( Designating, "I", 1, true ) == nil then MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Illuminate", DetectedMenu, self.MenuIlluminate, self, DesignateIndex ):SetTime( MenuTime ):SetTag( self.DesignateName ) - else - if Designating == "Laser" then - MenuText = "(L) " .. MenuText - elseif Designating == "Smoke" then - MenuText = "(S) " .. MenuText - elseif Designating == "Illuminate" then - MenuText = "(I) " .. MenuText - end - local DetectedMenu = MENU_GROUP_DELAYED:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName ) - if Designating == "Laser" then - MENU_GROUP_COMMAND_DELAYED:New( AttackGroup, "Stop lasing", DetectedMenu, self.MenuLaseOff, self, DesignateIndex ):SetTime( MenuTime ):SetTag( self.DesignateName ) - else - end end end end @@ -898,11 +903,11 @@ do -- DESIGNATE --- -- @param #DESIGNATE self - function DESIGNATE:MenuStatus( AttackGroup, Duration ) + function DESIGNATE:MenuStatus( AttackGroup ) self:E("Status") - self:SendStatus( AttackGroup, Duration ) + self:SendStatus( AttackGroup ) end --- @@ -922,7 +927,7 @@ do -- DESIGNATE self:E("Forget") - self.Designating[Index] = nil + self.Designating[Index] = "" self:SetDesignateMenu() end @@ -941,8 +946,11 @@ do -- DESIGNATE self:E("Designate through Smoke") - self.Designating[Index] = "Smoke" + if string.find( self.Designating[Index], "S" ) == nil then + self.Designating[Index] = self.Designating[Index] .. "S" + end self:Smoke( Index, Color ) + self:SetDesignateMenu() end --- @@ -951,9 +959,12 @@ do -- DESIGNATE self:E("Designate through Illumination") - self.Designating[Index] = "Illuminate" + if string.find( self.Designating[Index], "I", 1, true ) == nil then + self.Designating[Index] = self.Designating[Index] .. "I" + end self:__Illuminate( 1, Index ) + self:SetDesignateMenu() end --- @@ -984,7 +995,7 @@ do -- DESIGNATE self:E("Lasing off") - self.Designating[Index] = "" + self.Designating[Index] = string.gsub( self.Designating[Index], "L", "" ) self:__LaseOff( 1, Index ) self:SetDesignateMenu() end @@ -993,10 +1004,12 @@ do -- DESIGNATE -- @param #DESIGNATE self function DESIGNATE:onafterLaseOn( From, Event, To, Index, Duration, LaserCode ) - self.Designating[Index] = "Laser" + if string.find( self.Designating[Index], "L", 1, true ) == nil then + self.Designating[Index] = self.Designating[Index] .. "L" + end self.LaseStart = timer.getTime() self.LaseDuration = Duration - self:__Lasing( -1, Index, Duration, LaserCode ) + self:Lasing( Index, Duration, LaserCode ) end @@ -1097,11 +1110,11 @@ do -- DESIGNATE end self.Recces[TargetUnit] = RecceUnit - RecceUnit:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. RecceUnit:GetSpot().LaserCode .. " for " .. Duration .. "s.", - 5, self.AttackSet, DesignateName ) -- OK. We have assigned for the Recce a TargetUnit. We can exit the function. MarkingCount = MarkingCount + 1 local TargetUnitType = TargetUnit:GetTypeName() + --RecceUnit:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. RecceUnit:GetSpot().LaserCode .. " for " .. Duration .. "s.", + -- 5, self.AttackSet, DesignateName ) if not MarkedTypes[TargetUnitType] then MarkedTypes[TargetUnitType] = true ReportTypes:Add(TargetUnitType) @@ -1124,7 +1137,7 @@ do -- DESIGNATE Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() "out of LOS. Cancelling lase!", 5, self.AttackSet, self.DesignateName ) end else - MarkingCount = MarkingCount + 1 + --MarkingCount = MarkingCount + 1 local TargetUnitType = TargetUnit:GetTypeName() if not MarkedTypes[TargetUnitType] then MarkedTypes[TargetUnitType] = true @@ -1152,16 +1165,14 @@ do -- DESIGNATE local MarkedTypesText = ReportTypes:Text(', ') local MarkedLaserCodesText = ReportLaserCodes:Text(', ') - for MarkedType, MarketCount in pairs( MarkedTypes ) do - self.CC:GetPositionable():MessageToSetGroup( "Marking " .. MarkingCount .. " x " .. MarkedTypesText .. " with lasers " .. MarkedLaserCodesText .. ".", 5, self.AttackSet, self.DesignateName ) - end + self.CC:GetPositionable():MessageToSetGroup( "Marking " .. MarkingCount .. " x " .. MarkedTypesText .. ", code " .. MarkedLaserCodesText .. ".", 5, self.AttackSet, self.DesignateName ) self:__Lasing( -30, Index, Duration, LaserCodeRequested ) self:SetDesignateMenu() else - self:__LaseOff( 1 ) + self:LaseOff( Index ) end end @@ -1191,6 +1202,7 @@ do -- DESIGNATE self.Recces = {} self.LaserCodesUsed = {} + self.Designating[Index] = string.gsub( self.Designating[Index], "L", "" ) self:SetDesignateMenu() end @@ -1222,13 +1234,14 @@ do -- DESIGNATE RecceUnit:MessageToSetGroup( "Smoking " .. SmokeUnit:GetTypeName() .. ".", 5, self.AttackSet, self.DesignateName ) + if SmokeUnit:IsAlive() then + SmokeUnit:Smoke( Color, 50, 2 ) + end + self.MarkScheduler:Schedule( self, function() - if SmokeUnit:IsAlive() then - SmokeUnit:Smoke( Color, 50, 2 ) - end - self:Done( Index ) - end, {}, math.random( 5, 20 ) + self:DoneSmoking( Index ) + end, {}, math.random( 180, 240 ) ) end end @@ -1251,28 +1264,38 @@ do -- DESIGNATE local RecceUnit = RecceGroup:GetUnit( 1 ) if RecceUnit then RecceUnit:MessageToSetGroup( "Illuminating " .. TargetUnit:GetTypeName() .. ".", 5, self.AttackSet, self.DesignateName ) + if TargetUnit:IsAlive() then + -- Fire 2 illumination bombs at random locations. + TargetUnit:GetPointVec3():AddY(math.random( 350, 500) ):AddX(math.random(-50,50) ):AddZ(math.random(-50,50) ):IlluminationBomb() + TargetUnit:GetPointVec3():AddY(math.random( 350, 500) ):AddX(math.random(-50,50) ):AddZ(math.random(-50,50) ):IlluminationBomb() + end self.MarkScheduler:Schedule( self, function() - if TargetUnit:IsAlive() then - TargetUnit:GetPointVec3():AddY(300):IlluminationBomb() - end - self:Done( Index ) - end, {}, math.random( 5, 20 ) + self:DoneIlluminating( Index ) + end, {}, math.random( 60, 90 ) ) end end end - --- Done + --- DoneSmoking -- @param #DESIGNATE self -- @return #DESIGNATE - function DESIGNATE:onafterDone( From, Event, To, Index ) + function DESIGNATE:onafterDoneSmoking( From, Event, To, Index ) - self.Designating[Index] = nil + self.Designating[Index] = string.gsub( self.Designating[Index], "S", "" ) + self:SetDesignateMenu() + end + + --- DoneIlluminating + -- @param #DESIGNATE self + -- @return #DESIGNATE + function DESIGNATE:onafterDoneIlluminating( From, Event, To, Index ) + + self.Designating[Index] = string.gsub( self.Designating[Index], "I", "" ) self:SetDesignateMenu() end end --- Help from Ciribob