mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-11 11:48:38 +00:00
Ops
This commit is contained in:
@@ -5176,7 +5176,7 @@ function WAREHOUSE:onafterAssetSpawned(From, Event, To, group, asset, request)
|
|||||||
local assetitem=_asset --#WAREHOUSE.Assetitem
|
local assetitem=_asset --#WAREHOUSE.Assetitem
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T2(self.lid..string.format("Asset %s spawned %s as %s", assetitem.templatename, tostring(assetitem.spawned), tostring(assetitem.spawngroupname)))
|
self:I(self.lid..string.format("Asset %s spawned=%s as %s", assetitem.templatename, tostring(assetitem.spawned), tostring(assetitem.spawngroupname)))
|
||||||
|
|
||||||
if assetitem.spawned then
|
if assetitem.spawned then
|
||||||
n=n+1
|
n=n+1
|
||||||
@@ -5680,7 +5680,9 @@ function WAREHOUSE:_SpawnAssetAircraft(alias, asset, request, parking, uncontrol
|
|||||||
local AirbaseCategory = self:GetAirbaseCategory()
|
local AirbaseCategory = self:GetAirbaseCategory()
|
||||||
|
|
||||||
-- Check enough parking spots.
|
-- Check enough parking spots.
|
||||||
if AirbaseCategory==Airbase.Category.HELIPAD or AirbaseCategory==Airbase.Category.SHIP then
|
if AirbaseCategory==Airbase.Category.HELIPAD then
|
||||||
|
|
||||||
|
elseif AirbaseCategory==Airbase.Category.SHIP then
|
||||||
|
|
||||||
--TODO Figure out what's necessary in this case.
|
--TODO Figure out what's necessary in this case.
|
||||||
|
|
||||||
@@ -7547,17 +7549,29 @@ function WAREHOUSE:_FindParkingForAssets(airbase, assets)
|
|||||||
for i,unit in pairs(units) do
|
for i,unit in pairs(units) do
|
||||||
local coord=COORDINATE:New(unit.x, unit.alt, unit.y)
|
local coord=COORDINATE:New(unit.x, unit.alt, unit.y)
|
||||||
coords[unit.name]=coord
|
coords[unit.name]=coord
|
||||||
--[[
|
|
||||||
local airbase=coord:GetClosestAirbase()
|
|
||||||
local _,TermID, dist, spot=coord:GetClosestParkingSpot(airbase)
|
|
||||||
if dist<=10 then
|
|
||||||
env.info(string.format("Found client %s on parking spot %d at airbase %s", unit.name, TermID, airbase:GetName()))
|
|
||||||
end
|
|
||||||
]]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return coords
|
return coords
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if airbase:GetAirbaseCategory()==Airbase.Category.SHIP then
|
||||||
|
-- Scan a radius of 100 meters around the spot.
|
||||||
|
local _,_,_,units=airbase:GetCoordinate():ScanObjects(200, true, false, false)
|
||||||
|
local N=0
|
||||||
|
for _,_unit in pairs(units) do
|
||||||
|
local unit=_unit --Wrapper.Unit#UNIT
|
||||||
|
if not unit:InAir() then
|
||||||
|
N=N+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
env.info(string.format("FF number of units on deck=%d", N))
|
||||||
|
if #assets>=6 and N==0 then
|
||||||
|
-- More than 6 is difficult. We need an empty deck.
|
||||||
|
elseif N+#assets>6 then
|
||||||
|
-- wait until max 6 ac are on deck.
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Get parking spot data table. This contains all free and "non-free" spots.
|
-- Get parking spot data table. This contains all free and "non-free" spots.
|
||||||
local parkingdata=airbase:GetParkingSpotsTable()
|
local parkingdata=airbase:GetParkingSpotsTable()
|
||||||
|
|||||||
@@ -720,7 +720,7 @@ function AIRWING:onafterStatus(From, Event, To)
|
|||||||
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
|
||||||
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)
|
text=text..string.format("\n* %s %s: %s*%d (avail %d), Callsign=%s, Modex=%d, Skill=%s", squadron.name, squadron:GetState(), squadron.aircrafttype, #squadron.assets, squadron:CountAssetsInStock(), callsign, modex, skill)
|
||||||
|
|
||||||
-- Loop over all assets.
|
-- Loop over all assets.
|
||||||
if self.verbose>0 then
|
if self.verbose>0 then
|
||||||
@@ -773,7 +773,10 @@ function AIRWING:onafterStatus(From, Event, To)
|
|||||||
--------------
|
--------------
|
||||||
-- Mission ---
|
-- Mission ---
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
-- Check if any missions should be cancelled.
|
||||||
|
self:_CheckMissions()
|
||||||
|
|
||||||
-- Get next mission.
|
-- Get next mission.
|
||||||
local mission=self:_GetNextMission()
|
local mission=self:_GetNextMission()
|
||||||
|
|
||||||
@@ -975,6 +978,24 @@ function AIRWING:GetTankerForFlight(flightgroup)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Get next mission.
|
||||||
|
-- @param #AIRWING self
|
||||||
|
function AIRWING:_CheckMissions()
|
||||||
|
|
||||||
|
-- Loop over missions in queue.
|
||||||
|
for _,_mission in pairs(self.missionqueue) do
|
||||||
|
local mission=_mission --Ops.Auftrag#AUFTRAG
|
||||||
|
|
||||||
|
if mission:IsNotOver() then
|
||||||
|
|
||||||
|
if mission:IsReadyToCancel() then
|
||||||
|
mission:Cancel()
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
--- Get next mission.
|
--- Get next mission.
|
||||||
-- @param #AIRWING self
|
-- @param #AIRWING self
|
||||||
-- @return Ops.Auftrag#AUFTRAG Next mission or *nil*.
|
-- @return Ops.Auftrag#AUFTRAG Next mission or *nil*.
|
||||||
|
|||||||
@@ -37,7 +37,9 @@
|
|||||||
-- @field #number Ntargets Number of mission targets.
|
-- @field #number Ntargets Number of mission targets.
|
||||||
-- @field #number dTevaluate Time interval in seconds before the mission result is evaluated after mission is over.
|
-- @field #number dTevaluate Time interval in seconds before the mission result is evaluated after mission is over.
|
||||||
-- @field #number Tover Mission abs. time stamp, when mission was over.
|
-- @field #number Tover Mission abs. time stamp, when mission was over.
|
||||||
-- @field #table startconditions Conditions that have to be true, before the mission is started.
|
-- @field #table conditionStart Condition(s) that have to be true, before the mission will be started.
|
||||||
|
-- @field #table conditionSuccess If all stop conditions are true, the mission is cancelled.
|
||||||
|
-- @field #table conditionFailure If all stop conditions are true, the mission is cancelled.
|
||||||
--
|
--
|
||||||
-- @field #number orbitSpeed Orbit speed in m/s.
|
-- @field #number orbitSpeed Orbit speed in m/s.
|
||||||
-- @field #number orbitAltitude Orbit altitude in meters.
|
-- @field #number orbitAltitude Orbit altitude in meters.
|
||||||
@@ -164,7 +166,9 @@ AUFTRAG = {
|
|||||||
missionFraction = 0.5,
|
missionFraction = 0.5,
|
||||||
enrouteTasks = {},
|
enrouteTasks = {},
|
||||||
marker = nil,
|
marker = nil,
|
||||||
startconditions = {},
|
conditionStart = {},
|
||||||
|
conditionSuccess = {},
|
||||||
|
conditionFailure = {},
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Global mission counter.
|
--- Global mission counter.
|
||||||
@@ -299,10 +303,10 @@ AUFTRAG.TargetType={
|
|||||||
-- @field #string DAMAGED Target was damaged.
|
-- @field #string DAMAGED Target was damaged.
|
||||||
-- @field #string DESTROYED Target was destroyed.
|
-- @field #string DESTROYED Target was destroyed.
|
||||||
|
|
||||||
--- Mission start condition.
|
--- Generic mission condition.
|
||||||
-- @type AUFTRAG.ConditionStart
|
-- @type AUFTRAG.Condition
|
||||||
-- @field #function funcReady Callback function to check whether the mission can be started. Should return a #boolean.
|
-- @field #function func Callback function to check for a condition. Should return a #boolean.
|
||||||
-- @field #table argReady Arguments passed to the callback function.
|
-- @field #table arg Optional arguments passed to the condition callback function.
|
||||||
|
|
||||||
--- Flight specific data. Each flight subscribed to this mission has different data for this.
|
--- Flight specific data. Each flight subscribed to this mission has different data for this.
|
||||||
-- @type AUFTRAG.FlightData
|
-- @type AUFTRAG.FlightData
|
||||||
@@ -316,7 +320,7 @@ AUFTRAG.TargetType={
|
|||||||
|
|
||||||
--- AUFTRAG class version.
|
--- AUFTRAG class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
AUFTRAG.version="0.1.7"
|
AUFTRAG.version="0.2.0"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
@@ -1235,17 +1239,57 @@ end
|
|||||||
-- @param #function ConditionFunction Function that needs to be true before the mission can be started. Must return a #boolean.
|
-- @param #function ConditionFunction Function that needs to be true before the mission can be started. Must return a #boolean.
|
||||||
-- @param ... Condition function arguments if any.
|
-- @param ... Condition function arguments if any.
|
||||||
-- @return #AUFTRAG self
|
-- @return #AUFTRAG self
|
||||||
function AUFTRAG:AddStartCondition(ConditionFunction, ...)
|
function AUFTRAG:AddConditionStart(ConditionFunction, ...)
|
||||||
|
|
||||||
local condition={} --#AUFTRAG.ConditionStart
|
local condition={} --#AUFTRAG.Condition
|
||||||
|
|
||||||
condition.funcReady=ConditionFunction
|
condition.func=ConditionFunction
|
||||||
condition.argReady={}
|
condition.arg={}
|
||||||
if arg then
|
if arg then
|
||||||
condition.argReady=arg
|
condition.arg=arg
|
||||||
end
|
end
|
||||||
|
|
||||||
table.insert(self.startconditions, condition)
|
table.insert(self.conditionStart, condition)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Add success condition.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @param #function ConditionFunction If this function returns `true`, the mission is cancelled.
|
||||||
|
-- @param ... Condition function arguments if any.
|
||||||
|
-- @return #AUFTRAG self
|
||||||
|
function AUFTRAG:AddConditionSuccess(ConditionFunction, ...)
|
||||||
|
|
||||||
|
local condition={} --#AUFTRAG.Condition
|
||||||
|
|
||||||
|
condition.func=ConditionFunction
|
||||||
|
condition.arg={}
|
||||||
|
if arg then
|
||||||
|
condition.arg=arg
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(self.conditionSuccess, condition)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Add failure condition.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @param #function ConditionFunction If this function returns `true`, the mission is cancelled.
|
||||||
|
-- @param ... Condition function arguments if any.
|
||||||
|
-- @return #AUFTRAG self
|
||||||
|
function AUFTRAG:AddConditionFailure(ConditionFunction, ...)
|
||||||
|
|
||||||
|
local condition={} --#AUFTRAG.Condition
|
||||||
|
|
||||||
|
condition.func=ConditionFunction
|
||||||
|
condition.arg={}
|
||||||
|
if arg then
|
||||||
|
condition.arg=arg
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(self.conditionFailure, condition)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -1328,6 +1372,13 @@ function AUFTRAG:IsScheduled()
|
|||||||
return self.status==AUFTRAG.Status.SCHEDULED
|
return self.status==AUFTRAG.Status.SCHEDULED
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Check if mission is STARTED, i.e. flight is on its way to the mission execution waypoint.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @return #boolean If true, mission is started.
|
||||||
|
function AUFTRAG:IsStarted()
|
||||||
|
return self.status==AUFTRAG.Status.STARTED
|
||||||
|
end
|
||||||
|
|
||||||
--- Check if mission is executing.
|
--- Check if mission is executing.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @return #boolean If true, mission is currently executing.
|
-- @return #boolean If true, mission is currently executing.
|
||||||
@@ -1374,7 +1425,7 @@ end
|
|||||||
--- Check if mission is ready to be started.
|
--- Check if mission is ready to be started.
|
||||||
-- * Mission start time passed.
|
-- * Mission start time passed.
|
||||||
-- * Mission stop time did not pass already.
|
-- * Mission stop time did not pass already.
|
||||||
-- * Any start conditions are true.
|
-- * All start conditions are true.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @return #boolean If true, mission can be started.
|
-- @return #boolean If true, mission can be started.
|
||||||
function AUFTRAG:IsReadyToGo()
|
function AUFTRAG:IsReadyToGo()
|
||||||
@@ -1391,23 +1442,100 @@ function AUFTRAG:IsReadyToGo()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- All start conditions must be true.
|
-- All start conditions true?
|
||||||
for _,_condition in pairs(self.startconditions or {}) do
|
local startme=self:EvalConditionsAll(self.conditionStart)
|
||||||
local condition=_condition --#AUFTRAG.ConditionStart
|
|
||||||
|
if not startme then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- We're good to go!
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if mission is ready to be started.
|
||||||
|
-- * Mission stop already passed.
|
||||||
|
-- * Any stop condition is true.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @return #boolean If true, mission should be cancelled.
|
||||||
|
function AUFTRAG:IsReadyToCancel()
|
||||||
|
|
||||||
|
local Tnow=timer.getAbsTime()
|
||||||
|
|
||||||
|
-- Stop time already passed.
|
||||||
|
if self.Tstop and Tnow>self.Tstop then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local failure=self:EvalConditionsAny(self.conditionFailure)
|
||||||
|
|
||||||
|
if failure then
|
||||||
|
self.failurecondition=true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local success=self:EvalConditionsAny(self.conditionSuccess)
|
||||||
|
|
||||||
|
if success then
|
||||||
|
self.successcondition=true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- No criterion matched.
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if all given condition are true.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @param #table Conditions Table of conditions.
|
||||||
|
-- @return #boolean If true, all conditions were true. Returns false if at least one condition returned false.
|
||||||
|
function AUFTRAG:EvalConditionsAll(Conditions)
|
||||||
|
|
||||||
|
-- Any stop condition must be true.
|
||||||
|
for _,_condition in pairs(Conditions or {}) do
|
||||||
|
local condition=_condition --#AUFTRAG.Condition
|
||||||
|
|
||||||
-- Call function.
|
-- Call function.
|
||||||
local ready=condition.funcReady(unpack(condition.argReady))
|
local istrue=condition.func(unpack(condition.arg))
|
||||||
|
|
||||||
if not ready then
|
-- Any false will return false.
|
||||||
|
if not istrue then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- We're good to go!
|
-- All conditions were true.
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Check if any of the given conditions is true.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @param #table Conditions Table of conditions.
|
||||||
|
-- @return #boolean If true, at least one condition is true.
|
||||||
|
function AUFTRAG:EvalConditionsAny(Conditions)
|
||||||
|
|
||||||
|
-- Any stop condition must be true.
|
||||||
|
for _,_condition in pairs(Conditions or {}) do
|
||||||
|
local condition=_condition --#AUFTRAG.Condition
|
||||||
|
|
||||||
|
-- Call function.
|
||||||
|
local istrue=condition.func(unpack(condition.arg))
|
||||||
|
|
||||||
|
-- Any true will return true.
|
||||||
|
if istrue then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- No condition was true.
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Mission Status
|
-- Mission Status
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -1500,6 +1628,15 @@ function AUFTRAG:Evaluate()
|
|||||||
|
|
||||||
-- Assume success and check if any failed condition applies.
|
-- Assume success and check if any failed condition applies.
|
||||||
local failed=false
|
local failed=false
|
||||||
|
|
||||||
|
-- Any success condition true?
|
||||||
|
local successCondition=self:EvalConditionsAny(self.conditionSuccess)
|
||||||
|
|
||||||
|
-- Any failure condition true?
|
||||||
|
local failureCondition=self:EvalConditionsAny(self.conditionFailure)
|
||||||
|
|
||||||
|
-- Target damage in %.
|
||||||
|
local targetdamage=self:GetTargetDamage()
|
||||||
|
|
||||||
-- Current number of mission targets.
|
-- Current number of mission targets.
|
||||||
local Ntargets=self:CountMissionTargets()
|
local Ntargets=self:CountMissionTargets()
|
||||||
@@ -1511,7 +1648,21 @@ function AUFTRAG:Evaluate()
|
|||||||
|
|
||||||
--TODO: all assets dead? Is this a FAILED criterion even if all targets have been destroyed? What if there are no initial targets (e.g. when ORBIT, PATROL, RECON missions).
|
--TODO: all assets dead? Is this a FAILED criterion even if all targets have been destroyed? What if there are no initial targets (e.g. when ORBIT, PATROL, RECON missions).
|
||||||
|
|
||||||
self:I(self.lid..string.format("Evaluating mission: Initial Targets=%d, current targets=%d ==> success=%s", self.Ntargets, Ntargets, tostring(not failed)))
|
--self:I(self.lid..string.format("Evaluating mission: Initial Targets=%d, current targets=%d ==> success=%s", self.Ntargets, Ntargets, tostring(not failed)))
|
||||||
|
|
||||||
|
if failureCondition then
|
||||||
|
failed=true
|
||||||
|
elseif successCondition then
|
||||||
|
failed=false
|
||||||
|
end
|
||||||
|
|
||||||
|
local text=string.format("Evaluating mission:\n")
|
||||||
|
text=text..string.format("Targets = %d/%d\n", self.Ntargets, Ntargets)
|
||||||
|
text=text..string.format("Damage = %.1f %%\n", targetdamage)
|
||||||
|
text=text..string.format("Success Cond = %s\n", tostring(successCondition))
|
||||||
|
text=text..string.format("Failure Cond = %s", tostring(failureCondition))
|
||||||
|
self:I(self.lid..text)
|
||||||
|
|
||||||
|
|
||||||
if failed then
|
if failed then
|
||||||
self:Failed()
|
self:Failed()
|
||||||
@@ -1652,6 +1803,10 @@ function AUFTRAG:CheckFlightsDone()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- It could be that all flights were destroyed on the way to the mission execution waypoint.
|
||||||
|
if self:IsStarted() and self:CountFlightGroups()==0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
-- Check status of all flight groups.
|
-- Check status of all flight groups.
|
||||||
for groupname,data in pairs(self.flightdata) do
|
for groupname,data in pairs(self.flightdata) do
|
||||||
@@ -2157,24 +2312,45 @@ end
|
|||||||
|
|
||||||
--- Get target damage.
|
--- Get target damage.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @return #number Percent.
|
-- @return #number Damage in percent.
|
||||||
function AUFTRAG:GetTargetDamage()
|
function AUFTRAG:GetTargetDamage()
|
||||||
local target=self:GetTargetData()
|
local target=self:GetTargetData()
|
||||||
local life=self:GetTargetLife()/self:GetTargetData().Lifepoints
|
local life=self:GetTargetLife()/self:GetTargetInitialLife()
|
||||||
local damage=1-life
|
local damage=1-life
|
||||||
return damage*100
|
return damage*100
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Get target life points.
|
||||||
|
-- @param #AUFTRAG self
|
||||||
|
-- @return #number Life points of target.
|
||||||
|
function AUFTRAG:GetTargetLife()
|
||||||
|
return self:_GetTargetLife(nil, false)
|
||||||
|
end
|
||||||
|
|
||||||
--- Get target life points.
|
--- Get target life points.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @param #AUFTRAG.TargetData Target (Optional) The target object.
|
-- @param #AUFTRAG.TargetData Target (Optional) The target object.
|
||||||
|
-- @param #boolean Healthy Get the life points of the healthy target.
|
||||||
-- @return #number Life points of target.
|
-- @return #number Life points of target.
|
||||||
function AUFTRAG:GetTargetLife(Target)
|
function AUFTRAG:_GetTargetLife(Target, Healthy)
|
||||||
|
|
||||||
local N=0
|
local N=0
|
||||||
|
|
||||||
Target=Target or self:GetTargetData()
|
Target=Target or self:GetTargetData()
|
||||||
|
|
||||||
|
local function _GetLife(unit)
|
||||||
|
local unit=unit --Wrapper.Unit#UNIT
|
||||||
|
if Healthy then
|
||||||
|
local life=unit:GetLife()
|
||||||
|
local life0=unit:GetLife0()
|
||||||
|
|
||||||
|
return math.max(life, life0)
|
||||||
|
else
|
||||||
|
return unit:GetLife()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if Target then
|
if Target then
|
||||||
|
|
||||||
if Target.Type==AUFTRAG.TargetType.GROUP then
|
if Target.Type==AUFTRAG.TargetType.GROUP then
|
||||||
@@ -2188,7 +2364,7 @@ function AUFTRAG:GetTargetLife(Target)
|
|||||||
|
|
||||||
-- We check that unit is "alive".
|
-- We check that unit is "alive".
|
||||||
if unit and unit:IsAlive() then
|
if unit and unit:IsAlive() then
|
||||||
N=N+unit:GetLife()
|
N=N+_GetLife(unit)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2197,15 +2373,18 @@ function AUFTRAG:GetTargetLife(Target)
|
|||||||
local target=Target.Target --Wrapper.Unit#UNIT
|
local target=Target.Target --Wrapper.Unit#UNIT
|
||||||
|
|
||||||
if target and target:IsAlive() then
|
if target and target:IsAlive() then
|
||||||
N=N+target:GetLife()
|
N=N+_GetLife(target)
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif Target.Type==AUFTRAG.TargetType.STATIC then
|
elseif Target.Type==AUFTRAG.TargetType.STATIC then
|
||||||
|
|
||||||
local target=Target.Target --Wrapper.Static#STATIC
|
local target=Target.Target --Wrapper.Static#STATIC
|
||||||
|
|
||||||
|
-- Statics are alive or not.
|
||||||
if target and target:IsAlive() then
|
if target and target:IsAlive() then
|
||||||
N=N+1 --target:GetLife()
|
N=N+1 --_GetLife(target)
|
||||||
|
else
|
||||||
|
N=N+0
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif Target.Type==AUFTRAG.TargetType.AIRBASE then
|
elseif Target.Type==AUFTRAG.TargetType.AIRBASE then
|
||||||
@@ -2230,7 +2409,7 @@ function AUFTRAG:GetTargetLife(Target)
|
|||||||
|
|
||||||
-- We check that unit is "alive".
|
-- We check that unit is "alive".
|
||||||
if unit and unit:IsAlive() then
|
if unit and unit:IsAlive() then
|
||||||
N=N+unit:GetLife()
|
N=N+_GetLife(unit)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2243,13 +2422,13 @@ function AUFTRAG:GetTargetLife(Target)
|
|||||||
|
|
||||||
-- We check that unit is "alive".
|
-- We check that unit is "alive".
|
||||||
if unit and unit:IsAlive() then
|
if unit and unit:IsAlive() then
|
||||||
N=N+unit:GetLife()
|
N=N+_GetLife(unit)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
self:E("ERROR unknown target type")
|
self:E(self.lid.."ERROR unknown target type")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2788,7 +2967,7 @@ function AUFTRAG:_TargetFromObject(Object)
|
|||||||
local Ninitial=self:CountMissionTargets(target)
|
local Ninitial=self:CountMissionTargets(target)
|
||||||
|
|
||||||
-- Initial total life point.
|
-- Initial total life point.
|
||||||
local Lifepoints=self:GetTargetLife(target)
|
local Lifepoints=self:_GetTargetLife(target, true)
|
||||||
|
|
||||||
-- Set engage Target.
|
-- Set engage Target.
|
||||||
self.engageTarget=target
|
self.engageTarget=target
|
||||||
@@ -2798,8 +2977,8 @@ function AUFTRAG:_TargetFromObject(Object)
|
|||||||
-- TODO: get rid of this.
|
-- TODO: get rid of this.
|
||||||
self.Ntargets=Ninitial
|
self.Ntargets=Ninitial
|
||||||
|
|
||||||
env.info("FF check")
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Mission Target Type=%s, Ntargets=%d", target.Type, self.Ntargets))
|
self:I(self.lid..string.format("Mission Target %s Type=%s, Ntargets=%d, Lifepoints=%d", target.Name, target.Type, Ninitial, Lifepoints))
|
||||||
|
|
||||||
return target
|
return target
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2416,8 +2416,9 @@ end
|
|||||||
function FLIGHTGROUP:onafterFlightArrived(From, Event, To)
|
function FLIGHTGROUP:onafterFlightArrived(From, Event, To)
|
||||||
self:T(self.lid..string.format("Flight arrived"))
|
self:T(self.lid..string.format("Flight arrived"))
|
||||||
|
|
||||||
-- Remove flight from landing queue.
|
-- Flight Control
|
||||||
if self.flightcontrol then
|
if self.flightcontrol then
|
||||||
|
-- Remove flight from landing queue.
|
||||||
self.flightcontrol:_RemoveFlightFromQueue(self.flightcontrol.Qtaxiinb, self, "TAXI_INB")
|
self.flightcontrol:_RemoveFlightFromQueue(self.flightcontrol.Qtaxiinb, self, "TAXI_INB")
|
||||||
-- Add flight to arrived queue.
|
-- Add flight to arrived queue.
|
||||||
self.flightcontrol:_AddFlightToArrivedQueue(self)
|
self.flightcontrol:_AddFlightToArrivedQueue(self)
|
||||||
@@ -2829,7 +2830,7 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp
|
|||||||
MESSAGE:New(text, 10, "DEBUG"):ToAllIf(self.Debug)
|
MESSAGE:New(text, 10, "DEBUG"):ToAllIf(self.Debug)
|
||||||
self:T(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
local althold=self.ishelo and 1000 or 6000
|
local althold=self.ishelo and 1000+math.random(10)*100 or math.random(4,10)*1000
|
||||||
|
|
||||||
-- Holding points.
|
-- Holding points.
|
||||||
local c0=self.group:GetCoordinate()
|
local c0=self.group:GetCoordinate()
|
||||||
@@ -2874,7 +2875,7 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp
|
|||||||
self.flaghold:Set(0)
|
self.flaghold:Set(0)
|
||||||
|
|
||||||
-- Task fuction when reached holding point.
|
-- Task fuction when reached holding point.
|
||||||
local TaskArrived=self.group:TaskFunction("FLIGHTGROUP._ReachedHolding", self)
|
local TaskArrived=self.group:TaskFunction("FLIGHTGROUP.", self)
|
||||||
|
|
||||||
-- Orbit until flaghold=1 (true) but max 5 min if no FC is giving the landing clearance.
|
-- Orbit until flaghold=1 (true) but max 5 min if no FC is giving the landing clearance.
|
||||||
local TaskOrbit=self.group:TaskOrbit(p0, nil, UTILS.KnotsToMps(SpeedHold), p1)
|
local TaskOrbit=self.group:TaskOrbit(p0, nil, UTILS.KnotsToMps(SpeedHold), p1)
|
||||||
|
|||||||
@@ -614,6 +614,24 @@ function SQUADRON:CanMission(Mission)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Get assets for a mission.
|
||||||
|
-- @param #SQUADRON self
|
||||||
|
-- @return #number Assets not spawned.
|
||||||
|
function SQUADRON:CountAssetsInStock()
|
||||||
|
|
||||||
|
local N=0
|
||||||
|
for _,_asset in pairs(self.assets) do
|
||||||
|
local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset
|
||||||
|
if asset.spawned then
|
||||||
|
|
||||||
|
else
|
||||||
|
N=N+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return N
|
||||||
|
end
|
||||||
|
|
||||||
--- Get assets for a mission.
|
--- Get assets for a mission.
|
||||||
-- @param #SQUADRON self
|
-- @param #SQUADRON self
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
|||||||
Reference in New Issue
Block a user