#OPERATION

* Added GetTargets()

#TARGET
* Also call Dead() when no targets left over

#PLAYERTASKCONTROLLER
* Added FSM events for Flaring, Smoking, and Illumination
* Added Illumination of targets in menu if it is night
* Rename menu parent setting to SetParentMenu(Menu)
This commit is contained in:
Applevangelist 2022-10-21 09:51:44 +02:00
parent 1fc541a9df
commit 37a00f25bc
3 changed files with 99 additions and 11 deletions

View File

@ -467,7 +467,7 @@ function OPERATION:SetPhaseConditonOver(Phase, Condition)
return self
end
--- Add codition function when the given phase is over. Must return a `#boolean`.
--- Add condition function when the given phase is over. Must return a `#boolean`.
-- @param #OPERATION self
-- @param #OPERATION.Phase Phase The phase.
-- @param #function Function Function that needs to be `true`before the phase is over.
@ -739,6 +739,20 @@ function OPERATION:AddTarget(Target, Phase)
return self
end
--- Add Targets from operation.
-- @param #OPERATION self
-- @param #OPERATION.Phase Phase
-- @return #table Targets Table of #TARGET objects
function OPERATION:GetTargets(Phase)
local N = {}
for _,_target in pairs(self.targets) do
local target=_target --Ops.Target#TARGET
if target:IsAlive() and (Phase==nil or target.phase==Phase) then
table.insert(N,target)
end
end
return N
end
--- Count targets alive.
-- @param #OPERATION self
@ -896,7 +910,7 @@ function OPERATION:onafterStart(From, Event, To)
-- Debug message.
self:T(self.lid..string.format("Starting Operation!"))
return self
end
@ -967,6 +981,8 @@ function OPERATION:onafterStatusUpdate(From, Event, To)
-- Next status update.
self:__StatusUpdate(-30)
return self
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -978,7 +994,6 @@ end
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param #OPERATION.Phase Phase The new phase.
function OPERATION:onafterPhaseNext(From, Event, To)
-- Get next phase.
@ -996,6 +1011,7 @@ function OPERATION:onafterPhaseNext(From, Event, To)
end
return self
end
@ -1023,6 +1039,7 @@ function OPERATION:onafterPhaseChange(From, Event, To, Phase)
-- Phase is active.
self:SetPhaseStatus(Phase, OPERATION.PhaseStatus.ACTIVE)
return self
end
--- On after "BranchSwitch" event.
@ -1038,7 +1055,8 @@ function OPERATION:onafterBranchSwitch(From, Event, To, Branch)
-- Set active branch.
self.branchActive=Branch
return self
end
--- On after "Over" event.
@ -1062,7 +1080,9 @@ function OPERATION:onafterOver(From, Event, To)
local phase=_phase --#OPERATION.Phase
self:SetPhaseStatus(phase, OPERATION.PhaseStatus.OVER)
end
end
end
return self
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -654,7 +654,7 @@ function PLAYERTASK:onafterStatus(From, Event, To)
-- Check Target status
local targetdead = false
if self.Target:IsDead() or self.Target:IsDestroyed() then
if self.Target:IsDead() or self.Target:IsDestroyed() or self.Target:CountTargets() == 0 then
targetdead = true
self:__Success(-2)
status = "Success"
@ -1397,7 +1397,7 @@ PLAYERTASKCONTROLLER.Messages = {
--- PLAYERTASK class version.
-- @field #string version
PLAYERTASKCONTROLLER.version="0.1.44"
PLAYERTASKCONTROLLER.version="0.1.45"
--- Create and run a new TASKCONTROLLER instance.
-- @param #PLAYERTASKCONTROLLER self
@ -1474,6 +1474,9 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
self:AddTransition("*", "TaskCancelled", "*")
self:AddTransition("*", "TaskSuccess", "*")
self:AddTransition("*", "TaskFailed", "*")
self:AddTransition("*", "TaskTargetSmoked", "*")
self:AddTransition("*", "TaskTargetFlared", "*")
self:AddTransition("*", "TaskTargetIlluminated", "*")
self:AddTransition("*", "TaskRepeatOnFailed", "*")
self:AddTransition("*", "Stop", "Stopped")
@ -1544,6 +1547,30 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
-- @param #string To To state.
-- @param Ops.PlayerTask#PLAYERTASK Task
--- On After "TaskTargetSmoked" event. Task smoked.
-- @function [parent=#PLAYERTASKCONTROLLER] OnAfterTaskTargetSmoked
-- @param #PLAYERTASKCONTROLLER self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.PlayerTask#PLAYERTASK Task
--- On After "TaskTargetFlared" event. Task flared.
-- @function [parent=#PLAYERTASKCONTROLLER] OnAfterTaskTargetFlared
-- @param #PLAYERTASKCONTROLLER self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.PlayerTask#PLAYERTASK Task
--- On After "TaskTargetIlluminated" event. Task illuminated.
-- @function [parent=#PLAYERTASKCONTROLLER] OnAfterTaskTargetIlluminated
-- @param #PLAYERTASKCONTROLLER self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.PlayerTask#PLAYERTASK Task
end
--- [Internal] Init localization
@ -2869,6 +2896,7 @@ function PLAYERTASKCONTROLLER:_SmokeTask(Group, Client)
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
end
self:__TaskTargetSmoked(5,task)
else
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
end
@ -2897,6 +2925,36 @@ function PLAYERTASKCONTROLLER:_FlareTask(Group, Client)
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
end
self:__TaskTargetFlared(5,task)
else
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
end
if not self.NoScreenOutput then
local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client)
end
return self
end
--- [Internal] Illuminate task location
-- @param #PLAYERTASKCONTROLLER self
-- @param Wrapper.Group#GROUP Group
-- @param Wrapper.Client#CLIENT Client
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:_IlluminateTask(Group, Client)
self:T(self.lid.."_IlluminateTask")
local playername, ttsplayername = self:_GetPlayerName(Client)
local text = ""
if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:FlareTarget()
local textmark = self.gettext:GetEntry("FLARETASK",self.locale)
text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr)
self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll()
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
end
self:__TaskTargetIlluminated(5,task)
else
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
end
@ -2912,7 +2970,7 @@ end
-- @param Wrapper.Client#CLIENT Client
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:_AbortTask(Group, Client)
self:T(self.lid.."_FlareTask")
self:T(self.lid.."_AbortTask")
local playername, ttsplayername = self:_GetPlayerName(Client)
local text = ""
if self.TasksPerPlayer:HasUniqueID(playername) then
@ -3080,6 +3138,10 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced,fromsuccess)
-- no smoking/flaring here if A2A or designer has set noflaresmokemenu to true
local smoke = MENU_GROUP_COMMAND_DELAYED:New(group,menusmoke,active,self._SmokeTask,self,group,client)
local flare = MENU_GROUP_COMMAND_DELAYED:New(group,menuflare,active,self._FlareTask,self,group,client)
local IsNight = client:GetCoordinate():IsNight()
if IsNight then
local light = MENU_GROUP_COMMAND_DELAYED:New(group,menuflare,active,self._IlluminateTask,self,group,client)
end
end
end
local abort = MENU_GROUP_COMMAND_DELAYED:New(group,menuabort,active,self._AbortTask,self,group,client)
@ -3244,7 +3306,7 @@ end
-- @param #PLAYERTASKCONTROLLER self
-- @param Core.Menu#MENU_MISSION Menu
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:SetParentName(Menu)
function PLAYERTASKCONTROLLER:SetParentMenu(Menu)
self:T(self.lid.."SetParentName")
self.MenuParent = Menu
return self

View File

@ -617,7 +617,9 @@ function TARGET:onafterStatus(From, Event, To)
-- Log output verbose=1.
if self.verbose>=1 then
local text=string.format("%s: Targets=%d/%d Life=%.1f/%.1f Damage=%.1f", fsmstate, self:CountTargets(), self.N0, self:GetLife(), self:GetLife0(), self:GetDamage())
if damaged then
if self:CountTargets() == 0 then
text=text.." Dead!"
elseif damaged then
text=text.." Damaged!"
end
self:I(self.lid..text)
@ -633,7 +635,11 @@ function TARGET:onafterStatus(From, Event, To)
end
self:I(self.lid..text)
end
if self:CountTargets() == 0 then
self:Dead()
end
-- Update status again in 30 sec.
if self:IsAlive() then
self:__Status(-self.TStatus)