mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-20 17:07:54 +00:00
Ops
This commit is contained in:
@@ -262,9 +262,6 @@ function AIRWING:NewPayload(Unit, Npayloads, MissionTypes, Performance)
|
|||||||
capability.Performance=Performance
|
capability.Performance=Performance
|
||||||
table.insert(payload.capabilities, capability)
|
table.insert(payload.capabilities, capability)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add payload
|
|
||||||
table.insert(self.payloads, payload)
|
|
||||||
|
|
||||||
-- Add ORBIT for all.
|
-- Add ORBIT for all.
|
||||||
if not self:CheckMissionType(AUFTRAG.Type.ORBIT, MissionTypes) then
|
if not self:CheckMissionType(AUFTRAG.Type.ORBIT, MissionTypes) then
|
||||||
@@ -277,6 +274,9 @@ function AIRWING:NewPayload(Unit, Npayloads, MissionTypes, Performance)
|
|||||||
-- Info
|
-- Info
|
||||||
self:I(self.lid..string.format("Adding new payload from unit %s for aircraft type %s: N=%d (unlimited=%s), performance=%d, missions: %s",
|
self:I(self.lid..string.format("Adding new payload from unit %s for aircraft type %s: N=%d (unlimited=%s), performance=%d, missions: %s",
|
||||||
payload.unitname, payload.aircrafttype, payload.navail, tostring(payload.unlimited), Performance, table.concat(MissionTypes, ", ")))
|
payload.unitname, payload.aircrafttype, payload.navail, tostring(payload.unlimited), Performance, table.concat(MissionTypes, ", ")))
|
||||||
|
|
||||||
|
-- Add payload
|
||||||
|
table.insert(self.payloads, payload)
|
||||||
|
|
||||||
return payload
|
return payload
|
||||||
end
|
end
|
||||||
@@ -321,6 +321,18 @@ end
|
|||||||
-- @return #AIRWING.Payload Payload table or *nil*.
|
-- @return #AIRWING.Payload Payload table or *nil*.
|
||||||
function AIRWING:FetchPayloadFromStock(UnitType, MissionType)
|
function AIRWING:FetchPayloadFromStock(UnitType, MissionType)
|
||||||
|
|
||||||
|
if not self.payloads or #self.payloads==0 then
|
||||||
|
self:I(self.lid.."WARNING: No payloads in stock!")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
for i,_payload in pairs(self.payloads) do
|
||||||
|
local payload=_payload --#AIRWING.Payload
|
||||||
|
self:I(self.lid..string.format("%d Payload type=%s navail=%d", i, payload.aircrafttype, payload.navail))
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
--- Sort payload wrt the following criteria:
|
--- Sort payload wrt the following criteria:
|
||||||
-- 1) Highest performance is the main selection criterion.
|
-- 1) Highest performance is the main selection criterion.
|
||||||
-- 2) If payloads have the same performance, unlimited payloads are preferred over limited ones.
|
-- 2) If payloads have the same performance, unlimited payloads are preferred over limited ones.
|
||||||
@@ -328,9 +340,17 @@ function AIRWING:FetchPayloadFromStock(UnitType, MissionType)
|
|||||||
local function sortpayloads(a,b)
|
local function sortpayloads(a,b)
|
||||||
local pA=a --#AIRWING.Payload
|
local pA=a --#AIRWING.Payload
|
||||||
local pB=b --#AIRWING.Payload
|
local pB=b --#AIRWING.Payload
|
||||||
local performanceA=self:GetPayloadPeformance(pA, MissionType)
|
if a and b then --TODO: Strangely, I had the case that a or b were nil even though the self.payloads table was looking okay. Very strange!
|
||||||
local performanceB=self:GetPayloadPeformance(pB, MissionType)
|
local performanceA=self:GetPayloadPeformance(a, MissionType)
|
||||||
return (performanceA>performanceB) or (performanceA==performanceB and pA.unlimited==true) or (performanceA==performanceB and pA.unlimited==true and pB.unlimited==true and pA.navail>pB.navail)
|
local performanceB=self:GetPayloadPeformance(b, MissionType)
|
||||||
|
return (performanceA>performanceB) or (performanceA==performanceB and a.unlimited==true) or (performanceA==performanceB and a.unlimited==true and b.unlimited==true and a.navail>b.navail)
|
||||||
|
elseif not a then
|
||||||
|
return false
|
||||||
|
elseif not b then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
table.sort(self.payloads, sortpayloads)
|
table.sort(self.payloads, sortpayloads)
|
||||||
|
|
||||||
@@ -696,7 +716,7 @@ function AIRWING:onafterStatus(From, Event, To)
|
|||||||
local squadron=_squadron --Ops.Squadron#SQUADRON
|
local squadron=_squadron --Ops.Squadron#SQUADRON
|
||||||
|
|
||||||
local callsign=squadron.callsignName and UTILS.GetCallsignName(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 modex=squadron.modex and squadron.modex or -1
|
||||||
local skill=squadron.skill and tostring(squadron.skill) or "N/A"
|
local skill=squadron.skill and tostring(squadron.skill) or "N/A"
|
||||||
|
|
||||||
-- Squadron text
|
-- Squadron text
|
||||||
@@ -905,9 +925,11 @@ function AIRWING:CheckRescuhelo()
|
|||||||
|
|
||||||
local N=self:CountMissionsInQueue({AUFTRAG.Type.RESCUEHELO})
|
local N=self:CountMissionsInQueue({AUFTRAG.Type.RESCUEHELO})
|
||||||
|
|
||||||
|
local carrier=UNIT:FindByName(self.airbase:GetName())
|
||||||
|
|
||||||
for i=1,self.nflightsRescueHelo-N do
|
for i=1,self.nflightsRescueHelo-N do
|
||||||
|
|
||||||
local mission=AUFTRAG:NewRESCUEHELO(self.airbase)
|
local mission=AUFTRAG:NewRESCUEHELO(carrier)
|
||||||
|
|
||||||
self:AddMission(mission)
|
self:AddMission(mission)
|
||||||
|
|
||||||
@@ -966,7 +988,7 @@ function AIRWING:_GetNextMission()
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sort results table wrt times they have already been engaged.
|
-- Sort results table wrt prio and start time.
|
||||||
local function _sort(a, b)
|
local function _sort(a, b)
|
||||||
local taskA=a --Ops.Auftrag#AUFTRAG
|
local taskA=a --Ops.Auftrag#AUFTRAG
|
||||||
local taskB=b --Ops.Auftrag#AUFTRAG
|
local taskB=b --Ops.Auftrag#AUFTRAG
|
||||||
@@ -996,7 +1018,6 @@ function AIRWING:_GetNextMission()
|
|||||||
-- Assign assets to mission.
|
-- Assign assets to mission.
|
||||||
local remove={}
|
local remove={}
|
||||||
local gotpayload={}
|
local gotpayload={}
|
||||||
local n=0
|
|
||||||
for i=1,#assets do
|
for i=1,#assets do
|
||||||
local asset=assets[i] --#AIRWING.SquadronAsset
|
local asset=assets[i] --#AIRWING.SquadronAsset
|
||||||
|
|
||||||
@@ -1004,7 +1025,6 @@ function AIRWING:_GetNextMission()
|
|||||||
if not asset.payload then
|
if not asset.payload then
|
||||||
local payload=self:FetchPayloadFromStock(asset.unittype, mission.type)
|
local payload=self:FetchPayloadFromStock(asset.unittype, mission.type)
|
||||||
if payload then
|
if payload then
|
||||||
n=n+1
|
|
||||||
asset.payload=payload
|
asset.payload=payload
|
||||||
table.insert(gotpayload, asset.uid)
|
table.insert(gotpayload, asset.uid)
|
||||||
else
|
else
|
||||||
@@ -1012,15 +1032,14 @@ function AIRWING:_GetNextMission()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self:T2(self.lid..string.format("Provided %d assets with payloads", n))
|
self:I(self.lid..string.format("Provided %d assets with payloads. Could not get payload for %d assets", #gotpayload, #remove))
|
||||||
|
|
||||||
-- Now remove assets for which we don't have a payload.
|
-- Now remove assets for which we don't have a payload.
|
||||||
for i=#assets,1,-1 do
|
for i=#assets,1,-1 do
|
||||||
local asset=assets[i] --#AIRWING.SquadronAsset
|
local asset=assets[i] --#AIRWING.SquadronAsset
|
||||||
for _,uid in pairs(remove) do
|
for _,uid in pairs(remove) do
|
||||||
if uid==asset.uid then
|
if uid==asset.uid then
|
||||||
table.remove(assets,i)
|
table.remove(assets, i)
|
||||||
break
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1147,7 +1166,7 @@ function AIRWING:_OptimizeAssetSelection(assets, Mission, includePayload)
|
|||||||
-- Calculate the mission score of all assets.
|
-- Calculate the mission score of all assets.
|
||||||
for _,_asset in pairs(assets) do
|
for _,_asset in pairs(assets) do
|
||||||
local asset=_asset --#AIRWING.SquadronAsset
|
local asset=_asset --#AIRWING.SquadronAsset
|
||||||
|
--self:I(string.format("FF asset %s has payload %s", asset.spawngroupname, asset.payload and "yes" or "no!"))
|
||||||
asset.score=self:CalculateAssetMissionScore(asset, Mission, includePayload)
|
asset.score=self:CalculateAssetMissionScore(asset, Mission, includePayload)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1155,7 +1174,10 @@ function AIRWING:_OptimizeAssetSelection(assets, Mission, includePayload)
|
|||||||
local function optimize(a, b)
|
local function optimize(a, b)
|
||||||
local assetA=a --#AIRWING.SquadronAsset
|
local assetA=a --#AIRWING.SquadronAsset
|
||||||
local assetB=b --#AIRWING.SquadronAsset
|
local assetB=b --#AIRWING.SquadronAsset
|
||||||
return (assetA.score>assetB.score) --or (dA==dB and taskA.prio<taskB.prio)
|
|
||||||
|
-- Higher score wins. If equal score ==> closer wins.
|
||||||
|
-- TODO: Need to include the distance in a smarter way!
|
||||||
|
return (assetA.score>assetB.score) or (assetA.score==assetB.score and assetA.dist<assetB.dist)
|
||||||
end
|
end
|
||||||
table.sort(assets, optimize)
|
table.sort(assets, optimize)
|
||||||
|
|
||||||
@@ -1163,7 +1185,7 @@ function AIRWING:_OptimizeAssetSelection(assets, Mission, includePayload)
|
|||||||
local text=string.format("Optimized assets for mission (payload=%s):", tostring(includePayload))
|
local text=string.format("Optimized assets for mission (payload=%s):", tostring(includePayload))
|
||||||
for i,Asset in pairs(assets) do
|
for i,Asset in pairs(assets) do
|
||||||
local asset=Asset --#AIRWING.SquadronAsset
|
local asset=Asset --#AIRWING.SquadronAsset
|
||||||
text=text..string.format("\n%s %s: score=%d, distance=%.1f", asset.squadname, asset.spawngroupname, asset.score, asset.dist)
|
text=text..string.format("\n%s %s: score=%d, distance=%.1f km", asset.squadname, asset.spawngroupname, asset.score, asset.dist/1000)
|
||||||
asset.dist=nil
|
asset.dist=nil
|
||||||
asset.score=nil
|
asset.score=nil
|
||||||
end
|
end
|
||||||
@@ -1882,11 +1904,17 @@ end
|
|||||||
-- @return #number Performance or -1.
|
-- @return #number Performance or -1.
|
||||||
function AIRWING:GetPayloadPeformance(Payload, MissionType)
|
function AIRWING:GetPayloadPeformance(Payload, MissionType)
|
||||||
|
|
||||||
for _,Capability in pairs(Payload.capabilities) do
|
if Payload then
|
||||||
local capability=Capability --Ops.Auftrag#AUFTRAG.Capability
|
|
||||||
if capability.MissionType==MissionType then
|
for _,Capability in pairs(Payload.capabilities) do
|
||||||
return capability.Performance
|
local capability=Capability --Ops.Auftrag#AUFTRAG.Capability
|
||||||
|
if capability.MissionType==MissionType then
|
||||||
|
return capability.Performance
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
self:E(self.lid.."ERROR: Payload is nil!")
|
||||||
end
|
end
|
||||||
|
|
||||||
return -1
|
return -1
|
||||||
|
|||||||
@@ -1097,6 +1097,15 @@ function AUFTRAG:SetMissionAltitude(Altitude)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set max engage range.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @param #number Range Max range in NM. Default 100 NM.
|
||||||
|
-- @return #AUFTRAG self
|
||||||
|
function AUFTRAG:SetEngageRange(Range)
|
||||||
|
self.engageRange=UTILS.NMToMeters(Range or 100)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Set Rules of Engagement (ROE) for this mission.
|
--- Set Rules of Engagement (ROE) for this mission.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @param #string roe Mission ROE.
|
-- @param #string roe Mission ROE.
|
||||||
|
|||||||
@@ -583,7 +583,8 @@ function SQUADRON:CanMission(Mission)
|
|||||||
|
|
||||||
-- Check mission type. WARNING: This assumes that all assets of the squad can do the same mission types!
|
-- Check mission type. WARNING: This assumes that all assets of the squad can do the same mission types!
|
||||||
if not self:CheckMissionType(Mission.type, self:GetMissionTypes()) then
|
if not self:CheckMissionType(Mission.type, self:GetMissionTypes()) then
|
||||||
self:I(self.lid..string.format("INFO: Squad cannot do mission type %s", Mission.type))
|
self:I(self.lid..string.format("INFO: Squad cannot do mission type %s", Mission.type))
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Check that tanker mission
|
-- Check that tanker mission
|
||||||
@@ -602,7 +603,7 @@ function SQUADRON:CanMission(Mission)
|
|||||||
local TargetDistance=Mission:GetTargetDistance(self.airwing:GetCoordinate())
|
local TargetDistance=Mission:GetTargetDistance(self.airwing:GetCoordinate())
|
||||||
|
|
||||||
-- Max engage range.
|
-- Max engage range.
|
||||||
local engagerange=Mission.engageMaxDistance and math.min(self.engageRange, Mission.engageMaxDistance) or self.engageRange
|
local engagerange=Mission.engageRange and math.max(self.engageRange, Mission.engageRange) or self.engageRange
|
||||||
|
|
||||||
-- Set range is valid. Mission engage distance can overrule the squad engage range.
|
-- Set range is valid. Mission engage distance can overrule the squad engage range.
|
||||||
if TargetDistance>engagerange then
|
if TargetDistance>engagerange then
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
-- This routine is called from the LDT environment to create the Moose.lua file stub for use in .miz files.
|
||||||
|
|
||||||
|
|
||||||
|
local MoosePath="D:/DCS/Scripts/moose/MOOSE"
|
||||||
|
local MooseDevelopmentPath = MoosePath.."/Moose Development/Moose"
|
||||||
|
local MooseSetupPath = MoosePath.."/Moose Setup"
|
||||||
|
local MooseTargetPath =MoosePath.."/Moose Setup"
|
||||||
|
|
||||||
|
local MooseCommitHash = "Static FF Development"
|
||||||
|
|
||||||
|
print( "Commit Hash ID : " .. MooseCommitHash )
|
||||||
|
print( "Moose development path : " .. MooseDevelopmentPath )
|
||||||
|
print( "Moose setup path : " .. MooseSetupPath )
|
||||||
|
print( "Moose target path : " .. MooseTargetPath )
|
||||||
|
|
||||||
|
local MooseModulesFilePath=MooseDevelopmentPath.."/Modules.lua"
|
||||||
|
local LoaderFilePath=MooseTargetPath.."/Moose.lua"
|
||||||
|
|
||||||
|
print( "Reading Moose source list : " .. MooseModulesFilePath )
|
||||||
|
|
||||||
|
local LoaderFile=io.open(LoaderFilePath, "w")
|
||||||
|
LoaderFile:write( "env.info( '*** MOOSE DEVELOPMENT version: " .. MooseCommitHash .. " ***' )\n" )
|
||||||
|
|
||||||
|
local MooseSourcesFile = io.open( MooseModulesFilePath, "r" )
|
||||||
|
local MooseSource = MooseSourcesFile:read("*l")
|
||||||
|
|
||||||
|
while( MooseSource ) do
|
||||||
|
|
||||||
|
if MooseSource ~= "" then
|
||||||
|
MooseSource = string.match( MooseSource, "Scripts/Moose/(.+)'" )
|
||||||
|
local MooseFilePath = MooseDevelopmentPath .. "/" .. MooseSource
|
||||||
|
print( "Load static: " .. MooseFilePath )
|
||||||
|
local MooseSourceFile = io.open( MooseFilePath, "r" )
|
||||||
|
local MooseSourceFileText = MooseSourceFile:read( "*a" )
|
||||||
|
MooseSourceFile:close()
|
||||||
|
|
||||||
|
LoaderFile:write( MooseSourceFileText )
|
||||||
|
end
|
||||||
|
|
||||||
|
MooseSource = MooseSourcesFile:read("*l")
|
||||||
|
end
|
||||||
|
|
||||||
|
LoaderFile:write( "BASE:TraceOnOff( false )\n" )
|
||||||
|
LoaderFile:write( "env.info( '*** MOOSE INCLUDE END *** ' )\n" )
|
||||||
|
|
||||||
|
MooseSourcesFile:close()
|
||||||
|
LoaderFile:close()
|
||||||
Reference in New Issue
Block a user