From 8cda04be4507ba3b7d55081b79dcdf1cbaf51708 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 9 Dec 2016 13:35:36 +0100 Subject: [PATCH] Updates - When joining a slot, you get a mission briefing. - When task is successful, a message is displayed, and the task is Success. - HeadQuarters clears all menus of the involved groups back to Planned. --- Moose Development/Moose/Fsm/Fsm.lua | 2 +- .../Moose/Tasking/CommandCenter.lua | 14 ++- Moose Development/Moose/Tasking/Mission.lua | 4 + Moose Development/Moose/Tasking/Task.lua | 34 ++++- .../Moose/Wrapper/Controllable.lua | 114 ----------------- .../Moose/Wrapper/Positionable.lua | 116 ++++++++++++++++++ .../TSK-010 - Task Modelling - SEAD.lua | 8 +- .../TSK-010 - Task Modelling - SEAD.miz | Bin 28464 -> 28576 bytes 8 files changed, 171 insertions(+), 121 deletions(-) diff --git a/Moose Development/Moose/Fsm/Fsm.lua b/Moose Development/Moose/Fsm/Fsm.lua index 42f5d88c7..04b424afa 100644 --- a/Moose Development/Moose/Fsm/Fsm.lua +++ b/Moose Development/Moose/Fsm/Fsm.lua @@ -505,7 +505,7 @@ do -- FSM_PROCESS -- @param #FSM_PROCESS self -- @return #FSM_PROCESS function FSM_PROCESS:Copy( Controllable, Task ) - self:E( { self:GetClassNameAndID(), Controllable:GetName() } ) + self:E( { self:GetClassNameAndID() } ) local NewFsm = self:New( Controllable, Task ) -- Fsm.Fsm#FSM_PROCESS diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 63a5c18b1..a9c731c23 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -68,6 +68,7 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) setmetatable( self.Missions, { __mode = "v" } ) self:EventOnBirth( + --- @param #COMMANDCENTER self --- @param Core.Event#EVENTDATA EventData function( self, EventData ) self:E( { EventData } ) @@ -75,6 +76,7 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) if EventGroup and self:HasGroup( EventGroup ) then local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu ) local MenuMissions = MENU_GROUP_COMMAND:New( EventGroup, "Missions", MenuReporting, self.ReportMissions, self, EventGroup ) + self:ReportMissions( EventGroup ) end end ) @@ -90,6 +92,13 @@ function COMMANDCENTER:GetName() return self.HQName end +--- Gets the POSITIONABLE of the HQ command center. +-- @param #COMMANDCENTER self +-- @return Wrapper.Positionable#POSITIONABLE +function COMMANDCENTER:GetPositionable() + return self.CommandCenterPositionable +end + --- Add a MISSION to be governed by the HQ command center. -- @param #COMMANDCENTER self @@ -118,7 +127,7 @@ end -- @param #COMMANDCENTER self function COMMANDCENTER:SetMenu() - self.CommandCenterMenu = MENU_COALITION:New( self.CommandCenterCoalition, "HQ" ) + self.CommandCenterMenu = self.CommandCenterMenu or MENU_COALITION:New( self.CommandCenterCoalition, "HQ" ) for MissionID, Mission in pairs( self.Missions ) do local Mission = Mission -- Tasking.Mission#MISSION @@ -148,6 +157,7 @@ end --- Report the status of all MISSIONs to a GROUP. +-- @param #COMMANDCENTER self function COMMANDCENTER:ReportMissions( ReportGroup ) self:E( ReportGroup ) @@ -158,7 +168,7 @@ function COMMANDCENTER:ReportMissions( ReportGroup ) Report:Add( " - " .. Mission:ReportStatus() ) end - MESSAGE:New( Report:Text(), 30, "Status Report Missions from " .. self:GetName() .. "\n" ):ToGroup( ReportGroup ) + self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 2e3cb2bd2..388071ee2 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -122,6 +122,10 @@ function MISSION:SetMenu() end end + +--- Gets the COMMANDCENTER. +-- @param #MISSION self +-- @return Tasking.CommandCenter#COMMANDCENTER function MISSION:GetCommandCenter() return self.CommandCenter end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 04f37fbd8..0967fd519 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -93,6 +93,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) self.Fsm = {} self.Mission = Mission + self.SetGroup = SetGroupAssign self:SetType( TaskType ) @@ -161,14 +162,30 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) end ) + Mission:AddTask( self ) + return self end +--- Get the Task FSM Process Template +-- @param #TASK_BASE self +-- @return Fsm.Fsm#FSM_PROCESS function TASK_BASE:GetFsmTemplate() return self.FsmTemplate end +--- Sets the Task FSM Process Template +-- @param #TASK_BASE self +-- @param Fsm.Fsm#FSM_PROCESS +function TASK_BASE:SetFsmTemplate( FsmTemplate ) + + self.FsmTemplate = FsmTemplate +end + +--- Gets the Mission to where the TASK belongs. +-- @param #TASK_BASE self +-- @return Tasking.Mission#MISSION function TASK_BASE:GetMission() return self.Mission @@ -283,6 +300,9 @@ function TASK_BASE:UnAssignFromGroups() for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do TaskGroup:SetState( TaskGroup, "Assigned", nil ) + + self:RemoveMenuForGroup( TaskGroup ) + local TaskUnits = TaskGroup:GetUnits() for UnitID, UnitData in pairs( TaskUnits ) do local TaskUnit = UnitData -- Wrapper.Unit#UNIT @@ -316,7 +336,9 @@ end function TASK_BASE:SetMenu() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - self:SetMenuForGroup( TaskGroup ) + if self:IsStatePlanned() or self:IsStateReplanned() then + self:SetMenuForGroup( TaskGroup ) + end end end @@ -773,8 +795,16 @@ function TASK_BASE:onenterSuccess( Event, From, To ) self:E("Success") + local Mission = self:GetMission() + local CC = Mission:GetCommandCenter() + + for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do + CC:GetPositionable():MessageToGroup( "Task " .. self:GetName() .. " is successful! Good job!" , 60, TaskGroup ) + end + self:UnAssignFromGroups() - self:SetMenu() + + CC:SetMenu() end diff --git a/Moose Development/Moose/Wrapper/Controllable.lua b/Moose Development/Moose/Wrapper/Controllable.lua index 1d5f76969..09368668f 100644 --- a/Moose Development/Moose/Wrapper/Controllable.lua +++ b/Moose Development/Moose/Wrapper/Controllable.lua @@ -2203,118 +2203,4 @@ end -- Message APIs ---- Returns a message with the callsign embedded (if there is one). --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. --- @return Core.Message#MESSAGE -function CONTROLLABLE:GetMessage( Message, Duration ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. -function CONTROLLABLE:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - self:GetMessage( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTYpes#Duration Duration The duration of the message. -function CONTROLLABLE:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - self:GetMessage( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. -function CONTROLLABLE:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - self:GetMessage( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. --- @param Wrapper.Client#CLIENT Client The client object receiving the message. -function CONTROLLABLE:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - self:GetMessage( Message, Duration ):ToClient( Client ) - end - - return nil -end - ---- Send a message to a @{Group}. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. --- @param Wrapper.Group#GROUP MessageGroup The GROUP object receiving the message. -function CONTROLLABLE:MessageToGroup( Message, Duration, MessageGroup ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - if DCSObject:isExist() then - self:GetMessage( Message, Duration ):ToGroup( MessageGroup ) - end - end - - return nil -end - ---- Send a message to the players in the @{Group}. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #CONTROLLABLE self --- @param #string Message The message text --- @param Dcs.DCSTypes#Duration Duration The duration of the message. -function CONTROLLABLE:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSObject = self:GetDCSObject() - if DCSObject then - self:GetMessage( Message, Duration ):ToGroup( self ) - end - - return nil -end diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 7693544cb..9cee3d91e 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -276,6 +276,122 @@ function POSITIONABLE:GetVelocityKMH() return nil end +--- Returns a message with the callsign embedded (if there is one). +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @return Core.Message#MESSAGE +function POSITIONABLE:GetMessage( Message, Duration ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +function POSITIONABLE:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTYpes#Duration Duration The duration of the message. +function POSITIONABLE:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +function POSITIONABLE:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Client#CLIENT Client The client object receiving the message. +function POSITIONABLE:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration ):ToClient( Client ) + end + + return nil +end + +--- Send a message to a @{Group}. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +-- @param Wrapper.Group#GROUP MessageGroup The GROUP object receiving the message. +function POSITIONABLE:MessageToGroup( Message, Duration, MessageGroup ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + if DCSObject:isExist() then + self:GetMessage( Message, Duration ):ToGroup( MessageGroup ) + end + end + + return nil +end + +--- Send a message to the players in the @{Group}. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #POSITIONABLE self +-- @param #string Message The message text +-- @param Dcs.DCSTypes#Duration Duration The duration of the message. +function POSITIONABLE:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSObject = self:GetDCSObject() + if DCSObject then + self:GetMessage( Message, Duration ):ToGroup( self ) + end + + return nil +end + + diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua index 371bafabe..d5545a1d9 100644 --- a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua +++ b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua @@ -50,7 +50,7 @@ local TargetZone = ZONE:New( "Target Zone" ) -- 2. The set of groups of planes that pilots can join. -- 3. The name of the Task... This can be any name, and will be provided when the Pilot joins the task. -- 4. A type of the Task. When Tasks are in state Planned, then a menu can be provided that group the task based on this given type. -local TaskSEAD = TASK_BASE:New( Mission, SEADSet, "SEAD Radars", "SEAD" ) -- Tasking.Task#TASK_BASE +local TaskSEAD = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 1", "SEAD" ) -- Tasking.Task#TASK_BASE -- This is now an important part of the Task process definition. -- Each TASK contains a "Process Template". @@ -111,6 +111,10 @@ function FsmSEADTemplate:onenterUpdated( TaskUnit ) self:Smoke() end -Mission:AddTask( TaskSEAD ) + +local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE +TaskSEAD2:SetFsmTemplate( TaskSEAD:GetFsmTemplate():Copy() ) +--Mission:AddTask( TaskSEAD2 ) + HQ:SetMenu() diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz index 032c4ec9bea7090894ca7e0ce0b1f3abdb345f2f..fb8b6fe4487a07789672ef91753833b98409874c 100644 GIT binary patch delta 13186 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 delta 13036 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 R-=kQvzat^kx$S@R{|B21Q&j)}