diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 5c278d522..beae73c77 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -46,6 +46,7 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi self.MissionCoalition = MissionCoalition self.Tasks = {} + self.PlayerNames = {} -- These are the players that achieved progress in the mission. self:SetStartState( "IDLE" ) @@ -501,7 +502,8 @@ function MISSION:GetMenu( TaskGroup ) -- R2.1 -- Changed Menu Structure Menu.ReportFailedTasksMenu = Menu.ReportFailedTasksMenu or MENU_GROUP_COMMAND:New( TaskGroup, "Report Failed Tasks", Menu.TaskReportsMenu, self.MenuReportTasksPerStatus, self, TaskGroup, "Failed" ) Menu.ReportHeldTasksMenu = Menu.ReportHeldTasksMenu or MENU_GROUP_COMMAND:New( TaskGroup, "Report Held Tasks", Menu.TaskReportsMenu, self.MenuReportTasksPerStatus, self, TaskGroup, "Hold" ) - Menu.PlayerReportsMenu = Menu.PlayerReportsMenu or MENU_GROUP:New( TaskGroup, "Player Reports", Menu.MainMenu ) + Menu.PlayerReportsMenu = Menu.PlayerReportsMenu or MENU_GROUP:New( TaskGroup, "Statistics Reports", Menu.MainMenu ) + Menu.ReportMissionHistory = Menu.ReportPlayersHistory or MENU_GROUP_COMMAND:New( TaskGroup, "Report Mission Progress", Menu.PlayerReportsMenu, self.MenuReportPlayersProgress, self, TaskGroup ) Menu.ReportPlayersPerTaskMenu = Menu.ReportPlayersPerTaskMenu or MENU_GROUP_COMMAND:New( TaskGroup, "Report Players per Task", Menu.PlayerReportsMenu, self.MenuReportPlayersPerTask, self, TaskGroup ) return Menu.MainMenu @@ -661,6 +663,18 @@ function MISSION:GetTaskTypes() return TaskTypeList end + +function MISSION:AddPlayerName( PlayerName ) + self.PlayerNames = self.PlayerNames or {} + self.PlayerNames[PlayerName] = PlayerName + return self +end + +function MISSION:GetPlayerNames() + return self.PlayerNames +end + + --- Create a briefing report of the Mission. -- @param #MISSION self -- @return #string @@ -736,6 +750,7 @@ function MISSION:ReportStatus() return Report:Text() end + --- Create an active player report of the Mission. -- This reports provides a one liner of the mission status. It indicates how many players and how many Tasks. -- @@ -777,6 +792,56 @@ function MISSION:ReportPlayersPerTask( ReportGroup ) return Report:Text() end +--- Create an Mission Progress report of the Mission. +-- This reports provides a one liner per player of the mission achievements per task. +-- +-- Mission "" - - Active Players Report +-- - Player : Task : +-- - Player : Task : +-- - .. +-- +-- @param #MISSION self +-- @return #string +function MISSION:ReportPlayersProgress( ReportGroup ) + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( string.format( '%s - %s - Players per Task Progress Report', Name, Status ) ) + + local PlayerList = {} + + -- Determine how many tasks are remaining. + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + local TaskGoalTotal = Task:GetGoalTotal() or 0 + local TaskName = Task:GetName() + PlayerList[TaskName] = PlayerList[TaskName] or {} + if TaskGoalTotal ~= 0 then + local PlayerNames = self:GetPlayerNames() + for PlayerName, PlayerData in pairs( PlayerNames ) do + PlayerList[TaskName][PlayerName] = string.format( 'Player (%s): Task "%s": %d%%', PlayerName, TaskName, Task:GetPlayerProgress( PlayerName ) * 100 / TaskGoalTotal ) + end + else + PlayerList[TaskName]["_"] = string.format( 'Player (---): Task "%s": %d%%', TaskName, 0 ) + end + + end + + for TaskName, TaskData in pairs( PlayerList ) do + for PlayerName, TaskText in pairs( TaskData ) do + Report:Add( string.format( ' - %s', TaskText ) ) + end + end + + return Report:Text() +end + --- Create a summary report of the Mission (one line). -- @param #MISSION self @@ -902,6 +967,15 @@ function MISSION:MenuReportPlayersPerTask( ReportGroup ) self:GetCommandCenter():MessageToGroup( Report, ReportGroup ) end +--- @param #MISSION self +-- @param Wrapper.Group#GROUP ReportGroup +function MISSION:MenuReportPlayersProgress( ReportGroup ) + + local Report = self:ReportPlayersProgress() + + self:GetCommandCenter():MessageToGroup( Report, ReportGroup ) +end + diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index f26347c36..c6180aad9 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -1183,6 +1183,11 @@ function TASK:onenterAssigned( From, Event, To, PlayerUnit, PlayerName ) if From ~= "Assigned" then self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " is assigned." ) + + -- Set the total Progress to be achieved. + + self:SetGoalTotal() -- Polymorphic to set the initial goal total! + if self.Dispatcher then self:E( "Firing Assign event " ) self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) @@ -1485,8 +1490,19 @@ do -- Additional Task Scoring and Task Progress self.TaskProgress[ProgressTime].PlayerName = PlayerName self.TaskProgress[ProgressTime].ProgressText = ProgressText self.TaskProgress[ProgressTime].ProgressPoints = ProgressPoints + self:GetMission():AddPlayerName( PlayerName ) return self end + + function TASK:GetPlayerProgress( PlayerName ) + local ProgressPlayer = 0 + for ProgressTime, ProgressData in pairs( self.TaskProgress ) do + if PlayerName == ProgressData.PlayerName then + ProgressPlayer = ProgressPlayer + ProgressData.ProgressPoints + end + end + return ProgressPlayer + end --- Set a score when progress has been made by the player. -- @param #TASK self diff --git a/Moose Development/Moose/Tasking/Task_A2A.lua b/Moose Development/Moose/Tasking/Task_A2A.lua index a25dbd456..9adf00b9b 100644 --- a/Moose Development/Moose/Tasking/Task_A2A.lua +++ b/Moose Development/Moose/Tasking/Task_A2A.lua @@ -266,6 +266,18 @@ do -- TASK_A2A local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE return ActRouteTarget:GetZone() end + + function TASK_A2A:SetGoalTotal() + + self.GoalTotal = self.TargetSetUnit:Count() + end + + function TASK_A2A:GetGoalTotal() + + return self.GoalTotal + end + + end @@ -386,8 +398,7 @@ do -- TASK_A2A_INTERCEPT return self end - - + end diff --git a/Moose Development/Moose/Tasking/Task_A2G.lua b/Moose Development/Moose/Tasking/Task_A2G.lua index ff7db7e59..aa56d3d42 100644 --- a/Moose Development/Moose/Tasking/Task_A2G.lua +++ b/Moose Development/Moose/Tasking/Task_A2G.lua @@ -60,7 +60,7 @@ do -- TASK_A2G self.TargetSetUnit = TargetSetUnit self.TaskType = TaskType - + local Fsm = self:GetUnitProcess() @@ -266,7 +266,17 @@ do -- TASK_A2G local ActRouteTarget = ProcessUnit:GetProcess( "Engaging", "RouteToTargetZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE return ActRouteTarget:GetZone() end + + function TASK_A2G:SetGoalTotal() + self.GoalTotal = self.TargetSetUnit:Count() + end + + function TASK_A2G:GetGoalTotal() + + return self.GoalTotal + end + end