diff --git a/Moose Development/Moose/Ops/Operation.lua b/Moose Development/Moose/Ops/Operation.lua index 90455a1d7..c612ae053 100644 --- a/Moose Development/Moose/Ops/Operation.lua +++ b/Moose Development/Moose/Ops/Operation.lua @@ -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 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Ops/PlayerTask.lua b/Moose Development/Moose/Ops/PlayerTask.lua index 2aa24ffbd..e98bcf67b 100644 --- a/Moose Development/Moose/Ops/PlayerTask.lua +++ b/Moose Development/Moose/Ops/PlayerTask.lua @@ -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 diff --git a/Moose Development/Moose/Ops/Target.lua b/Moose Development/Moose/Ops/Target.lua index 88269f826..bb4b550dd 100644 --- a/Moose Development/Moose/Ops/Target.lua +++ b/Moose Development/Moose/Ops/Target.lua @@ -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)