From 08e4b7baeb2abecb191fa3716987187f3b0e438f Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 13 Apr 2020 01:44:39 +0200 Subject: [PATCH] Ops --- Moose Development/Moose/Ops/AirWing.lua | 105 +++++++++++--------- Moose Development/Moose/Ops/Auftrag.lua | 34 +++---- Moose Development/Moose/Ops/FlightGroup.lua | 67 +++++++------ Moose Development/Moose/Ops/Squadron.lua | 7 +- Moose Development/Moose/Utilities/Utils.lua | 31 ++++++ 5 files changed, 147 insertions(+), 97 deletions(-) diff --git a/Moose Development/Moose/Ops/AirWing.lua b/Moose Development/Moose/Ops/AirWing.lua index f51a54d27..3a6370808 100644 --- a/Moose Development/Moose/Ops/AirWing.lua +++ b/Moose Development/Moose/Ops/AirWing.lua @@ -29,6 +29,7 @@ -- @field #number nflightsAWACS Number of AWACS flights constantly in the air. -- @field #number nflightsTANKERboom Number of TANKER flights with BOOM constantly in the air. -- @field #number nflightsTANKERprobe Number of TANKER flights with PROBE constantly in the air. +-- @field #number nflightsRescueHelo Number of Rescue helo flights constantly in the air. -- @field #table pointsCAP Table of CAP points. -- @field #table pointsTANKER Table of Tanker points. -- @field #table pointsAWACS Table of AWACS points. @@ -141,9 +142,8 @@ function AIRWING:New(warehousename, airwingname) self.nflightsAWACS=0 self.nflightsTANKERboom=0 self.nflightsTANKERprobe=0 - self.nflightsRecoveryTanker=0 - self.nflightsRescuehelo=0 + self.nflightsRescueHelo=0 ------------------------ --- Pseudo Functions --- @@ -529,6 +529,15 @@ function AIRWING:SetNumberAWACS(n) return self end +--- Set number of Rescue helo flights constantly in the air. +-- @param #AIRWING self +-- @param #number n Number of flights. Default 1. +-- @return #AIRWING self +function AIRWING:SetNumberRescuehelo(n) + self.nflightsRescueHelo=n or 1 + return self +end + --- Create a new generic patrol point. -- @param #AIRWING self @@ -655,13 +664,17 @@ function AIRWING:onafterStatus(From, Event, To) -- Check AWACS missions. self:CheckAWACS() + -- Check Rescue Helo missions. + self:CheckRescuhelo() + -- Count missions not over yet. local nmissions=self:CountMissionsInQueue() - -- Count ALL payloads in stock + -- Count ALL payloads in stock. If any payload is unlimited, this gives 999. local Npayloads=self:CountPayloadsInStock(AUFTRAG.Type) - -- TODO: count payloads, assets total + -- General info: + -- TODO: assets total local text=string.format("Status %s: missions=%d, payloads=%d (%d), squads=%d", fsmstate, nmissions, #self.payloads, Npayloads, #self.squadrons) self:I(self.lid..text) @@ -682,53 +695,55 @@ function AIRWING:onafterStatus(From, Event, To) for i,_squadron in pairs(self.squadrons) do local squadron=_squadron --Ops.Squadron#SQUADRON - local callsign=squadron.callsignName and squadron.callsignName or "N/A" + local callsign=squadron.callsignName and UTILS.GetCallsignName(squadron.callsignName) or "N/A" local modex=squadron.modex and squadron.modex or "N/A" local skill=squadron.skill and tostring(squadron.skill) or "N/A" -- Squadron text - text=text..string.format("\n* %s %s: Airframe=%s, Callsign=%s, Modex=%d, Skill=%s", squadron.name, squadron:GetState(), squadron.aircrafttype, callsign, modex, skill) + text=text..string.format("\n* %s %s: %s*%d, Callsign=%s, Modex=%d, Skill=%s", squadron.name, squadron:GetState(), squadron.aircrafttype, #squadron.assets, callsign, modex, skill) -- Loop over all assets. - for j,_asset in pairs(squadron.assets) do - local asset=_asset --#AIRWING.SquadronAsset - local assignment=asset.assignment or "none" - local name=asset.templatename - local spawned=tostring(asset.spawned) - local groupname=asset.spawngroupname - local typename=asset.unittype - - local mission=self:GetAssetCurrentMission(asset) - local missiontext="" - if mission then - local distance=asset.flightgroup and UTILS.MetersToNM(mission:GetTargetDistance(asset.flightgroup.group:GetCoordinate())) or 0 - missiontext=string.format(" [%s (%s): status=%s, distance=%.1f NM]", mission.type, mission.name, mission.status, distance) - end - - text=text..string.format("\n -[%d] %s*%d \"%s\": spawned=%s, mission=%s%s", j, typename, asset.nunits, asset.spawngroupname, spawned, tostring(self:IsAssetOnMission(asset)), missiontext) - - --TODO - --local payload=asset.payload and table.concat(asset.payload.missiontypes, ", ") or "None" - --text=text.." payload="..payload - - text=text..", flight: " - if asset.flightgroup and asset.flightgroup:IsAlive() then - local status=asset.flightgroup:GetState() - local fuelmin=asset.flightgroup:GetFuelMin() - local fuellow=asset.flightgroup:IsFuelLow() - local fuelcri=asset.flightgroup:IsFuelCritical() + if self.verbose>1 then + for j,_asset in pairs(squadron.assets) do + local asset=_asset --#AIRWING.SquadronAsset + local assignment=asset.assignment or "none" + local name=asset.templatename + local spawned=tostring(asset.spawned) + local groupname=asset.spawngroupname + local typename=asset.unittype - text=text..string.format("%s fuel=%d", status, fuelmin) - if fuelcri then - text=text.." (critical!)" - elseif fuellow then - text=text.." (low)" + local mission=self:GetAssetCurrentMission(asset) + local missiontext="" + if mission then + local distance=asset.flightgroup and UTILS.MetersToNM(mission:GetTargetDistance(asset.flightgroup.group:GetCoordinate())) or 0 + missiontext=string.format(" [%s (%s): status=%s, distance=%.1f NM]", mission.type, mission.name, mission.status, distance) end + + text=text..string.format("\n -[%d] %s*%d \"%s\": spawned=%s, mission=%s%s", j, typename, asset.nunits, asset.spawngroupname, spawned, tostring(self:IsAssetOnMission(asset)), missiontext) - local lifept, lifept0=asset.flightgroup:GetLifePoints() - text=text..string.format(" life=%d/%d", lifept, lifept0) - else - text=text.."N/A" + --TODO + --local payload=asset.payload and table.concat(asset.payload.missiontypes, ", ") or "None" + --text=text.." payload="..payload + + text=text..", flight: " + if asset.flightgroup and asset.flightgroup:IsAlive() then + local status=asset.flightgroup:GetState() + local fuelmin=asset.flightgroup:GetFuelMin() + local fuellow=asset.flightgroup:IsFuelLow() + local fuelcri=asset.flightgroup:IsFuelCritical() + + text=text..string.format("%s fuel=%d", status, fuelmin) + if fuelcri then + text=text.." (critical!)" + elseif fuellow then + text=text.." (low)" + end + + local lifept, lifept0=asset.flightgroup:GetLifePoints() + text=text..string.format(" life=%d/%d", lifept, lifept0) + else + text=text.."N/A" + end end end @@ -883,14 +898,14 @@ function AIRWING:CheckAWACS() return self end ---- Check how many AWACS missions are assigned and add number of missing missions. +--- Check how many Rescue helos are currently in the air. -- @param #AIRWING self -- @return #AIRWING self function AIRWING:CheckRescuhelo() local N=self:CountMissionsInQueue({AUFTRAG.Type.RESCUEHELO}) - for i=1,self.nflightsRescuehelo-N do + for i=1,self.nflightsRescueHelo-N do local mission=AUFTRAG:NewRESCUEHELO(self.airbase) @@ -899,7 +914,6 @@ function AIRWING:CheckRescuhelo() end return self - end --- Check how many AWACS missions are assigned and add number of missing missions. @@ -933,7 +947,6 @@ function AIRWING:GetTankerForFlight(flightgroup) -- Return tanker asset. return tankeropt[1].tanker - end return nil diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 9ae2b362f..2882af1c7 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -303,12 +303,14 @@ AUFTRAG.TargetType={ --- AUFTRAG class version. -- @field #string version -AUFTRAG.version="0.0.9" +AUFTRAG.version="0.1.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- TODO: Option to assign mission to a specific squadron. +-- TODO: Option to assign a specific payload for the mission (requires an AIRWING). -- TODO: Add mission start conditions. -- TODO: Add recovery tanker mission for boat ops. -- TODO: Add rescue helo mission for boat ops. @@ -412,15 +414,10 @@ function AUFTRAG:NewRESCUEHELO(Carrier) mission.engageTarget=mission:_TargetFromObject(Carrier) - --[[ - mission.engageTarget=mission:_TargetFromObject(Target) - mission.engageWeaponType=ENUMS.WeaponFlag.Auto - mission.missionTask=ENUMS.MissionTask.NOTHING - mission.missionFraction=0.4 - mission.optionROE=ENUMS.ROE.OpenFire - mission.optionROT=ENUMS.ROT.EvadeFire - ]] + mission.missionFraction=0.5 + mission.optionROE=ENUMS.ROE.WeaponHold + mission.optionROT=ENUMS.ROT.NoReaction mission.DCStask=mission:GetDCSMissionTask() @@ -1038,10 +1035,10 @@ end --- Set mission name. -- @param #AUFTRAG self --- @param #string Name Name of the mission. +-- @param #string Name Name of the mission. Default is "Auftrag Nr. X", where X is a running number, which is automatically increased. -- @return #AUFTRAG self function AUFTRAG:SetName(Name) - self.name=Name or string.format("Auftragsnummer %d", self.auftragsnummer) + self.name=Name or string.format("Auftrag Nr. %d", self.auftragsnummer) return self end @@ -2003,7 +2000,7 @@ end --- Get coordinate of target. -- @param #AUFTRAG self --- @return Core.Point#COORDINATE The target coordinate or nil. +-- @return Core.Point#COORDINATE The target coordinate or *nil*. function AUFTRAG:GetTargetCoordinate() if self.engageTarget then @@ -2025,7 +2022,7 @@ end --- Get coordinate of target. -- @param #AUFTRAG self --- @return #string +-- @return #string Name of the target or "N/A". function AUFTRAG:GetTargetName() if self.engageTarget then @@ -2044,14 +2041,14 @@ function AUFTRAG:GetTargetName() return self.transportPickup:ToStringLLDMS() end - return nil + return "N/A" end --- Get distance to target. -- @param #AUFTRAG self -- @param Core.Point#COORDINATE FromCoord The coordinate from which the distance is measured. --- @return #number Distance in meters. +-- @return #number Distance in meters or 0. function AUFTRAG:GetTargetDistance(FromCoord) local TargetCoord=self:GetTargetCoordinate() if TargetCoord and FromCoord then @@ -2321,10 +2318,11 @@ function AUFTRAG:GetDCSMissionTask() local param={} param.unitname=self:GetTargetName() - param.offsetX=20 - param.offsetY=20 - param.offsetZ=20 + param.offsetX=200 + param.offsetZ=240 + --param.offsetY=20 param.altitude=70 + param.dtFollow=1.0 DCStask.params=param diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index beb064c9d..01d6e9c9e 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -366,7 +366,7 @@ FLIGHTGROUP.ROT={ --- FLIGHTGROUP class version. -- @field #string version -FLIGHTGROUP.version="0.3.8" +FLIGHTGROUP.version="0.3.9" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -1538,31 +1538,36 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) -- Distance travelled --- - local time=timer.getAbsTime() - - local position=self:GetCoordinate() - local ds=self.position:Get3DDistance(position) - local dt=time-self.traveltime - local v=ds/dt - - self.traveldist=self.traveldist+ds - self.traveltime=time - self.position=position + if self.verbose>1 then + + local time=timer.getAbsTime() - local fuelmass=math.huge - for _,_element in pairs(self.elements) do - local element=_element --#FLIGHTGROUP.Element + local position=self:GetCoordinate() + local ds=self.position:Get3DDistance(position) + local dt=time-self.traveltime + local v=ds/dt - local fuel=element.unit:GetFuel() or 0 - local fmass=element.fuelmass*fuel - - if fmass\Liveries\\` --- * For AI units: `DCS World OpenBeta\Bazar\Liveries\\` +-- * Full modules: `DCS World OpenBeta\CoreMods\aircraft\\Liveries\\` +-- * AI units: `DCS World OpenBeta\Bazar\Liveries\\` -- -- The folder name `` is the string you want. -- @@ -252,6 +252,7 @@ function SQUADRON:AddMissonCapability(MissionTypes, Performance) table.insert(self.missiontypes, capability) end + -- Debug info. self:I(self.missiontypes) return self diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index 480a399f7..2980550b9 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -1098,5 +1098,36 @@ function UTILS.GetModulationName(Modulation) end +--- Get the callsign name from its enumerator value +-- @param #number Callsign The enumerator callsign. +-- @return #string The callsign name. +function UTILS.GetCallsignName(Callsign) + + for name, value in pairs(CALLSIGN.Aircraft) do + if value==Callsign then + return name + end + end + + for name, value in pairs(CALLSIGN.AWACS) do + if value==Callsign then + return name + end + end + + for name, value in pairs(CALLSIGN.JTAC) do + if value==Callsign then + return name + end + end + + for name, value in pairs(CALLSIGN.Tanker) do + if value==Callsign then + return name + end + end + + return "Unknown Calsing" +end -- Just a test to see commits in new environment for Wingthor \ No newline at end of file