This commit is contained in:
Frank
2020-03-10 17:03:24 +01:00
parent a477fc78bc
commit 6305459056
6 changed files with 409 additions and 86 deletions
+253 -5
View File
@@ -64,6 +64,9 @@
--
-- @field #number missionAltitude Mission altitude in meters.
--
-- @field #number missionRepeated Number of times mission was repeated.
-- @field #number missionRepeatMax Number of times mission is repeated if failed.
--
-- @field #number optionROE ROE.
-- @field #number optionROT ROT.
-- @field #number optionCM Counter measures.
@@ -252,6 +255,9 @@ function AUFTRAG:New(Type)
self:SetPriority()
self:SetMissionTime()
self.missionRepeated=0
self.missionRepeatMax=1
-- FMS start state is PLANNED.
self:SetStartState(self.status)
@@ -269,12 +275,22 @@ function AUFTRAG:New(Type)
self:AddTransition("*", "Done", AUFTRAG.Status.DONE) -- All assets have reported that mission is done.
self:AddTransition("*", "Cancel", AUFTRAG.Status.CANCELLED) -- Command to cancel the mission.
self:AddTransition("*", "Accomplished", AUFTRAG.Status.SUCCESS)
self:AddTransition("*", "Success", AUFTRAG.Status.SUCCESS)
self:AddTransition("*", "Failed", AUFTRAG.Status.FAILED)
self:AddTransition("*", "Status", "*")
self:AddTransition("*", "Stop", "Stopped")
self:AddTransition("*", "Repeat", AUFTRAG.Status.PLANNED)
self:AddTransition("*", "AssetDead", "*")
--[[
self:HandleEvent(EVENTS.PilotDead, self._UnitDead)
self:HandleEvent(EVENTS.Ejection, self._UnitDead)
self:HandleEvent(EVENTS.Crash, self._UnitDead)
]]
self:__Status(-1)
return self
@@ -471,6 +487,69 @@ function AUFTRAG:NewBAI(TargetGroupSet)
return mission
end
--- Create a mission to attack a group. Mission type is automatically chosen from the group category.
-- @param #AUFTRAG self
-- @param Wrapper.Group#GROUP EngageGroup Group to be engaged.
-- @return #AUFTRAG self
function AUFTRAG:NewAUTO(EngageGroup)
local mission=nil --#AUFTRAG
local group=EngageGroup
if group and group:IsAlive() then
local category=group:GetCategory()
local attribute=group:GetAttribute()
local threatlevel=group:GetThreatLevel()
if category==Group.Category.AIRPLANE or category==Group.Category.HELICOPTER then
mission=AUFTRAG:NewINTERCEPT(group)
elseif category==Group.Category.GROUND then
--TODO: action depends on type
-- AA/SAM ==> SEAD
-- Tanks ==>
-- Artillery ==>
-- Infantry ==>
--
if attribute==GROUP.Attribute.GROUND_AAA or attribute==GROUP.Attribute.GROUND_SAM then
--TODO: SEAD/DEAD
end
mission=AUFTRAG:NewBAI(group)
elseif category==Group.Category.SHIP then
--TODO: ANTISHIP
local TargetUnitSet=SET_UNIT:New()
for _,_unit in pairs(group:GetUnits()) do
local unit=_unit --Wrapper.Unit#UNIT
if unit and unit:IsAlive() and unit:GetThreatLevel()>0 then
TargetUnitSet:AddUnit(unit)
end
end
if TargetUnitSet:Count()>0 then
mission=AUFTRAG:NewANTISHIP(TargetUnitSet)
end
end
end
return mission
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- User API Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -545,6 +624,20 @@ function AUFTRAG:SetWeaponType(WeaponType)
return self
end
--- Set number of weapons to expend.
-- @param #AUFTRAG self
-- @param #number WeaponType Weapon type. Default is ENUMS.WeaponFlag.Auto
-- @return #AUFTRAG self
function AUFTRAG:SetWeaponExpend(WeaponExpend)
self.engageWeaponExpend=WeaponExpend or "Auto"
-- Update the DCS task parameter.
self.DCStask=self:GetDCSMissionTask()
return self
end
--- Set mission altitude.
-- @param #AUFTRAG self
-- @param #string Altitude Altitude in feet.
@@ -554,9 +647,9 @@ function AUFTRAG:SetMissionAltitude(Altitude)
return self
end
--- Set Rules of Engagement for this mission.
--- Set Rules of Engagement (ROE) for this mission.
-- @param #AUFTRAG self
-- @param #number roe ROE
-- @param #string roe Mision ROE.
-- @return #AUFTRAG self
function AUFTRAG:SetROE(roe)
@@ -566,6 +659,18 @@ function AUFTRAG:SetROE(roe)
end
--- Set Reaction on Threat (ROT) for this mission.
-- @param #AUFTRAG self
-- @param #string roe Mision ROT.
-- @return #AUFTRAG self
function AUFTRAG:SetROE(rot)
self.optionROT=rot
return self
end
--- Add a flight group to the mission.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FLIGHTGROUP object.
@@ -675,6 +780,10 @@ function AUFTRAG:onafterStatus(From, Event, To)
self:Cancel()
end
if self:IsNotOver() and #self.assets==0 then
self:Cancel()
end
-- Check if ALL flights are done with their mission.
if self:IsNotOver() and self:CheckFlightsDone() then
self:Done()
@@ -695,12 +804,13 @@ function AUFTRAG:onafterStatus(From, Event, To)
self:E(self.lid..string.format("ERROR: FSM state %s != %s mission status!", fsmstate, self.status))
end
-- Check if mission is OVER.
if self:IsOver() then
-- TODO: evaluate mission result. self.Ntargets>0 and Ntargets=?
-- TODO: if failed, repeat mission, i.e. set status to PLANNED? if success, stop and remove from ALL queues.
self:Stop()
--self:Stop()
self:Evaluate()
else
self:__Status(-30)
end
@@ -712,6 +822,12 @@ end
function AUFTRAG:Evaluate()
local Ntargets=self:CountMissionTargets()
if self.Ntargets>Ntargets then
self:Failed()
else
self:Success()
end
end
@@ -801,6 +917,34 @@ function AUFTRAG:CheckFlightsDone()
return done
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- EVENT Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Flightgroup event function handling the crash of a unit.
-- @param #FLIGHTGROUP self
-- @param Core.Event#EVENTDATA EventData Event data.
function AUFTRAG:OnEventCrash(EventData)
-- Check that this is the right group.
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
local unit=EventData.IniUnit
local group=EventData.IniGroup
local unitname=EventData.IniUnitName
-- Get element.
local element=self:GetElementByName(unitname)
if element then
self:T3(self.lid..string.format("EVENT: Element %s crashed ==> dead", element.name))
self:ElementDead(element)
end
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- FSM Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -879,6 +1023,35 @@ function AUFTRAG:onafterDone(From, Event, To)
self:I(self.lid..string.format("New mission status=%s", self.status))
end
--- On after "AssetDead" event.
-- @param #AUFTRAG self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.AirWing#AIRWING.SquadronAsset
function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
-- Delete asset from mission.
self:DelAsset(Asset)
-- All assets dead?
if #self.assets==0 then
if self:IsNotOver() then
-- Mission failed.
self:Failed()
else
self:Stop()
end
end
end
--- On after "Cancel" event. Cancells the mission.
-- @param #AUFTRAG self
-- @param #string From From state.
@@ -905,6 +1078,61 @@ function AUFTRAG:onafterCancel(From, Event, To)
end
--- On after "Failed" event.
-- @param #AUFTRAG self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
function AUFTRAG:onafterFailed(From, Event, To)
self.status=AUFTRAG.Status.FAILED
self:I(self.lid..string.format("New mission status=%s", self.status))
if self.missionRepeated>=self.missionRepeatMax then
self:Stop()
else
-- Repeat mission.
self:Repeat()
end
end
--- On after "Repeat" event.
-- @param #AUFTRAG self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
function AUFTRAG:onafterRepeat(From, Event, To)
-- Increase repeat counter.
self.missionRepeated=self.missionRepeated+1
if self.wingcommander then
elseif self.airwing then
end
end
--- On after "Success" event.
-- @param #AUFTRAG self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
function AUFTRAG:onafterSuccess(From, Event, To)
self.status=AUFTRAG.Status.SUCCESS
self:I(self.lid..string.format("New mission status=%s", self.status))
end
--- On after "Stop" event. Remove mission from AIRWING and FLIGHTGROUP mission queues.
-- @param #AUFTRAG self
-- @param #string From From state.
@@ -914,6 +1142,8 @@ function AUFTRAG:onafterStop(From, Event, To)
-- TODO: remove missions from queues in WINGCOMMANDER, AIRWING and FLIGHGROUPS!
-- TODO: Mission should be OVER! we dont want to remove running missions from any queues.
if self.wingcommander then
end
@@ -966,6 +1196,24 @@ function AUFTRAG:DelAsset(Asset)
return self
end
--- Get asset by its spawn group name.
-- @param #AUFTRAG self
-- @param #string Name Asset spawn group name.
-- @return Ops.AirWing#AIRWING.SquadronAsset
function AUFTRAG:GetAssetByName(Name)
for i,_asset in pairs(self.assets or {}) do
local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset
if asset.spawngroupname==Name then
return asset
end
end
return nil
end
--- Count alive mission targets.
-- @param #AUFTRAG self