OPSTRANSPORT

- Improved assignment to multiple legions.
This commit is contained in:
Frank 2021-09-10 00:32:15 +02:00
parent 6f126e6cd4
commit 884c51a69a
4 changed files with 290 additions and 59 deletions

View File

@ -34,7 +34,7 @@
-- @field #string type Mission type. -- @field #string type Mission type.
-- @field #string status Mission status. -- @field #string status Mission status.
-- @field #table legions Assigned legions. -- @field #table legions Assigned legions.
-- @field #table statusLegion Mission status of all assigned LEGIONSs. -- @field #table statusLegion Mission status of all assigned LEGIONs.
-- @field #string statusCommander Mission status of the COMMANDER. -- @field #string statusCommander Mission status of the COMMANDER.
-- @field #string statusChief Mission status of the CHIF. -- @field #string statusChief Mission status of the CHIF.
-- @field #table groupdata Group specific data. -- @field #table groupdata Group specific data.
@ -538,19 +538,22 @@ function AUFTRAG:New(Type)
-- State is planned. -- State is planned.
self.status=AUFTRAG.Status.PLANNED self.status=AUFTRAG.Status.PLANNED
-- Defaults -- Defaults .
self:SetName() self:SetName()
self:SetPriority() self:SetPriority()
self:SetTime() self:SetTime()
self:SetRequiredAssets()
self:SetRequiredCarriers()
self.engageAsGroup=true self.engageAsGroup=true
self.dTevaluate=5
-- Init counters and stuff.
self.repeated=0 self.repeated=0
self.repeatedSuccess=0 self.repeatedSuccess=0
self.repeatedFailure=0 self.repeatedFailure=0
self.Nrepeat=0 self.Nrepeat=0
self.NrepeatFailure=0 self.NrepeatFailure=0
self.NrepeatSuccess=0 self.NrepeatSuccess=0
self.nassets=1
self.dTevaluate=5
self.Ncasualties=0 self.Ncasualties=0
self.Nkills=0 self.Nkills=0
self.Nelements=0 self.Nelements=0
@ -1854,10 +1857,38 @@ function AUFTRAG:SetTransportForAssets(DeployZone, DisembarkZone, Carriers)
end end
-- Set min/max number of carriers to be assigned.
self.opstransport.nCarriersMin=self.nCarriersMin
self.opstransport.nCarriersMax=self.nCarriersMax
return self return self
end end
--- Add a transport Legion. This requires an OPSTRANSPORT to be set via `AUFTRAG:SetTransportForAssets`. --- Set number of required carrier groups if an OPSTRANSPORT assignment is required.
-- @param #AUFTRAG self
-- @param #number NcarriersMin Number of carriers *at least* required. Default 1.
-- @param #number NcarriersMax Number of carriers *at most* used for transportation. Default is same as `NcarriersMin`.
-- @return #AUFTRAG self
function AUFTRAG:SetRequiredCarriers(NcarriersMin, NcarriersMax)
self.nCarriersMin=NcarriersMin or 1
self.nCarriersMax=NcarriersMax or self.nCarriersMin
-- Ensure that max is at least equal to min.
if self.nCarriersMax<self.nCarriersMin then
self.nCarriersMax=self.nCarriersMin
end
-- Pass this on to the ops transport.
if self.opstransport then
self.opstransport:SetRequiredCarriers(NcarriersMin, NcarriersMax)
end
return self
end
--- Add a transport Legion.
-- @param #AUFTRAG self -- @param #AUFTRAG self
-- @param Ops.Legion#LEGION Legion The legion. -- @param Ops.Legion#LEGION Legion The legion.
function AUFTRAG:AddTransportLegion(Legion) function AUFTRAG:AddTransportLegion(Legion)
@ -3633,8 +3664,11 @@ end
-- @return #AUFTRAG self -- @return #AUFTRAG self
function AUFTRAG:AddAsset(Asset) function AUFTRAG:AddAsset(Asset)
-- Debug info
self:T(self.lid..string.format("Adding asset \"%s\" to mission", tostring(Asset.spawngroupname)))
-- Add to table.
self.assets=self.assets or {} self.assets=self.assets or {}
table.insert(self.assets, Asset) table.insert(self.assets, Asset)
return self return self
@ -3650,7 +3684,7 @@ function AUFTRAG:DelAsset(Asset)
local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem
if asset.uid==Asset.uid then if asset.uid==Asset.uid then
self:T(self.lid..string.format("Removing asset \"%s\" from mission", tostring(asset.spawngroupname))) self:T(self.lid..string.format("Removing asset \"%s\" from mission", tostring(Asset.spawngroupname)))
table.remove(self.assets, i) table.remove(self.assets, i)
return self return self
end end

View File

@ -324,6 +324,22 @@ function BRIGADE:onafterStatus(From, Event, To)
self:I(self.lid..text) self:I(self.lid..text)
end end
--------------------
-- Transport Info --
--------------------
if self.verbose>=2 then
local text=string.format("Transports Total=%d:", #self.transportqueue)
for i,_transport in pairs(self.transportqueue) do
local transport=_transport --Ops.OpsTransport#OPSTRANSPORT
local prio=string.format("%d/%s", transport.prio, tostring(transport.importance)) ; if transport.urgent then prio=prio.." (!)" end
local carriers=string.format("Ncargo=%d/%d, Ncarriers=%d", transport.Ncargo, transport.Ndelivered, transport.Ncarrier)
text=text..string.format("\n[%d] UID=%d: Status=%s, Prio=%s, Cargo: %s", i, transport.uid, transport:GetState(), prio, carriers)
end
self:I(self.lid..text)
end
------------------- -------------------
-- Platoon Info -- -- Platoon Info --
------------------- -------------------

View File

@ -256,7 +256,6 @@ function LEGION:AddMission(Mission)
-- Add ops transport to transport Legions. -- Add ops transport to transport Legions.
if Mission.opstransport then if Mission.opstransport then
-- Add a new TZC: from pickup here to the deploy zone. -- Add a new TZC: from pickup here to the deploy zone.
local tzc=Mission.opstransport:AddTransportZoneCombo(self.spawnzone, Mission.opstransport.tzcDefault.DeployZone) local tzc=Mission.opstransport:AddTransportZoneCombo(self.spawnzone, Mission.opstransport.tzcDefault.DeployZone)
@ -315,9 +314,15 @@ function LEGION:AddOpsTransport(OpsTransport)
-- Is not queued at a legion. -- Is not queued at a legion.
OpsTransport:Queued() OpsTransport:Queued()
-- Set legion status.
OpsTransport:SetLegionStatus(self, AUFTRAG.Status.QUEUED)
-- Add mission to queue. -- Add mission to queue.
table.insert(self.transportqueue, OpsTransport) table.insert(self.transportqueue, OpsTransport)
-- Add this legion to the transport.
OpsTransport:AddLegion(self)
-- Info text. -- Info text.
local text=string.format("Added Transport %s. Starting at %s-%s", local text=string.format("Added Transport %s. Starting at %s-%s",
@ -427,7 +432,7 @@ function LEGION:_GetNextMission()
end end
table.sort(self.missionqueue, _sort) table.sort(self.missionqueue, _sort)
-- Look for first mission that is SCHEDULED. -- Search min importance.
local vip=math.huge local vip=math.huge
for _,_mission in pairs(self.missionqueue) do for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG local mission=_mission --Ops.Auftrag#AUFTRAG
@ -436,9 +441,6 @@ function LEGION:_GetNextMission()
end end
end end
-- Current time.
local time=timer.getAbsTime()
-- Look for first task that is not accomplished. -- Look for first task that is not accomplished.
for _,_mission in pairs(self.missionqueue) do for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG local mission=_mission --Ops.Auftrag#AUFTRAG
@ -453,7 +455,6 @@ function LEGION:_GetNextMission()
return mission return mission
end end
end -- mission due? end -- mission due?
end -- mission loop end -- mission loop
@ -474,7 +475,7 @@ function LEGION:_GetNextTransport()
end end
--- Function to get carrier assets from all cohorts. --- Function to get carrier assets from all cohorts.
local function getAssets(n, weightGroup) local function getAssets(n, N , weightGroup)
-- Selected assets. -- Selected assets.
local assets={} local assets={}
@ -496,7 +497,12 @@ function LEGION:_GetNextTransport()
-- Add to assets. -- Add to assets.
table.insert(assets, asset) table.insert(assets, asset)
if #assets==n then --TODO: Optimize Asset Selection!
--TODO: Check if deploy and (any) pickup zone is an airbase, so airplanes can be used.
-- Max number of assets reached.
if #assets==N then
return assets return assets
end end
end end
@ -506,16 +512,22 @@ function LEGION:_GetNextTransport()
end end
end end
return nil -- At least min number reached?
if #assets>=n then
return assets
else
return nil
end
end end
--TODO: Sort transports wrt to prio and importance. See mission sorting!
-- Look for first task that is not accomplished. -- Look for first task that is not accomplished.
for _,_transport in pairs(self.transportqueue) do for _,_transport in pairs(self.transportqueue) do
local transport=_transport --Ops.OpsTransport#OPSTRANSPORT local transport=_transport --Ops.OpsTransport#OPSTRANSPORT
-- Check if transport is still queued and ready. -- Check if transport is still queued and ready.
if transport:IsQueued() and transport:IsReadyToGo() then if transport:IsQueued(self) and transport:IsReadyToGo() then
-- Get all undelivered cargo ops groups. -- Get all undelivered cargo ops groups.
local cargoOpsGroups=transport:GetCargoOpsGroups(false) local cargoOpsGroups=transport:GetCargoOpsGroups(false)
@ -534,10 +546,14 @@ function LEGION:_GetNextTransport()
end end
-- Get assets. If not enough assets can be found, nil is returned. -- Get assets. If not enough assets can be found, nil is returned.
local assets=getAssets(1, weightGroup) local assets=getAssets(transport.nCarriersMin, transport.nCarriersMax, weightGroup)
if assets then if assets then
transport.assets=assets for _,_asset in pairs(assets) do
local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem
asset.isReserved=true
transport:AddAsset(asset)
end
return transport return transport
end end
@ -547,7 +563,7 @@ function LEGION:_GetNextTransport()
end end
-- No transport found.
return nil return nil
end end
@ -735,6 +751,7 @@ function LEGION:onafterMissionRequest(From, Event, To, Mission)
asset.requested=true asset.requested=true
asset.isReserved=false asset.isReserved=false
-- Set missin task so that the group is spawned with the right one.
if Mission.missionTask then if Mission.missionTask then
asset.missionTask=Mission.missionTask asset.missionTask=Mission.missionTask
end end
@ -760,38 +777,46 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param Ops.OpsTransport#OPSTRANSPORT Opstransport The requested mission. -- @param Ops.OpsTransport#OPSTRANSPORT Opstransport The requested mission.
function LEGION:onafterTransportRequest(From, Event, To, OpsTransport) function LEGION:onafterTransportRequest(From, Event, To, OpsTransport)
-- Set mission status from QUEUED to REQUESTED.
OpsTransport:Requested()
-- Set legion status. Ensures that it is not considered in the next selection. -- List of assets that will be requested.
--Mission:SetLegionStatus(self, AUFTRAG.Status.REQUESTED) local AssetList={}
--TODO: Find spawned assets on ALERT 5 mission OPSTRANSPORT.
-- Add request to legion warehouse. --local text=string.format("Requesting assets for mission %s:", Mission.name)
if #OpsTransport.assets>0 then for i,_asset in pairs(OpsTransport.assets) do
local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem
--local text=string.format("Requesting assets for mission %s:", Mission.name)
for i,_asset in pairs(OpsTransport.assets) do -- Check that this asset belongs to this Legion warehouse.
local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem if asset.wid==self.uid then
-- Set asset to requested! Important so that new requests do not use this asset! -- Set asset to requested! Important so that new requests do not use this asset!
asset.requested=true asset.requested=true
asset.isReserved=false
-- Set transport mission task.
asset.missionTask=ENUMS.MissionTask.TRANSPORT
-- Check max required transports. -- Add asset to list.
if i==1 then table.insert(AssetList, asset)
break
end
end end
end
if #AssetList>0 then
-- Set mission status from QUEUED to REQUESTED.
OpsTransport:Requested()
-- Set legion status. Ensures that it is not considered in the next selection.
OpsTransport:SetLegionStatus(self, OPSTRANSPORT.Status.REQUESTED)
-- TODO: Get/set functions for assignment string. -- TODO: Get/set functions for assignment string.
local assignment=string.format("Transport-%d", OpsTransport.uid) local assignment=string.format("Transport-%d", OpsTransport.uid)
-- Add request to legion warehouse. -- Add request to legion warehouse.
self:AddRequest(self, WAREHOUSE.Descriptor.ASSETLIST, OpsTransport.assets, #OpsTransport.assets, nil, nil, OpsTransport.prio, assignment) self:AddRequest(self, WAREHOUSE.Descriptor.ASSETLIST, AssetList, #AssetList, nil, nil, OpsTransport.prio, assignment)
-- The queueid has been increased in the onafterAddRequest function. So we can simply use it here. -- The queueid has been increased in the onafterAddRequest function. So we can simply use it here.
OpsTransport.requestID=OpsTransport.requestID or {}
OpsTransport.requestID[self.alias]=self.queueid OpsTransport.requestID[self.alias]=self.queueid
end end
@ -1619,11 +1644,14 @@ function LEGION:GetAircraftTypes(onlyactive, cohorts)
end end
--- Check if assets for a given mission type are available. --- Check if assets for a given mission type are available.
--
-- OBSOLETE and renamed to _CanMission (to see if it is still used somewhere)
--
-- @param #LEGION self -- @param #LEGION self
-- @param Ops.Auftrag#AUFTRAG Mission The mission. -- @param Ops.Auftrag#AUFTRAG Mission The mission.
-- @return #boolean If true, enough assets are available. -- @return #boolean If true, enough assets are available.
-- @return #table Assets that can do the required mission. -- @return #table Assets that can do the required mission.
function LEGION:CanMission(Mission) function LEGION:_CanMission(Mission)
-- Assume we CAN and NO assets are available. -- Assume we CAN and NO assets are available.
local Can=true local Can=true

View File

@ -2,10 +2,10 @@
-- --
-- ## Main Features: -- ## Main Features:
-- --
-- * Transport troops from A to B. -- * Transport troops from A to B
-- * Supports ground, naval and airborne (airplanes and helicopters) units as carriers -- * Supports ground, naval and airborne (airplanes and helicopters) units as carriers
-- * Use combined forces (ground, naval, air) to transport the troops. -- * Use combined forces (ground, naval, air) to transport the troops
-- * Additional FSM events to hook into and customize your mission design. -- * Additional FSM events to hook into and customize your mission design
-- --
-- === -- ===
-- --
@ -51,6 +51,9 @@
-- --
-- @field Ops.Auftrag#AUFTRAG mission The mission attached to this transport. -- @field Ops.Auftrag#AUFTRAG mission The mission attached to this transport.
-- @field #table assets Warehouse assets assigned for this transport. -- @field #table assets Warehouse assets assigned for this transport.
-- @field #table legions Assigned legions.
-- @field #table statusLegion Transport status of all assigned LEGIONs.
-- @field #table requestID The ID of the queued warehouse request. Necessary to cancel the request if the transport was cancelled before the request is processed.
-- --
-- @extends Core.Fsm#FSM -- @extends Core.Fsm#FSM
@ -58,8 +61,6 @@
-- --
-- === -- ===
-- --
-- ![Banner Image](..\Presentations\OPS\Transport\_Main.png)
--
-- # The OPSTRANSPORT Concept -- # The OPSTRANSPORT Concept
-- --
-- This class simulates troop transport using carriers such as APCs, ships, helicopters or airplanes. The carriers and transported groups need to be OPSGROUPS (see ARMYGROUP, NAVYGROUP and FLIGHTGROUP classes). -- This class simulates troop transport using carriers such as APCs, ships, helicopters or airplanes. The carriers and transported groups need to be OPSGROUPS (see ARMYGROUP, NAVYGROUP and FLIGHTGROUP classes).
@ -119,6 +120,9 @@ OPSTRANSPORT = {
tzcCounter = 0, tzcCounter = 0,
conditionStart = {}, conditionStart = {},
assets = {}, assets = {},
legions = {},
statusLegion = {},
requestID = {},
} }
--- Cargo transport status. --- Cargo transport status.
@ -209,16 +213,17 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
self.uid=_OPSTRANSPORTID self.uid=_OPSTRANSPORTID
-- Defaults. -- Defaults.
self.cargos={} self:SetPriority()
self.carriers={} self:SetTime()
self:SetRequiredCarriers()
-- Init arrays and counters.
self.cargos={}
self.carriers={}
self.Ncargo=0 self.Ncargo=0
self.Ncarrier=0 self.Ncarrier=0
self.Ndelivered=0 self.Ndelivered=0
self:SetPriority()
self:SetTime()
-- Set default TZC. -- Set default TZC.
self.tzcDefault=self:AddTransportZoneCombo(PickupZone, DeployZone, CargoGroups) self.tzcDefault=self:AddTransportZoneCombo(PickupZone, DeployZone, CargoGroups)
@ -772,6 +777,33 @@ function OPSTRANSPORT:GetRequiredCargos(TransportZoneCombo)
return TransportZoneCombo.RequiredCargos return TransportZoneCombo.RequiredCargos
end end
--- Set number of required carrier groups for an OPSTRANSPORT assignment. Only used if transport is assigned at **LEGION** or higher level.
-- @param #OPSTRANSPORT self
-- @param #number NcarriersMin Number of carriers *at least* required. Default 1.
-- @param #number NcarriersMax Number of carriers *at most* used for transportation. Default is same as `NcarriersMin`.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:SetRequiredCarriers(NcarriersMin, NcarriersMax)
self.nCarriersMin=NcarriersMin or 1
self.nCarriersMax=NcarriersMax or self.nCarriersMin
-- Ensure that max is at least equal to min.
if self.nCarriersMax<self.nCarriersMin then
self.nCarriersMax=self.nCarriersMin
end
return self
end
--- Get the number of required carrier groups for an OPSTRANSPORT assignment. Only used if transport is assigned at **LEGION** or higher level.
-- @param #OPSTRANSPORT self
-- @return #number Number of carriers *at least* required.
-- @return #number Number of carriers *at most* used for transportation.
function OPSTRANSPORT:GetRequiredCarriers()
return self.nCarriersMin, self.nCarriersMax
end
--- Add a carrier assigned for this transport. --- Add a carrier assigned for this transport.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
@ -1174,6 +1206,78 @@ function OPSTRANSPORT:GetNcarrier()
return self.Ncarrier return self.Ncarrier
end end
--- Add asset to transport.
-- @param #OPSTRANSPORT self
-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset to be added.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:AddAsset(Asset)
-- Debug info
self:T(self.lid..string.format("Adding asset \"%s\" to transport", tostring(Asset.spawngroupname)))
-- Add asset to table.
self.assets=self.assets or {}
table.insert(self.assets, Asset)
return self
end
--- Delete asset from mission.
-- @param #OPSTRANSPORT self
-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset to be removed.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:DelAsset(Asset)
for i,_asset in pairs(self.assets or {}) do
local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem
if asset.uid==Asset.uid then
self:T(self.lid..string.format("Removing asset \"%s\" from transport", tostring(Asset.spawngroupname)))
table.remove(self.assets, i)
return self
end
end
return self
end
--- Add LEGION to the transport.
-- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion The legion.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:AddLegion(Legion)
-- Debug info.
self:I(self.lid..string.format("Adding legion %s", Legion.alias))
-- Add legion to table.
table.insert(self.legions, Legion)
return self
end
--- Remove LEGION from transport.
-- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion The legion.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:RemoveLegion(Legion)
-- Loop over legions
for i=#self.legions,1,-1 do
local legion=self.legions[i] --Ops.Legion#LEGION
if legion.alias==Legion.alias then
-- Debug info.
self:I(self.lid..string.format("Removing legion %s", Legion.alias))
table.remove(self.legions, i)
return self
end
end
self:E(self.lid..string.format("ERROR: Legion %s not found and could not be removed!", Legion.alias))
return self
end
--- Check if an OPS group is assigned as carrier for this transport. --- Check if an OPS group is assigned as carrier for this transport.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @param Ops.OpsGroup#OPSGROUP CarrierGroup Potential carrier OPSGROUP. -- @param Ops.OpsGroup#OPSGROUP CarrierGroup Potential carrier OPSGROUP.
@ -1215,6 +1319,7 @@ function OPSTRANSPORT:IsReadyToGo()
end end
if not gotzones then if not gotzones then
text=text.."No, pickup/deploy zone combo not yet defined!" text=text.."No, pickup/deploy zone combo not yet defined!"
return false
end end
-- Start time did not pass yet. -- Start time did not pass yet.
@ -1246,39 +1351,83 @@ function OPSTRANSPORT:IsReadyToGo()
return true return true
end end
--- Set LEGION transport status.
-- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion The legion.
-- @param #string Status New status.
-- @return #OPSTRANSPORT self
function OPSTRANSPORT:SetLegionStatus(Legion, Status)
-- Old status
local status=self:GetLegionStatus(Legion)
-- Debug info.
self:I(self.lid..string.format("Setting LEGION %s to status %s-->%s", Legion.alias, tostring(status), tostring(Status)))
-- New status.
self.statusLegion[Legion.alias]=Status
return self
end
--- Get LEGION transport status.
-- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion The legion.
-- @return #string status Current status.
function OPSTRANSPORT:GetLegionStatus(Legion)
-- Current status.
local status=self.statusLegion[Legion.alias] or "unknown"
return status
end
--- Check if state is PLANNED. --- Check if state is PLANNED.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @return #boolean If true, status is PLANNED. -- @return #boolean If true, status is PLANNED.
function OPSTRANSPORT:IsPlanned() function OPSTRANSPORT:IsPlanned()
return self:is(OPSTRANSPORT.Status.PLANNED) local is=self:is(OPSTRANSPORT.Status.PLANNED)
return is
end end
--- Check if state is QUEUED. --- Check if state is QUEUED.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion (Optional) Check if transport is queued at this legion.
-- @return #boolean If true, status is QUEUED. -- @return #boolean If true, status is QUEUED.
function OPSTRANSPORT:IsQueued() function OPSTRANSPORT:IsQueued(Legion)
return self:is(OPSTRANSPORT.Status.QUEUED) local is=self:is(OPSTRANSPORT.Status.QUEUED)
if Legion then
is=self:GetLegionStatus(Legion)==OPSTRANSPORT.Status.QUEUED
end
return is
end end
--- Check if state is REQUESTED. --- Check if state is REQUESTED.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @param Ops.Legion#LEGION Legion (Optional) Check if transport is queued at this legion.
-- @return #boolean If true, status is REQUESTED. -- @return #boolean If true, status is REQUESTED.
function OPSTRANSPORT:IsRequested() function OPSTRANSPORT:IsRequested(Legion)
return self:is(OPSTRANSPORT.Status.REQUESTED) local is=self:is(OPSTRANSPORT.Status.REQUESTED)
if Legion then
is=self:GetLegionStatus(Legion)==OPSTRANSPORT.Status.REQUESTED
end
return is
end end
--- Check if state is SCHEDULED. --- Check if state is SCHEDULED.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @return #boolean If true, status is SCHEDULED. -- @return #boolean If true, status is SCHEDULED.
function OPSTRANSPORT:IsScheduled() function OPSTRANSPORT:IsScheduled()
return self:is(OPSTRANSPORT.Status.SCHEDULED) local is=self:is(OPSTRANSPORT.Status.SCHEDULED)
return is
end end
--- Check if state is EXECUTING. --- Check if state is EXECUTING.
-- @param #OPSTRANSPORT self -- @param #OPSTRANSPORT self
-- @return #boolean If true, status is EXECUTING. -- @return #boolean If true, status is EXECUTING.
function OPSTRANSPORT:IsExecuting() function OPSTRANSPORT:IsExecuting()
return self:is(OPSTRANSPORT.Status.EXECUTING) local is=self:is(OPSTRANSPORT.Status.EXECUTING)
return is
end end
--- Check if all cargo was delivered (or is dead). --- Check if all cargo was delivered (or is dead).
@ -1314,7 +1463,7 @@ function OPSTRANSPORT:onafterStatus(From, Event, To)
if self.verbose>=1 then if self.verbose>=1 then
-- Info text. -- Info text.
local text=string.format("%s: Ncargo=%d/%d, Ncarrier=%d/%d", fsmstate:upper(), self.Ncargo, self.Ndelivered, #self.carriers, self.Ncarrier) local text=string.format("%s: Ncargo=%d/%d, Ncarrier=%d/%d, Nlegions=%d", fsmstate:upper(), self.Ncargo, self.Ndelivered, #self.carriers, self.Ncarrier, #self.legions)
-- Info about cargo and carrier. -- Info about cargo and carrier.
if self.verbose>=2 then if self.verbose>=2 then
@ -1701,13 +1850,17 @@ function OPSTRANSPORT:_GetTransportZoneCombo(Carrier)
-- Check that pickup and deploy zones were defined. -- Check that pickup and deploy zones were defined.
if tz.PickupZone and tz.DeployZone and tz.EmbarkZone then if tz.PickupZone and tz.DeployZone and tz.EmbarkZone then
--TODO: Check if Carrier is an aircraft and if so, check that pickup AND deploy zones are airbases (not ships, not farps).
-- Count undelivered cargos in embark(!) zone that fit into the carrier. -- Count undelivered cargos in embark(!) zone that fit into the carrier.
local ncargo=self:_CountCargosInZone(tz.EmbarkZone, false, Carrier, tz) local ncargo=self:_CountCargosInZone(tz.EmbarkZone, false, Carrier, tz)
--env.info(string.format("FF GetPickupZone i=%d, ncargo=%d", i, ncargo)) --env.info(string.format("FF GetPickupZone i=%d, ncargo=%d", i, ncargo))
if ncargo>0 then -- At least one group in the zone.
if ncargo>=1 then
-- Distance to the carrier in meters.
local dist=tz.PickupZone:Get2DDistance(vec2) local dist=tz.PickupZone:Get2DDistance(vec2)
if distmin==nil or dist<distmin then if distmin==nil or dist<distmin then