Merge pull request #588 from FlightControl-Master/585-TASK-A2A-DISPATCHER

585 task a2a dispatcher
This commit is contained in:
Sven Van de Velde 2017-06-25 07:41:07 +02:00 committed by GitHub
commit fa77ba3f48
4 changed files with 115 additions and 4 deletions

View File

@ -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 "<MissionName>" - <MissionStatus> - Active Players Report
-- - Player <PlayerName>: Task <TaskName> <TaskStatus>: <Progress>
-- - Player <PlayerName>: Task <TaskName> <TaskStatus>: <Progress>
-- - ..
--
-- @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

View File

@ -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

View File

@ -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

View File

@ -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