From 56ec7f122fc3c379a5cdf2bab35dc56dd71e638e Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 23 Mar 2020 23:56:10 +0100 Subject: [PATCH] Ops --- .../Moose/Functional/Warehouse.lua | 16 +++++ Moose Development/Moose/Ops/AirWing.lua | 48 ++++++++----- Moose Development/Moose/Ops/Auftrag.lua | 72 ++++++++++++++++--- Moose Development/Moose/Ops/FlightGroup.lua | 5 +- Moose Development/Moose/Ops/Squadron.lua | 25 +++++-- Moose Development/Moose/Ops/WingCommander.lua | 4 ++ 6 files changed, 136 insertions(+), 34 deletions(-) diff --git a/Moose Development/Moose/Functional/Warehouse.lua b/Moose Development/Moose/Functional/Warehouse.lua index 48b53d8ac..3affd7988 100644 --- a/Moose Development/Moose/Functional/Warehouse.lua +++ b/Moose Development/Moose/Functional/Warehouse.lua @@ -6000,6 +6000,22 @@ function WAREHOUSE:GetAssetByID(id) end end +--- Get a warehouse asset from its name. +-- @param #WAREHOUSE self +-- @param #string GroupName Spawn group name. +-- @return #WAREHOUSE.Assetitem The warehouse asset. +function WAREHOUSE:GetAssetByName(GroupName) + + local name=self:_GetNameWithOut(GroupName) + local _,aid,_=self:_GetIDsFromGroup(GROUP:FindByName(name)) + + if aid then + return _WAREHOUSEDB.Assets[aid] + else + return nil + end +end + --- Get a warehouse request from its unique id. -- @param #WAREHOUSE self -- @param #number id Request ID. diff --git a/Moose Development/Moose/Ops/AirWing.lua b/Moose Development/Moose/Ops/AirWing.lua index 0e4ed5818..d938256e3 100644 --- a/Moose Development/Moose/Ops/AirWing.lua +++ b/Moose Development/Moose/Ops/AirWing.lua @@ -579,7 +579,7 @@ function AIRWING:onafterStatus(From, Event, To) -- Count missions not over yet. local nmissions=self:CountMissionsInQueue() - -- TODO: count payloads, count squadrons, count missions + -- TODO: count payloads, assets total local text=string.format("Status %s: missions=%d, payloads=%d, squads=%d", fsmstate, nmissions, #self.payloads, #self.squadrons) self:I(self.lid..text) @@ -598,10 +598,10 @@ function AIRWING:onafterStatus(From, Event, To) ------------------- local text="Squadrons:" for i,_squadron in pairs(self.squadrons) do - local squadron=_squadron --#AIRWING.Squadron + local squadron=_squadron --Ops.Squadron#SQUADRON -- Squadron text - text=text..string.format("\n* %s", squadron.name) + text=text..string.format("\n* %s %s", squadron.name, squadron:GetState()) -- Loop over all assets. for j,_asset in pairs(squadron.assets) do @@ -1026,17 +1026,25 @@ function AIRWING:onafterMissionCancel(From, Event, To, Mission) self:I(self.lid..string.format("Cancel mission %s", Mission.name)) - for _,_asset in pairs(Mission.assets) do - local asset=_asset --#AIRWING.SquadronAsset - - local flightgroup=asset.flightgroup - - if flightgroup then - flightgroup:MissionCancel(Mission) + if Mission:IsPlanned() or Mission:IsQueued() or Mission:IsRequested() then + + Mission:Done() + + else + + for _,_asset in pairs(Mission.assets) do + local asset=_asset --#AIRWING.SquadronAsset + + local flightgroup=asset.flightgroup + + if flightgroup then + flightgroup:MissionCancel(Mission) + end + + -- Not requested any more (if it was). + asset.requested=nil end - -- Not requested any more (if it was). - asset.requested=nil end -- Remove queued request (if any). @@ -1173,13 +1181,19 @@ end -- @param #string To To state. function AIRWING:onafterDestroyed(From, Event, To) + self:I(self.lid.."Airwing warehouse destroyed!") + + -- Cancel all missions. + for _,_mission in pairs(self.missionqueue) do + local mission=_mission --Ops.Auftrag#AUFTRAG + mission:Cancel() + end + + -- Remove all squadron assets. for _,_squadron in pairs(self.squadrons) do local squadron=_squadron --Ops.Squadron#SQUADRON - for _,_asset in pairs(squadron.assets) do - local asset=_asset - squadron:DelAsset(asset) - end - squadron:Stop() + -- Stop Squadron. This also removes all assets. + squadron:Stop() end -- Call parent warehouse function first. diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 74f6a4690..1d29fab04 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -232,6 +232,7 @@ AUFTRAG.TargetType={ -- @field #number waypointindex Waypoint index. -- @field Ops.FlightGroup#FLIGHTGROUP.Task waypointtask Waypoint task. -- @field #string status Flight mission status. +-- @field Ops.AirWing#AIRWING.SquadronAsset asset The squadron asset. --- AUFTRAG class version. @@ -312,7 +313,8 @@ function AUFTRAG:New(Type) self:AddTransition("*", "Stop", "*") self:AddTransition("*", "Repeat", AUFTRAG.Status.PLANNED) - + + self:AddTransition("*", "FlightDead", "*") self:AddTransition("*", "AssetDead", "*") --[[ @@ -1061,6 +1063,11 @@ function AUFTRAG:onafterStatus(From, Event, To) if fsmstate~=self.status then self:E(self.lid..string.format("ERROR: FSM state %s != %s mission status!", fsmstate, self.status)) end + + for _,_flightdata in pairs(self.flightdata) do + local flightdata=_flightdata --#AUFTRAG.FlightData + string.format("%s", flightdata.status) + end -- Check if mission is OVER (done or cancelled). if self:IsOver() then @@ -1100,6 +1107,32 @@ function AUFTRAG:Evaluate() return self end +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Asset Data +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Get asset data table. +-- @param #AUFTRAG self +-- @param #string AssetName Name of the asset. +-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist. +function AUFTRAG:GetAssetDataByName(AssetName) + return self.flightdata[tostring(AssetName)] +end + +--- Get asset data table. +-- @param #AUFTRAG self +-- @param #string AssetName Name of the asset. +-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist. +function AUFTRAG:NewMissionAsset(AssetName) + + local assetdata={} --#AUFTRAG.FlightData + + --assetdata.status==AUFTRAG.FlightStatus.SCHEDULED + + return self.flightdata[tostring(AssetName)] +end + + --- Get flight data table. -- @param #AUFTRAG self -- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group. @@ -1129,6 +1162,7 @@ function AUFTRAG:SetFlightStatus(flightgroup, status) end end + -- Debug info. self:I(self.lid..string.format("Setting flight %s status to %s. IsNotOver=%s CheckFlightsDone=%s", flightgroup.groupname, self:GetFlightStatus(flightgroup), tostring(self:IsNotOver()), tostring(self:CheckFlightsDone()))) -- Check if ALL flights are done with their mission. @@ -1325,6 +1359,24 @@ function AUFTRAG:onafterDone(From, Event, To) self:I(self.lid..string.format("New mission status=%s", self.status)) end + +--- On after "FlightDead" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The flightgroup that is dead now. +function AUFTRAG:onafterFlightDead(From, Event, To, FlightGroup) + + self:SetFlightStatus(FlightGroup, AUFTRAG.FlightStatus.DONE) + + local asset=self:GetAssetByName(FlightGroup.groupname) + if asset then + self:AssetDead(asset) + end + +end + --- On after "AssetDead" event. -- @param #AUFTRAG self -- @param #string From From state. @@ -1332,15 +1384,14 @@ end -- @param #string To To state. -- @param Ops.AirWing#AIRWING.SquadronAsset Asset The asset. function AUFTRAG:onafterAssetDead(From, Event, To, Asset) - - -- Delete asset from mission. - self:DelAsset(Asset) - + -- Remove flightgroup from mission. - self:DelFlightGroup(Asset.flightgroup) + --self:DelFlightGroup(Asset.flightgroup) + + local N=self:CountFlightGroups() -- All assets dead? - if #self.assets==0 then + if N==0 then if self:IsNotOver() then @@ -1350,14 +1401,19 @@ function AUFTRAG:onafterAssetDead(From, Event, To, Asset) else self:E(self.lid.."ERROR: All assets are dead not but mission was already over... Investigate!") + -- Now this can happen, because when a flightgroup dies (sometimes!), the mission is DONE end end + -- Remove asset from airwing. if self.airwing then self.airwing:RemoveAssetFromSquadron(Asset) end + -- Delete asset from mission. + self:DelAsset(Asset) + end --- On after "Success" event. @@ -1595,7 +1651,7 @@ function AUFTRAG:CountFlightGroups() return N end ---- Get coordinate of target. First unit/group of the set is used. +--- Get coordinate of target. -- @param #AUFTRAG self -- @return Core.Point#COORDINATE The target coordinate or nil. function AUFTRAG:GetTargetCoordinate() diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 4f185b1af..87b6e4903 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -2305,10 +2305,7 @@ function FLIGHTGROUP:onafterFlightDead(From, Event, To) for _,_mission in pairs(self.missionqueue) do local mission=_mission --Ops.Auftrag#AUFTRAG - local asset=mission:GetAssetByName(self.groupname) - if asset then - mission:AssetDead(asset) - end + mission:FlightDead(self) end diff --git a/Moose Development/Moose/Ops/Squadron.lua b/Moose Development/Moose/Ops/Squadron.lua index 2943474af..994945f0f 100644 --- a/Moose Development/Moose/Ops/Squadron.lua +++ b/Moose Development/Moose/Ops/Squadron.lua @@ -264,6 +264,7 @@ function SQUADRON:DelAsset(Asset) for i,_asset in pairs(self.assets) do local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset if Asset.uid==asset.uid then + self:T2(self.lid..string.format("Removing asset %s", asset.spawngroupname)) table.remove(self.assets, i) break end @@ -277,7 +278,6 @@ end --- On after Start event. Starts the FLIGHTGROUP FSM and event handlers. -- @param #SQUADRON self --- @param Wrapper.Group#GROUP Group Flight group. -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. @@ -293,7 +293,6 @@ end --- On after "Status" event. -- @param #SQUADRON self --- @param Wrapper.Group#GROUP Group Flight group. -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. @@ -327,6 +326,21 @@ function SQUADRON:_CheckAssetStatus() end +--- On after "Stop" event. +-- @param #SQUADRON self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function SQUADRON:onafterStop(From, Event, To) + + -- Remove all assets. + for i=#self.assets,1,-1 do + local asset=self.assets[i] + self:DelAsqsset(asset) + end + +end + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Misc Functions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -374,13 +388,14 @@ function SQUADRON:CanMission(Mission) --- -- Check if this asset is currently on a PATROL mission (STARTED or EXECUTING). - if self.airwing:IsAssetOnMission(asset, AUFTRAG.Type.PATROL) and Mission.type~=AUFTRAG.Type.PATROL then + if self.airwing:IsAssetOnMission(asset, AUFTRAG.Type.PATROL) and Mission.type==AUFTRAG.Type.INTERCEPT then -- Check if the payload of this asset is compatible with the mission. - if self:CheckMissionType(Mission.type, asset.payload.missiontypes) then + -- Note: we do not check the payload as an asset that is on a PATROL mission should be able to do an intercept as well! + --if self:CheckMissionType(Mission.type, asset.payload.missiontypes) then -- TODO: Check if asset actually has weapons left. Difficult! table.insert(assets, asset) - end + --end end diff --git a/Moose Development/Moose/Ops/WingCommander.lua b/Moose Development/Moose/Ops/WingCommander.lua index 01c10fc21..98d6057e9 100644 --- a/Moose Development/Moose/Ops/WingCommander.lua +++ b/Moose Development/Moose/Ops/WingCommander.lua @@ -243,7 +243,11 @@ function WINGCOMMANDER:onafterStatus(From, Event, To) -- Add mission to queue. if mission then + + --TODO: Better amount of necessary assets. Count units in asset and in contact. Might need nassetMin/Max. mission.nassets=1 + + -- Set mission contact. contact.mission=mission -- Add mission to queue.