mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-21 11:53:30 +00:00
OPS
- Changed mission, legion in MissionAssign functions (LEGION, COMMANDER, CHIEF) - OPSTRANSPORT: improved TZC selection - ARMYGROUP needs to
This commit is contained in:
@@ -134,17 +134,234 @@ function ARMYGROUP:New(group)
|
|||||||
------------------------
|
------------------------
|
||||||
--- Pseudo Functions ---
|
--- Pseudo Functions ---
|
||||||
------------------------
|
------------------------
|
||||||
|
--- Triggers the FSM event "Cruise".
|
||||||
--- Triggers the FSM event "Stop". Stops the ARMYGROUP and all its event handlers.
|
-- @function [parent=#ARMYGROUP] Cruise
|
||||||
-- @param #ARMYGROUP self
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
|
-- @param #number Formation Formation.
|
||||||
|
|
||||||
--- Triggers the FSM event "Stop" after a delay. Stops the ARMYGROUP and all its event handlers.
|
--- Triggers the FSM event "Cruise" after a delay.
|
||||||
-- @function [parent=#ARMYGROUP] __Stop
|
-- @function [parent=#ARMYGROUP] __Cruise
|
||||||
-- @param #ARMYGROUP self
|
-- @param #ARMYGROUP self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
-- TODO: Add pseudo functions.
|
-- @param #number Formation Formation.
|
||||||
|
|
||||||
|
--- On after "Cruise" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterCruise
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
|
-- @param #number Formation Formation.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "FullStop".
|
||||||
|
-- @function [parent=#ARMYGROUP] FullStop
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "FullStop" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __FullStop
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "FullStop" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterFullStop
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "RTZ".
|
||||||
|
-- @function [parent=#ARMYGROUP] RTZ
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "RTZ" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __RTZ
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "RTZ" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRTZ
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Returned".
|
||||||
|
-- @function [parent=#ARMYGROUP] Returned
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Returned" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Returned
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Returned" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterReturned
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Detour".
|
||||||
|
-- @function [parent=#ARMYGROUP] Detour
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Detour" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Detour
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Detour" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterDetour
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "DetourReached".
|
||||||
|
-- @function [parent=#ARMYGROUP] DetourReached
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "DetourReached" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __DetourReached
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "DetourReached" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterDetourReached
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Retreat".
|
||||||
|
-- @function [parent=#ARMYGROUP] Retreat
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Retreat" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Retreat
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Retreat" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRetreat
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Retreated".
|
||||||
|
-- @function [parent=#ARMYGROUP] Retreated
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Retreated" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Retreated
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Retreated" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRetreated
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "EngageTarget".
|
||||||
|
-- @function [parent=#ARMYGROUP] EngageTarget
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "EngageTarget" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __EngageTarget
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "EngageTarget" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterEngageTarget
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Disengage".
|
||||||
|
-- @function [parent=#ARMYGROUP] Disengage
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Disengage" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Disengage
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Disengage" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterDisengage
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearm".
|
||||||
|
-- @function [parent=#ARMYGROUP] Rearm
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearm" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Rearm
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Rearm" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRearm
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearming".
|
||||||
|
-- @function [parent=#ARMYGROUP] Rearming
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearming" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Rearming
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Rearming" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRearming
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearmed".
|
||||||
|
-- @function [parent=#ARMYGROUP] Rearmed
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Rearmed" after a delay.
|
||||||
|
-- @function [parent=#ARMYGROUP] __Rearmed
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Rearmed" event.
|
||||||
|
-- @function [parent=#ARMYGROUP] OnAfterRearmed
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
|
-- TODO: Add pseudo functions.
|
||||||
|
|
||||||
-- Init waypoints.
|
-- Init waypoints.
|
||||||
self:_InitWaypoints()
|
self:_InitWaypoints()
|
||||||
@@ -598,8 +815,10 @@ function ARMYGROUP:onafterSpawned(From, Event, To)
|
|||||||
|
|
||||||
-- Update route.
|
-- Update route.
|
||||||
if #self.waypoints>1 then
|
if #self.waypoints>1 then
|
||||||
|
self:T(self.lid.."Got waypoints on spawn ==> Cruise in -0.1 sec!")
|
||||||
self:__Cruise(-0.1, nil, self.option.Formation)
|
self:__Cruise(-0.1, nil, self.option.Formation)
|
||||||
else
|
else
|
||||||
|
self:T(self.lid.."No waypoints on spawn ==> Full Stop!")
|
||||||
self:FullStop()
|
self:FullStop()
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -629,6 +848,8 @@ function ARMYGROUP:onbeforeUpdateRoute(From, Event, To, n, N, Speed, Formation)
|
|||||||
elseif self:IsStopped() then
|
elseif self:IsStopped() then
|
||||||
self:E(self.lid.."Update route denied. Group is STOPPED!")
|
self:E(self.lid.."Update route denied. Group is STOPPED!")
|
||||||
return false
|
return false
|
||||||
|
elseif self:IsHolding() then
|
||||||
|
self:E(self.lid.."Update route denied. Group is holding position! Use Cruise()")
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
@@ -724,10 +945,10 @@ function ARMYGROUP:onafterUpdateRoute(From, Event, To, n, N, Speed, Formation)
|
|||||||
|
|
||||||
|
|
||||||
-- Debug output.
|
-- Debug output.
|
||||||
if false then
|
if self.verbose>=5 then
|
||||||
for i,_wp in pairs(waypoints) do
|
for i,_wp in pairs(waypoints) do
|
||||||
local wp=_wp
|
local wp=_wp
|
||||||
local text=string.format("WP #%d UID=%d type=%s: Speed=%d m/s, alt=%d m, Action=%s", i, wp.uid and wp.uid or 0, wp.type, wp.speed, wp.alt, wp.action)
|
local text=string.format("WP #%d UID=%d type=%s: Speed=%d m/s, alt=%d m, Action=%s", i, wp.uid and wp.uid or -1, wp.type, wp.speed, wp.alt, wp.action)
|
||||||
self:T(text)
|
self:T(text)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1376,7 +1597,8 @@ function ARMYGROUP:_InitGroup(Template)
|
|||||||
|
|
||||||
-- Add elemets.
|
-- Add elemets.
|
||||||
for _,unit in pairs(units) do
|
for _,unit in pairs(units) do
|
||||||
self:_AddElementByName(unit:GetName())
|
local unitname=unit:GetName()
|
||||||
|
self:_AddElementByName(unitname)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2255,11 +2255,11 @@ end
|
|||||||
--- Attach OPS transport to the mission. Mission assets will be transported before the mission is started at the OPSGROUP level.
|
--- Attach OPS transport to the mission. Mission assets will be transported before the mission is started at the OPSGROUP level.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @param Core.Zone#ZONE DeployZone Zone where assets are deployed.
|
-- @param Core.Zone#ZONE DeployZone Zone where assets are deployed.
|
||||||
-- @param Core.Zone#ZONE DisembarkZone Zone where assets are disembarked to.
|
|
||||||
-- @param #number NcarriersMin Number of carriers *at least* required. Default 1.
|
-- @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`.
|
-- @param #number NcarriersMax Number of carriers *at most* used for transportation. Default is same as `NcarriersMin`.
|
||||||
|
-- @param Core.Zone#ZONE DisembarkZone Zone where assets are disembarked to.
|
||||||
-- @return #AUFTRAG self
|
-- @return #AUFTRAG self
|
||||||
function AUFTRAG:SetRequiredTransport(DeployZone, DisembarkZone, NcarriersMin, NcarriersMax)
|
function AUFTRAG:SetRequiredTransport(DeployZone, NcarriersMin, NcarriersMax, DisembarkZone)
|
||||||
|
|
||||||
-- OPS transport from pickup to deploy zone.
|
-- OPS transport from pickup to deploy zone.
|
||||||
self.transportDeployZone=DeployZone
|
self.transportDeployZone=DeployZone
|
||||||
|
|||||||
@@ -235,15 +235,15 @@ function CHIEF:New(Coalition, AgentSet, Alias)
|
|||||||
--- Triggers the FSM event "MissionAssign".
|
--- Triggers the FSM event "MissionAssign".
|
||||||
-- @function [parent=#CHIEF] MissionAssign
|
-- @function [parent=#CHIEF] MissionAssign
|
||||||
-- @param #CHIEF self
|
-- @param #CHIEF self
|
||||||
-- @param Ops.Legion#LEGION Legion The legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionAssign" after a delay.
|
--- Triggers the FSM event "MissionAssign" after a delay.
|
||||||
-- @function [parent=#CHIEF] __MissionAssign
|
-- @function [parent=#CHIEF] __MissionAssign
|
||||||
-- @param #CHIEF self
|
-- @param #CHIEF self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
--- On after "MissionAssign" event.
|
--- On after "MissionAssign" event.
|
||||||
-- @function [parent=#CHIEF] OnAfterMissionAssign
|
-- @function [parent=#CHIEF] OnAfterMissionAssign
|
||||||
@@ -251,9 +251,8 @@ function CHIEF:New(Coalition, AgentSet, Alias)
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionCancel".
|
--- Triggers the FSM event "MissionCancel".
|
||||||
-- @function [parent=#CHIEF] MissionCancel
|
-- @function [parent=#CHIEF] MissionCancel
|
||||||
@@ -1183,15 +1182,15 @@ end
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
function CHIEF:onafterMissionAssign(From, Event, To, Legion, Mission)
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
function CHIEF:onafterMissionAssign(From, Event, To, Mission, Legions)
|
||||||
|
|
||||||
if self.commander then
|
if self.commander then
|
||||||
self:I(self.lid..string.format("Assigning mission %s (%s) to COMMANDER", Mission.name, Mission.type))
|
self:I(self.lid..string.format("Assigning mission %s (%s) to COMMANDER", Mission.name, Mission.type))
|
||||||
Mission.chief=self
|
Mission.chief=self
|
||||||
Mission.statusChief=AUFTRAG.Status.QUEUED
|
Mission.statusChief=AUFTRAG.Status.QUEUED
|
||||||
self.commander:MissionAssign(Legion, Mission)
|
self.commander:MissionAssign(Mission, Legions)
|
||||||
else
|
else
|
||||||
self:E(self.lid..string.format("Mission cannot be assigned as no COMMANDER is defined!"))
|
self:E(self.lid..string.format("Mission cannot be assigned as no COMMANDER is defined!"))
|
||||||
end
|
end
|
||||||
@@ -1523,11 +1522,9 @@ function CHIEF:CheckTargetQueue()
|
|||||||
-- Mission parameters.
|
-- Mission parameters.
|
||||||
mission.prio=target.prio
|
mission.prio=target.prio
|
||||||
mission.importance=target.importance
|
mission.importance=target.importance
|
||||||
|
|
||||||
-- Assign mission to legions.
|
-- Assign mission to legions.
|
||||||
for _,Legion in pairs(Legions) do
|
self:MissionAssign(mission, Legions)
|
||||||
self:MissionAssign(Legion, mission)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Only ONE target is assigned per check.
|
-- Only ONE target is assigned per check.
|
||||||
return
|
return
|
||||||
@@ -2054,10 +2051,7 @@ function CHIEF:RecruitAssetsForZone(StratZone, MissionType, NassetsMin, NassetsM
|
|||||||
mission.opstransport=transport
|
mission.opstransport=transport
|
||||||
|
|
||||||
-- Assign mission to legions.
|
-- Assign mission to legions.
|
||||||
for _,_legion in pairs(legions) do
|
self:MissionAssign(mission, legions)
|
||||||
local legion=_legion --Ops.Legion#LEGION
|
|
||||||
self:MissionAssign(legion, mission)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Attach mission to ops zone.
|
-- Attach mission to ops zone.
|
||||||
-- TODO: Need a better way!
|
-- TODO: Need a better way!
|
||||||
@@ -2078,10 +2072,7 @@ function CHIEF:RecruitAssetsForZone(StratZone, MissionType, NassetsMin, NassetsM
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Assign mission to legions.
|
-- Assign mission to legions.
|
||||||
for _,_legion in pairs(legions) do
|
self:MissionAssign(mission, legions)
|
||||||
local legion=_legion --Ops.Legion#LEGION
|
|
||||||
self:MissionAssign(legion, mission)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Attach mission to ops zone.
|
-- Attach mission to ops zone.
|
||||||
-- TODO: Need a better way!
|
-- TODO: Need a better way!
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
--- **Ops** - Commander of Airwings, Brigades and Flotillas.
|
--- **Ops** - Commander of Airwings, Brigades and Fleets.
|
||||||
--
|
--
|
||||||
-- **Main Features:**
|
-- **Main Features:**
|
||||||
--
|
--
|
||||||
@@ -36,8 +36,81 @@
|
|||||||
--
|
--
|
||||||
-- # The COMMANDER Concept
|
-- # The COMMANDER Concept
|
||||||
--
|
--
|
||||||
-- A commander is the head of legions. He/she will find the best LEGIONs to perform an assigned AUFTRAG (mission).
|
-- A commander is the head of legions. He/she will find the best LEGIONs to perform an assigned AUFTRAG (mission) or OPSTRANSPORT.
|
||||||
|
-- A legion can be an AIRWING, BRIGADE or FLEET.
|
||||||
--
|
--
|
||||||
|
-- # Constructor
|
||||||
|
--
|
||||||
|
-- A new CHIEF object is created with the @{#CHIEF.New}(*Coalition, Alias*) function, where the parameter *Coalition* is the coalition side.
|
||||||
|
-- It can be `coalition.side.RED`, `coalition.side.BLUE` or `coalition.side.NEUTRAL`. This parameter is mandatory.
|
||||||
|
-- The second parameter *Alias* is optional and can be used to give the COMMANDER a "name", which is used for output in the dcs.log file.
|
||||||
|
--
|
||||||
|
-- local myCommander=COMANDER:New(coalition.side.BLUE, "General Patton")
|
||||||
|
--
|
||||||
|
-- # Adding Legions
|
||||||
|
--
|
||||||
|
-- Legions, i.e. AIRWINGS, BRIGADES and FLEETS can be added via the @{#COMMANDER.AddLegion}(*Legion*) command:
|
||||||
|
--
|
||||||
|
-- myCommander:AddLegion(myLegion)
|
||||||
|
--
|
||||||
|
-- ## Adding Airwings
|
||||||
|
--
|
||||||
|
-- It is also possible to use @{#COMMANDER.AddAirwing}(*myAirwing*) function. This does the same as the `AddLegion` function but might be a bit more intuitive.
|
||||||
|
--
|
||||||
|
-- ## Adding Brigades
|
||||||
|
--
|
||||||
|
-- It is also possible to use @{#COMMANDER.AddBrigade}(*myBrigade*) function. This does the same as the `AddLegion` function but might be a bit more intuitive.
|
||||||
|
--
|
||||||
|
-- ## Adding Fleets
|
||||||
|
--
|
||||||
|
-- It is also possible to use @{#COMMANDER.AddFleet}(*myFleet*) function. This does the same as the `AddLegion` function but might be a bit more intuitive.
|
||||||
|
--
|
||||||
|
-- # Adding Missions
|
||||||
|
--
|
||||||
|
-- Mission can be added via the @{#COMMANDER.AddMission}(*myMission*) function.
|
||||||
|
--
|
||||||
|
-- # Adding OPS Transports
|
||||||
|
--
|
||||||
|
-- Transportation assignments can be added via the @{#COMMANDER.AddOpsTransport}(*myTransport*) function.
|
||||||
|
--
|
||||||
|
-- # Adding CAP Zones
|
||||||
|
--
|
||||||
|
-- A CAP zone can be added via the @{#COMMANDER.AddCapZone}() function.
|
||||||
|
--
|
||||||
|
-- # Adding Rearming Zones
|
||||||
|
--
|
||||||
|
-- A rearming zone can be added via the @{#COMMANDER.AddRearmingZone}() function.
|
||||||
|
--
|
||||||
|
-- # Adding Refuelling Zones
|
||||||
|
--
|
||||||
|
-- A refuelling zone can be added via the @{#COMMANDER.AddRefuellingZone}() function.
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- # FSM Events
|
||||||
|
--
|
||||||
|
-- The COMMANDER will
|
||||||
|
--
|
||||||
|
-- # OPSGROUP on Mission
|
||||||
|
--
|
||||||
|
-- Whenever an OPSGROUP (FLIGHTGROUP, ARMYGROUP or NAVYGROUP) is send on a mission, the `OnAfterOpsOnMission()` event is triggered.
|
||||||
|
-- Mission designers can hook into the event with the @{#COMMANDER.OnAfterOpsOnMission}() function
|
||||||
|
--
|
||||||
|
-- function myCommander:OnAfterOpsOnMission(From, Event, To, OpsGroup, Mission)
|
||||||
|
-- -- Your code
|
||||||
|
-- end
|
||||||
|
--
|
||||||
|
-- # Canceling a Mission
|
||||||
|
--
|
||||||
|
-- A mission can be cancelled with the @{#COMMMANDER.MissionCancel}() function
|
||||||
|
--
|
||||||
|
-- myCommander:MissionCancel(myMission)
|
||||||
|
--
|
||||||
|
-- or
|
||||||
|
-- myCommander:__MissionCancel(5*60, myMission)
|
||||||
|
--
|
||||||
|
-- The last commander cancels the mission after 5 minutes (300 seconds).
|
||||||
|
--
|
||||||
|
-- The cancel command will be forwarded to all assigned legions and OPS groups, which will abort their mission or remove it from their queue.
|
||||||
--
|
--
|
||||||
-- @field #COMMANDER
|
-- @field #COMMANDER
|
||||||
COMMANDER = {
|
COMMANDER = {
|
||||||
@@ -62,8 +135,8 @@ COMMANDER.version="0.1.0"
|
|||||||
-- TODO list
|
-- TODO list
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO: Add CAP zones.
|
-- DONE: Add CAP zones.
|
||||||
-- TODO: Add tanker zones.
|
-- DONE: Add tanker zones.
|
||||||
-- DONE: Improve legion selection. Mostly done!
|
-- DONE: Improve legion selection. Mostly done!
|
||||||
-- DONE: Find solution for missions, which require a transport. This is not as easy as it sounds since the selected mission assets restrict the possible transport assets.
|
-- DONE: Find solution for missions, which require a transport. This is not as easy as it sounds since the selected mission assets restrict the possible transport assets.
|
||||||
-- DONE: Add ops transports.
|
-- DONE: Add ops transports.
|
||||||
@@ -83,11 +156,28 @@ function COMMANDER:New(Coalition, Alias)
|
|||||||
|
|
||||||
-- Inherit everything from INTEL class.
|
-- Inherit everything from INTEL class.
|
||||||
local self=BASE:Inherit(self, FSM:New()) --#COMMANDER
|
local self=BASE:Inherit(self, FSM:New()) --#COMMANDER
|
||||||
|
|
||||||
|
if Coalition==nil then
|
||||||
|
env.error("ERROR: Coalition parameter is nil in COMMANDER:New() call!")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
-- Set coaliton.
|
-- Set coaliton.
|
||||||
self.coalition=Coalition
|
self.coalition=Coalition
|
||||||
|
|
||||||
-- Alias name.
|
-- Alias name.
|
||||||
self.alias=Alias or string.format("John Doe")
|
self.alias=Alias
|
||||||
|
|
||||||
|
-- Choose a name for red or blue.
|
||||||
|
if self.alias==nil then
|
||||||
|
if Coalition==coalition.side.BLUE then
|
||||||
|
self.alias="George S. Patton"
|
||||||
|
elseif Coalition==coalition.side.RED then
|
||||||
|
self.alias="Georgy Zhukov"
|
||||||
|
elseif Coalition==coalition.side.NEUTRAL then
|
||||||
|
self.alias="Mahatma Gandhi"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Log ID.
|
-- Log ID.
|
||||||
self.lid=string.format("COMMANDER %s [%s] | ", self.alias, UTILS.GetCoalitionName(self.coalition))
|
self.lid=string.format("COMMANDER %s [%s] | ", self.alias, UTILS.GetCoalitionName(self.coalition))
|
||||||
@@ -145,15 +235,15 @@ function COMMANDER:New(Coalition, Alias)
|
|||||||
--- Triggers the FSM event "MissionAssign". Mission is added to a LEGION mission queue and already requested. Needs assets to be added to the mission!
|
--- Triggers the FSM event "MissionAssign". Mission is added to a LEGION mission queue and already requested. Needs assets to be added to the mission!
|
||||||
-- @function [parent=#COMMANDER] MissionAssign
|
-- @function [parent=#COMMANDER] MissionAssign
|
||||||
-- @param #COMMANDER self
|
-- @param #COMMANDER self
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionAssign" after a delay. Mission is added to a LEGION mission queue and already requested. Needs assets to be added to the mission!
|
--- Triggers the FSM event "MissionAssign" after a delay. Mission is added to a LEGION mission queue and already requested. Needs assets to be added to the mission!
|
||||||
-- @function [parent=#COMMANDER] __MissionAssign
|
-- @function [parent=#COMMANDER] __MissionAssign
|
||||||
-- @param #COMMANDER self
|
-- @param #COMMANDER self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
--- On after "MissionAssign" event.
|
--- On after "MissionAssign" event.
|
||||||
-- @function [parent=#COMMANDER] OnAfterMissionAssign
|
-- @function [parent=#COMMANDER] OnAfterMissionAssign
|
||||||
@@ -161,8 +251,8 @@ function COMMANDER:New(Coalition, Alias)
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionCancel".
|
--- Triggers the FSM event "MissionCancel".
|
||||||
@@ -188,15 +278,15 @@ function COMMANDER:New(Coalition, Alias)
|
|||||||
--- Triggers the FSM event "TransportAssign".
|
--- Triggers the FSM event "TransportAssign".
|
||||||
-- @function [parent=#COMMANDER] TransportAssign
|
-- @function [parent=#COMMANDER] TransportAssign
|
||||||
-- @param #COMMANDER self
|
-- @param #COMMANDER self
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
--- Triggers the FSM event "TransportAssign" after a delay.
|
--- Triggers the FSM event "TransportAssign" after a delay.
|
||||||
-- @function [parent=#COMMANDER] __TransportAssign
|
-- @function [parent=#COMMANDER] __TransportAssign
|
||||||
-- @param #COMMANDER self
|
-- @param #COMMANDER self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
--- On after "TransportAssign" event.
|
--- On after "TransportAssign" event.
|
||||||
-- @function [parent=#COMMANDER] OnAfterTransportAssign
|
-- @function [parent=#COMMANDER] OnAfterTransportAssign
|
||||||
@@ -204,8 +294,8 @@ function COMMANDER:New(Coalition, Alias)
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The Legion.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "TransportCancel".
|
--- Triggers the FSM event "TransportCancel".
|
||||||
@@ -377,7 +467,7 @@ function COMMANDER:RemoveTransport(Transport)
|
|||||||
local transport=_transport --Ops.OpsTransport#OPSTRANSPORT
|
local transport=_transport --Ops.OpsTransport#OPSTRANSPORT
|
||||||
|
|
||||||
if transport.uid==Transport.uid then
|
if transport.uid==Transport.uid then
|
||||||
self:I(self.lid..string.format("Removing mission %s (%s) status=%s from queue", transport.uid, transport:GetState()))
|
self:I(self.lid..string.format("Removing transport UID=%d status=%s from queue", transport.uid, transport:GetState()))
|
||||||
transport.commander=nil
|
transport.commander=nil
|
||||||
table.remove(self.transportqueue, i)
|
table.remove(self.transportqueue, i)
|
||||||
break
|
break
|
||||||
@@ -444,7 +534,7 @@ function COMMANDER:AddCapZone(Zone, Altitude, Speed, Heading, Leg)
|
|||||||
|
|
||||||
table.insert(self.capZones, patrolzone)
|
table.insert(self.capZones, patrolzone)
|
||||||
|
|
||||||
return awacszone
|
return patrolzone
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Add an AWACS zone.
|
--- Add an AWACS zone.
|
||||||
@@ -496,7 +586,7 @@ function COMMANDER:AddTankerZone(Zone, Altitude, Speed, Heading, Leg, RefuelSyst
|
|||||||
|
|
||||||
table.insert(self.tankerZones, tankerzone)
|
table.insert(self.tankerZones, tankerzone)
|
||||||
|
|
||||||
return awacszone
|
return tankerzone
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Check if this mission is already in the queue.
|
--- Check if this mission is already in the queue.
|
||||||
@@ -762,24 +852,29 @@ end
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The LEGION.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
function COMMANDER:onafterMissionAssign(From, Event, To, Legion, Mission)
|
-- @param #table Legions The Legion(s) to which the mission is assigned.
|
||||||
|
function COMMANDER:onafterMissionAssign(From, Event, To, Mission, Legions)
|
||||||
-- Debug info.
|
|
||||||
self:I(self.lid..string.format("Assigning mission %s (%s) to legion %s", Mission.name, Mission.type, Legion.alias))
|
|
||||||
|
|
||||||
-- Add mission to queue.
|
-- Add mission to queue.
|
||||||
self:AddMission(Mission)
|
self:AddMission(Mission)
|
||||||
|
|
||||||
-- Set mission commander status to QUEUED as it is now queued at a legion.
|
-- Set mission commander status to QUEUED as it is now queued at a legion.
|
||||||
Mission.statusCommander=AUFTRAG.Status.QUEUED
|
Mission.statusCommander=AUFTRAG.Status.QUEUED
|
||||||
|
|
||||||
-- Add mission to legion.
|
for _,_Legion in pairs(Legions) do
|
||||||
Legion:AddMission(Mission)
|
local Legion=_Legion --Ops.Legion#LEGION
|
||||||
|
|
||||||
-- Directly request the mission as the assets have already been selected.
|
-- Debug info.
|
||||||
Legion:MissionRequest(Mission)
|
self:I(self.lid..string.format("Assigning mission \"%s\" [%s] to legion \"%s\"", Mission.name, Mission.type, Legion.alias))
|
||||||
|
|
||||||
|
-- Add mission to legion.
|
||||||
|
Legion:AddMission(Mission)
|
||||||
|
|
||||||
|
-- Directly request the mission as the assets have already been selected.
|
||||||
|
Legion:MissionRequest(Mission)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -792,7 +887,7 @@ end
|
|||||||
function COMMANDER:onafterMissionCancel(From, Event, To, Mission)
|
function COMMANDER:onafterMissionCancel(From, Event, To, Mission)
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Cancelling mission %s (%s) in status %s", Mission.name, Mission.type, Mission.status))
|
self:I(self.lid..string.format("Cancelling mission \"%s\" [%s] in status %s", Mission.name, Mission.type, Mission.status))
|
||||||
|
|
||||||
-- Set commander status.
|
-- Set commander status.
|
||||||
Mission.statusCommander=AUFTRAG.Status.CANCELLED
|
Mission.statusCommander=AUFTRAG.Status.CANCELLED
|
||||||
@@ -825,21 +920,26 @@ end
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The LEGION.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
function COMMANDER:onafterTransportAssign(From, Event, To, Legion, Transport)
|
function COMMANDER:onafterTransportAssign(From, Event, To, Transport, Legions)
|
||||||
|
|
||||||
-- Debug info.
|
|
||||||
self:I(self.lid..string.format("Assigning transport %d to legion %s", Transport.uid, Legion.alias))
|
|
||||||
|
|
||||||
-- Set mission commander status to QUEUED as it is now queued at a legion.
|
-- Set mission commander status to QUEUED as it is now queued at a legion.
|
||||||
Transport.statusCommander=OPSTRANSPORT.Status.QUEUED
|
Transport.statusCommander=OPSTRANSPORT.Status.QUEUED
|
||||||
|
|
||||||
-- Add mission to legion.
|
for _,_Legion in pairs(Legions) do
|
||||||
Legion:AddOpsTransport(Transport)
|
local Legion=_Legion --Ops.Legion#LEGION
|
||||||
|
|
||||||
|
-- Debug info.
|
||||||
|
self:I(self.lid..string.format("Assigning transport UID=%d to legion \"%s\"", Transport.uid, Legion.alias))
|
||||||
|
|
||||||
-- Directly request the mission as the assets have already been selected.
|
-- Add mission to legion.
|
||||||
Legion:TransportRequest(Transport)
|
Legion:AddOpsTransport(Transport)
|
||||||
|
|
||||||
|
-- Directly request the mission as the assets have already been selected.
|
||||||
|
Legion:TransportRequest(Transport)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -889,7 +989,7 @@ end
|
|||||||
-- @param Ops.Auftrag#AUFTRAG Mission The requested mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The requested mission.
|
||||||
function COMMANDER:onafterOpsOnMission(From, Event, To, OpsGroup, Mission)
|
function COMMANDER:onafterOpsOnMission(From, Event, To, OpsGroup, Mission)
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T2(self.lid..string.format("Group %s on %s mission %s", OpsGroup:GetName(), Mission:GetType(), Mission:GetName()))
|
self:T2(self.lid..string.format("Group \"%s\" on mission \"%s\" [%s]", OpsGroup:GetName(), Mission:GetName(), Mission:GetType()))
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -981,17 +1081,8 @@ function COMMANDER:CheckMissionQueue()
|
|||||||
-- Escort and transport must be available (or not required).
|
-- Escort and transport must be available (or not required).
|
||||||
if EscortAvail and TransportAvail then
|
if EscortAvail and TransportAvail then
|
||||||
|
|
||||||
-- Assign mission to legion(s).
|
-- Add mission to legion.
|
||||||
for _,_legion in pairs(legions) do
|
self:MissionAssign(mission, legions)
|
||||||
local legion=_legion --Ops.Legion#LEGION
|
|
||||||
|
|
||||||
-- Debug message.
|
|
||||||
self:I(self.lid..string.format("Assigning mission %s [%s] to legion %s", mission:GetName(), mission:GetType(), legion.alias))
|
|
||||||
|
|
||||||
-- Add mission to legion.
|
|
||||||
self:MissionAssign(legion, mission)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
else
|
||||||
-- Recruited assets but no requested escort available. Unrecruit assets!
|
-- Recruited assets but no requested escort available. Unrecruit assets!
|
||||||
@@ -1188,16 +1279,7 @@ function COMMANDER:CheckTransportQueue()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Assign transport to legion(s).
|
-- Assign transport to legion(s).
|
||||||
for _,_legion in pairs(legions) do
|
self:TransportAssign(transport, legions)
|
||||||
local legion=_legion --Ops.Legion#LEGION
|
|
||||||
|
|
||||||
-- Debug message.
|
|
||||||
self:I(self.lid..string.format("Assigning transport UID=%d to legion %s", transport.uid, legion.alias))
|
|
||||||
|
|
||||||
-- Add mission to legion.
|
|
||||||
self:TransportAssign(legion, transport)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Only ONE transport is assigned.
|
-- Only ONE transport is assigned.
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -125,15 +125,15 @@ function LEGION:New(WarehouseName, LegionName)
|
|||||||
--- Triggers the FSM event "MissionAssign".
|
--- Triggers the FSM event "MissionAssign".
|
||||||
-- @function [parent=#LEGION] MissionAssign
|
-- @function [parent=#LEGION] MissionAssign
|
||||||
-- @param #LEGION self
|
-- @param #LEGION self
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the mission assets are requested.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The legion(s) from which the mission assets are requested.
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionAssign" after a delay.
|
--- Triggers the FSM event "MissionAssign" after a delay.
|
||||||
-- @function [parent=#LEGION] __MissionAssign
|
-- @function [parent=#LEGION] __MissionAssign
|
||||||
-- @param #LEGION self
|
-- @param #LEGION self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the mission assets are requested.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The legion(s) from which the mission assets are requested.
|
||||||
|
|
||||||
--- On after "MissionAssign" event.
|
--- On after "MissionAssign" event.
|
||||||
-- @function [parent=#LEGION] OnAfterMissionAssign
|
-- @function [parent=#LEGION] OnAfterMissionAssign
|
||||||
@@ -141,8 +141,8 @@ function LEGION:New(WarehouseName, LegionName)
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the mission assets are requested.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
-- @param #table Legions The legion(s) from which the mission assets are requested.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "MissionRequest".
|
--- Triggers the FSM event "MissionRequest".
|
||||||
@@ -183,15 +183,15 @@ function LEGION:New(WarehouseName, LegionName)
|
|||||||
--- Triggers the FSM event "TransportAssign".
|
--- Triggers the FSM event "TransportAssign".
|
||||||
-- @function [parent=#LEGION] TransportAssign
|
-- @function [parent=#LEGION] TransportAssign
|
||||||
-- @param #LEGION self
|
-- @param #LEGION self
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the transport assets are requested.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
--- Triggers the FSM event "TransportAssign" after a delay.
|
--- Triggers the FSM event "TransportAssign" after a delay.
|
||||||
-- @function [parent=#LEGION] __TransportAssign
|
-- @function [parent=#LEGION] __TransportAssign
|
||||||
-- @param #LEGION self
|
-- @param #LEGION self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the transport assets are requested.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
--- On after "TransportAssign" event.
|
--- On after "TransportAssign" event.
|
||||||
-- @function [parent=#LEGION] OnAfterTransportAssign
|
-- @function [parent=#LEGION] OnAfterTransportAssign
|
||||||
@@ -199,8 +199,8 @@ function LEGION:New(WarehouseName, LegionName)
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The legion from which the transport assets are requested.
|
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
|
-- @param #table Legions The legion(s) to which this transport is assigned.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "TransportRequest".
|
--- Triggers the FSM event "TransportRequest".
|
||||||
@@ -617,18 +617,23 @@ end
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The LEGION.
|
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
function LEGION:onafterMissionAssign(From, Event, To, Legion, Mission)
|
-- @param #table Legions The LEGIONs.
|
||||||
|
function LEGION:onafterMissionAssign(From, Event, To, Mission, Legions)
|
||||||
|
|
||||||
|
for _,_Legion in pairs(Legions) do
|
||||||
|
local Legion=_Legion --Ops.Legion#LEGION
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Assigning mission %s (%s) to legion %s", Mission.name, Mission.type, Legion.alias))
|
self:I(self.lid..string.format("Assigning mission %s (%s) to legion %s", Mission.name, Mission.type, Legion.alias))
|
||||||
|
|
||||||
-- Add mission to legion.
|
-- Add mission to legion.
|
||||||
Legion:AddMission(Mission)
|
Legion:AddMission(Mission)
|
||||||
|
|
||||||
-- Directly request the mission as the assets have already been selected.
|
-- Directly request the mission as the assets have already been selected.
|
||||||
Legion:MissionRequest(Mission)
|
Legion:MissionRequest(Mission)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -749,18 +754,23 @@ end
|
|||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
-- @param Ops.Legion#LEGION Legion The LEGION.
|
-- @param Ops.OpsTransport#OPSTRANSPORT Transport The transport.
|
||||||
-- @param Ops.OpsTransport#OPSTRANSPORT The transport.
|
-- @param #table Legions The legion(s) to which the transport is assigned.
|
||||||
function LEGION:onafterTransportAssign(From, Event, To, Legion, Transport)
|
function LEGION:onafterTransportAssign(From, Event, To, Transport, Legions)
|
||||||
|
|
||||||
-- Debug info.
|
for _,_Legion in pairs(Legions) do
|
||||||
self:I(self.lid..string.format("Assigning transport %d to legion %s", Transport.uid, Legion.alias))
|
local Legion=_Legion --Ops.Legion#LEGION
|
||||||
|
|
||||||
|
-- Debug info.
|
||||||
|
self:I(self.lid..string.format("Assigning transport %d to legion %s", Transport.uid, Legion.alias))
|
||||||
|
|
||||||
|
-- Add mission to legion.
|
||||||
|
Legion:AddOpsTransport(Transport)
|
||||||
|
|
||||||
-- Add mission to legion.
|
-- Directly request the mission as the assets have already been selected.
|
||||||
Legion:AddOpsTransport(Transport)
|
Legion:TransportRequest(Transport)
|
||||||
|
|
||||||
-- Directly request the mission as the assets have already been selected.
|
end
|
||||||
Legion:TransportRequest(Transport)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2148,7 +2158,7 @@ function LEGION:AssignAssetsForEscort(Cohorts, Assets, NescortMin, NescortMax)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Assign mission to legion.
|
-- Assign mission to legion.
|
||||||
self:MissionAssign(legion, escort)
|
self:MissionAssign(escort, {legion})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2240,7 +2250,7 @@ function LEGION:AssignAssetsForTransport(Legions, CargoAssets, NcarriersMin, Nca
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
env.info(string.format("FF Transport available with %d carrier assets", #CarrierAssets))
|
self:T(self.lid..string.format("Transport available with %d carrier assets", #CarrierAssets))
|
||||||
|
|
||||||
-- Add cargo assets to transport.
|
-- Add cargo assets to transport.
|
||||||
for _,_legion in pairs(CargoLegions) do
|
for _,_legion in pairs(CargoLegions) do
|
||||||
@@ -2272,10 +2282,7 @@ function LEGION:AssignAssetsForTransport(Legions, CargoAssets, NcarriersMin, Nca
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Assign TRANSPORT to legions. This also sends the request for the assets.
|
-- Assign TRANSPORT to legions. This also sends the request for the assets.
|
||||||
for _,_legion in pairs(CarrierLegions) do
|
self:TransportAssign(Transport, CarrierLegions)
|
||||||
local legion=_legion --Ops.Legion#LEGION
|
|
||||||
self:TransportAssign(legion, Transport)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Got transport.
|
-- Got transport.
|
||||||
return true, Transport
|
return true, Transport
|
||||||
@@ -2393,15 +2400,15 @@ function LEGION._OptimizeAssetSelection(assets, MissionType, TargetVec2, Include
|
|||||||
table.sort(assets, optimize)
|
table.sort(assets, optimize)
|
||||||
|
|
||||||
-- Remove distance parameter.
|
-- Remove distance parameter.
|
||||||
--[[
|
if LEGION.verbose>0 then
|
||||||
local text=string.format("Optimized %d assets for %s mission/transport (payload=%s):", #assets, MissionType, tostring(IncludePayload))
|
local text=string.format("Optimized %d assets for %s mission/transport (payload=%s):", #assets, MissionType, tostring(IncludePayload))
|
||||||
for i,Asset in pairs(assets) do
|
for i,Asset in pairs(assets) do
|
||||||
local asset=Asset --Functional.Warehouse#WAREHOUSE.Assetitem
|
local asset=Asset --Functional.Warehouse#WAREHOUSE.Assetitem
|
||||||
text=text..string.format("\n%s %s: score=%d", asset.squadname, asset.spawngroupname, asset.score)
|
text=text..string.format("\n%s %s: score=%d", asset.squadname, asset.spawngroupname, asset.score)
|
||||||
asset.score=nil
|
asset.score=nil
|
||||||
|
end
|
||||||
|
env.info(text)
|
||||||
end
|
end
|
||||||
env.info(text)
|
|
||||||
]]
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -159,13 +159,38 @@ function NAVYGROUP:New(group)
|
|||||||
self:AddTransition("*", "CollisionWarning", "*") -- Collision warning.
|
self:AddTransition("*", "CollisionWarning", "*") -- Collision warning.
|
||||||
self:AddTransition("*", "ClearAhead", "*") -- Clear ahead.
|
self:AddTransition("*", "ClearAhead", "*") -- Clear ahead.
|
||||||
|
|
||||||
self:AddTransition("*", "Dive", "*") -- Command a submarine to dive.
|
self:AddTransition("Cruising", "Dive", "Cruising") -- Command a submarine to dive.
|
||||||
self:AddTransition("Diving", "Surface", "*") -- Command a submarine to go to the surface.
|
self:AddTransition("Cruising", "Surface", "Cruising") -- Command a submarine to go to the surface.
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
--- Pseudo Functions ---
|
--- Pseudo Functions ---
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Cruise".
|
||||||
|
-- @function [parent=#NAVYGROUP] Cruise
|
||||||
|
-- @param #NAVYGROUP self
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
|
|
||||||
|
--- Triggers the FSM event "Cruise" after a delay.
|
||||||
|
-- @function [parent=#NAVYGROUP] __Cruise
|
||||||
|
-- @param #NAVYGROUP self
|
||||||
|
-- @param #number delay Delay in seconds.
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
|
|
||||||
|
--- On after "Cruise" event.
|
||||||
|
-- @function [parent=#NAVYGROUP] OnAfterCruise
|
||||||
|
-- @param #NAVYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
-- @param #number Speed Speed in knots until next waypoint is reached.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "TurnIntoWind".
|
--- Triggers the FSM event "TurnIntoWind".
|
||||||
-- @function [parent=#NAVYGROUP] TurnIntoWind
|
-- @function [parent=#NAVYGROUP] TurnIntoWind
|
||||||
-- @param #NAVYGROUP self
|
-- @param #NAVYGROUP self
|
||||||
@@ -240,7 +265,6 @@ function NAVYGROUP:New(group)
|
|||||||
-- @param #NAVYGROUP.IntoWind IntoWindData Data table.
|
-- @param #NAVYGROUP.IntoWind IntoWindData Data table.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "TurningStarted".
|
--- Triggers the FSM event "TurningStarted".
|
||||||
-- @function [parent=#NAVYGROUP] TurningStarted
|
-- @function [parent=#NAVYGROUP] TurningStarted
|
||||||
-- @param #NAVYGROUP self
|
-- @param #NAVYGROUP self
|
||||||
|
|||||||
@@ -2899,6 +2899,9 @@ function OPSGROUP:OnEventBirth(EventData)
|
|||||||
local element=self:GetElementByName(unitname)
|
local element=self:GetElementByName(unitname)
|
||||||
|
|
||||||
if element and element.status~=OPSGROUP.ElementStatus.SPAWNED then
|
if element and element.status~=OPSGROUP.ElementStatus.SPAWNED then
|
||||||
|
|
||||||
|
-- Debug info.
|
||||||
|
self:T(self.lid..string.format("EVENT: Element %s born ==> spawned", unitname))
|
||||||
|
|
||||||
-- Set element to spawned state.
|
-- Set element to spawned state.
|
||||||
self:ElementSpawned(element)
|
self:ElementSpawned(element)
|
||||||
@@ -6113,7 +6116,6 @@ function OPSGROUP:_CheckCargoTransport()
|
|||||||
local Time=timer.getAbsTime()
|
local Time=timer.getAbsTime()
|
||||||
|
|
||||||
-- Cargo bay debug info.
|
-- Cargo bay debug info.
|
||||||
-- Check cargo bay and declare cargo groups dead.
|
|
||||||
if self.verbose>=1 then
|
if self.verbose>=1 then
|
||||||
local text=""
|
local text=""
|
||||||
for _,_element in pairs(self.elements) do
|
for _,_element in pairs(self.elements) do
|
||||||
@@ -8046,10 +8048,15 @@ function OPSGROUP:onafterBoard(From, Event, To, CarrierGroup, Carrier)
|
|||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T(self.lid..string.format("Board with direct load to carrier %s", CarrierGroup:GetName()))
|
self:T(self.lid..string.format("Board with direct load to carrier %s", CarrierGroup:GetName()))
|
||||||
|
|
||||||
local mycarriergroup=self:_GetMyCarrierGroup()
|
-- Get current carrier group.
|
||||||
|
local mycarriergroup=self:_GetMyCarrierGroup()
|
||||||
|
if mycarriergroup then
|
||||||
|
self:T(self.lid..string.format("Current carrier group %s", mycarriergroup:GetName()))
|
||||||
|
end
|
||||||
|
|
||||||
-- Unload cargo first.
|
-- Unload cargo first.
|
||||||
if mycarriergroup then
|
if mycarriergroup and mycarriergroup:GetName()~=CarrierGroup:GetName() and self:IsLoaded() then
|
||||||
|
-- TODO: Unload triggers other stuff like Disembarked. This can be a problem!
|
||||||
mycarriergroup:Unload(self)
|
mycarriergroup:Unload(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -8880,8 +8887,8 @@ function OPSGROUP:Route(waypoints, delay)
|
|||||||
airborne = self:IsFlightgroup(),
|
airborne = self:IsFlightgroup(),
|
||||||
route={points=waypoints},
|
route={points=waypoints},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Set mission task.
|
-- Set mission task.
|
||||||
self:SetTask(DCSTask)
|
self:SetTask(DCSTask)
|
||||||
|
|
||||||
@@ -10813,11 +10820,20 @@ function OPSGROUP:_AddElementByName(unitname)
|
|||||||
--local unittemplate=_DATABASE:GetUnitTemplateFromUnitName(unitname)
|
--local unittemplate=_DATABASE:GetUnitTemplateFromUnitName(unitname)
|
||||||
|
|
||||||
-- Element table.
|
-- Element table.
|
||||||
local element={} --#OPSGROUP.Element
|
local element=self:GetElementByName(unitname)
|
||||||
|
|
||||||
|
-- Add element to table.
|
||||||
|
if element then
|
||||||
|
-- We already know this element.
|
||||||
|
else
|
||||||
|
-- Add a new element.
|
||||||
|
element={}
|
||||||
|
element.status=OPSGROUP.ElementStatus.INUTERO
|
||||||
|
table.insert(self.elements, element)
|
||||||
|
end
|
||||||
|
|
||||||
-- Name and status.
|
-- Name and status.
|
||||||
element.name=unitname
|
element.name=unitname
|
||||||
element.status=OPSGROUP.ElementStatus.INUTERO
|
|
||||||
|
|
||||||
-- Unit and group.
|
-- Unit and group.
|
||||||
element.unit=unit
|
element.unit=unit
|
||||||
@@ -10904,11 +10920,6 @@ function OPSGROUP:_AddElementByName(unitname)
|
|||||||
element.size, element.length, element.height, element.width, element.weight, element.weightMaxTotal, element.weightCargo, element.weightMaxCargo)
|
element.size, element.length, element.height, element.width, element.weight, element.weightMaxTotal, element.weightCargo, element.weightMaxCargo)
|
||||||
self:T(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
-- Add element to table.
|
|
||||||
if not self:_IsElement(unitname) then
|
|
||||||
table.insert(self.elements, element)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Trigger spawned event if alive.
|
-- Trigger spawned event if alive.
|
||||||
if unit:IsAlive() and element.status~=OPSGROUP.ElementStatus.SPAWNED then
|
if unit:IsAlive() and element.status~=OPSGROUP.ElementStatus.SPAWNED then
|
||||||
-- This needs to be slightly delayed (or moved elsewhere) or the first element will always trigger the group spawned event as it is not known that more elements are in the group.
|
-- This needs to be slightly delayed (or moved elsewhere) or the first element will always trigger the group spawned event as it is not known that more elements are in the group.
|
||||||
|
|||||||
@@ -38,8 +38,8 @@
|
|||||||
-- @field #number duration Duration (`Tstop-Tstart`) of the transport in seconds.
|
-- @field #number duration Duration (`Tstop-Tstart`) of the transport in seconds.
|
||||||
-- @field #table conditionStart Start conditions.
|
-- @field #table conditionStart Start conditions.
|
||||||
--
|
--
|
||||||
-- @field #table cargos Cargos. Each element is a @{Ops.OpsGroup#OPSGROUP.CargoGroup}.
|
|
||||||
-- @field #table carriers Carriers assigned for this transport.
|
-- @field #table carriers Carriers assigned for this transport.
|
||||||
|
-- @field #table carrierTransportStatus Status of each carrier.
|
||||||
--
|
--
|
||||||
-- @field #table tzCombos Table of transport zone combos. Each element of the table is of type `#OPSTRANSPORT.TransportZoneCombo`.
|
-- @field #table tzCombos Table of transport zone combos. Each element of the table is of type `#OPSTRANSPORT.TransportZoneCombo`.
|
||||||
-- @field #number tzcCounter Running number of added transport zone combos.
|
-- @field #number tzcCounter Running number of added transport zone combos.
|
||||||
@@ -117,7 +117,6 @@
|
|||||||
OPSTRANSPORT = {
|
OPSTRANSPORT = {
|
||||||
ClassName = "OPSTRANSPORT",
|
ClassName = "OPSTRANSPORT",
|
||||||
verbose = 0,
|
verbose = 0,
|
||||||
cargos = {},
|
|
||||||
carriers = {},
|
carriers = {},
|
||||||
carrierTransportStatus = {},
|
carrierTransportStatus = {},
|
||||||
tzCombos = {},
|
tzCombos = {},
|
||||||
@@ -152,7 +151,7 @@ OPSTRANSPORT.Status={
|
|||||||
FAILED="failed",
|
FAILED="failed",
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Pickup and deploy set.
|
--- Transport zone combination.
|
||||||
-- @type OPSTRANSPORT.TransportZoneCombo
|
-- @type OPSTRANSPORT.TransportZoneCombo
|
||||||
-- @field #number uid Unique ID of the TZ combo.
|
-- @field #number uid Unique ID of the TZ combo.
|
||||||
-- @field #number Ncarriers Number of carrier groups using this transport zone.
|
-- @field #number Ncarriers Number of carrier groups using this transport zone.
|
||||||
@@ -233,7 +232,6 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
self:SetRequiredCarriers()
|
self:SetRequiredCarriers()
|
||||||
|
|
||||||
-- Init arrays and counters.
|
-- Init arrays and counters.
|
||||||
self.cargos={}
|
|
||||||
self.carriers={}
|
self.carriers={}
|
||||||
self.Ncargo=0
|
self.Ncargo=0
|
||||||
self.Ncarrier=0
|
self.Ncarrier=0
|
||||||
@@ -256,7 +254,7 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
self:AddTransition(OPSTRANSPORT.Status.SCHEDULED, "Executing", OPSTRANSPORT.Status.EXECUTING) -- Cargo is being transported.
|
self:AddTransition(OPSTRANSPORT.Status.SCHEDULED, "Executing", OPSTRANSPORT.Status.EXECUTING) -- Cargo is being transported.
|
||||||
self:AddTransition("*", "Delivered", OPSTRANSPORT.Status.DELIVERED) -- Cargo was delivered.
|
self:AddTransition("*", "Delivered", OPSTRANSPORT.Status.DELIVERED) -- Cargo was delivered.
|
||||||
|
|
||||||
self:AddTransition("*", "Status", "*")
|
self:AddTransition("*", "StatusUpdate", "*")
|
||||||
self:AddTransition("*", "Stop", "*")
|
self:AddTransition("*", "Stop", "*")
|
||||||
|
|
||||||
self:AddTransition("*", "Cancel", OPSTRANSPORT.Status.CANCELLED) -- Command to cancel the transport.
|
self:AddTransition("*", "Cancel", OPSTRANSPORT.Status.CANCELLED) -- Command to cancel the transport.
|
||||||
@@ -272,12 +270,12 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
--- Pseudo Functions ---
|
--- Pseudo Functions ---
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
--- Triggers the FSM event "Status".
|
--- Triggers the FSM event "StatusUpdate".
|
||||||
-- @function [parent=#OPSTRANSPORT] Status
|
-- @function [parent=#OPSTRANSPORT] StatusUpdate
|
||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
|
|
||||||
--- Triggers the FSM event "Status" after a delay.
|
--- Triggers the FSM event "Status" after a delay.
|
||||||
-- @function [parent=#OPSTRANSPORT] __Status
|
-- @function [parent=#OPSTRANSPORT] __StatusUpdate
|
||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
@@ -291,6 +289,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Planned" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterPlanned
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Queued".
|
--- Triggers the FSM event "Queued".
|
||||||
-- @function [parent=#OPSTRANSPORT] Queued
|
-- @function [parent=#OPSTRANSPORT] Queued
|
||||||
@@ -301,6 +306,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Queued" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterQueued
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Requested".
|
--- Triggers the FSM event "Requested".
|
||||||
-- @function [parent=#OPSTRANSPORT] Requested
|
-- @function [parent=#OPSTRANSPORT] Requested
|
||||||
@@ -311,6 +323,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Requested" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterRequested
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Scheduled".
|
--- Triggers the FSM event "Scheduled".
|
||||||
-- @function [parent=#OPSTRANSPORT] Scheduled
|
-- @function [parent=#OPSTRANSPORT] Scheduled
|
||||||
@@ -321,6 +340,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Scheduled" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterScheduled
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Executing".
|
--- Triggers the FSM event "Executing".
|
||||||
-- @function [parent=#OPSTRANSPORT] Executing
|
-- @function [parent=#OPSTRANSPORT] Executing
|
||||||
@@ -331,6 +357,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Executing" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterExecuting
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Delivered".
|
--- Triggers the FSM event "Delivered".
|
||||||
-- @function [parent=#OPSTRANSPORT] Delivered
|
-- @function [parent=#OPSTRANSPORT] Delivered
|
||||||
@@ -341,6 +374,13 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
--- On after "Delivered" event.
|
||||||
|
-- @function [parent=#OPSTRANSPORT] OnAfterDelivered
|
||||||
|
-- @param #OPSTRANSPORT self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "Cancel".
|
--- Triggers the FSM event "Cancel".
|
||||||
-- @function [parent=#OPSTRANSPORT] Cancel
|
-- @function [parent=#OPSTRANSPORT] Cancel
|
||||||
@@ -414,7 +454,7 @@ function OPSTRANSPORT:New(CargoGroups, PickupZone, DeployZone)
|
|||||||
--TODO: Psydofunctions
|
--TODO: Psydofunctions
|
||||||
|
|
||||||
-- Call status update.
|
-- Call status update.
|
||||||
self:__Status(-1)
|
self:__StatusUpdate(-1)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -481,7 +521,7 @@ function OPSTRANSPORT:AddCargoGroups(GroupSet, TransportZoneCombo)
|
|||||||
if cargo then
|
if cargo then
|
||||||
|
|
||||||
-- Add to main table.
|
-- Add to main table.
|
||||||
table.insert(self.cargos, cargo)
|
--table.insert(self.cargos, cargo)
|
||||||
self.Ncargo=self.Ncargo+1
|
self.Ncargo=self.Ncargo+1
|
||||||
|
|
||||||
-- Add to TZC table.
|
-- Add to TZC table.
|
||||||
@@ -514,7 +554,7 @@ function OPSTRANSPORT:AddCargoGroups(GroupSet, TransportZoneCombo)
|
|||||||
Weight=Weight+weight
|
Weight=Weight+weight
|
||||||
text=text..string.format("\n- %s [%s] weight=%.1f kg", cargo.opsgroup:GetName(), cargo.opsgroup:GetState(), weight)
|
text=text..string.format("\n- %s [%s] weight=%.1f kg", cargo.opsgroup:GetName(), cargo.opsgroup:GetState(), weight)
|
||||||
end
|
end
|
||||||
text=text..string.format("\nTOTAL: Ncargo=%d, Weight=%.1f kg", #self.cargos, Weight)
|
text=text..string.format("\nTOTAL: Ncargo=%d, Weight=%.1f kg", self.Ncargo, Weight)
|
||||||
self:I(self.lid..text)
|
self:I(self.lid..text)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -927,13 +967,8 @@ function OPSTRANSPORT:_DelCarrier(CarrierGroup)
|
|||||||
self:T(self.lid..string.format("Removing carrier %s", CarrierGroup.groupname))
|
self:T(self.lid..string.format("Removing carrier %s", CarrierGroup.groupname))
|
||||||
table.remove(self.carriers, i)
|
table.remove(self.carriers, i)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
if #self.carriers==0 then
|
|
||||||
-- TODO: This call can be WRONG!
|
|
||||||
self:DeadCarrierAll()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -1557,12 +1592,12 @@ end
|
|||||||
-- Status Update
|
-- Status Update
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- On after "Status" event.
|
--- On after "StatusUpdate" event.
|
||||||
-- @param #OPSTRANSPORT self
|
-- @param #OPSTRANSPORT self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
-- @param #string Event Event.
|
-- @param #string Event Event.
|
||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
function OPSTRANSPORT:onafterStatus(From, Event, To)
|
function OPSTRANSPORT:onafterStatusUpdate(From, Event, To)
|
||||||
|
|
||||||
-- Current FSM state.
|
-- Current FSM state.
|
||||||
local fsmstate=self:GetState()
|
local fsmstate=self:GetState()
|
||||||
@@ -1577,7 +1612,9 @@ function OPSTRANSPORT:onafterStatus(From, Event, To)
|
|||||||
|
|
||||||
for i,_tz in pairs(self.tzCombos) do
|
for i,_tz in pairs(self.tzCombos) do
|
||||||
local tz=_tz --#OPSTRANSPORT.TransportZoneCombo
|
local tz=_tz --#OPSTRANSPORT.TransportZoneCombo
|
||||||
text=text..string.format("\n[%d] %s --> %s", i, tz.PickupZone and tz.PickupZone:GetName() or "Unknown", tz.DeployZone and tz.DeployZone and tz.DeployZone:GetName() or "Unknown", tz.Ncarriers)
|
local pickupzone=tz.PickupZone and tz.PickupZone:GetName() or "Unknown"
|
||||||
|
local deployzone=tz.DeployZone and tz.DeployZone:GetName() or "Unknown"
|
||||||
|
text=text..string.format("\n[%d] %s --> %s: Ncarriers=%d, Ncargo=%d (%d)", i, pickupzone, deployzone, tz.Ncarriers, #tz.Cargos, tz.Ncargo)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1613,7 +1650,7 @@ function OPSTRANSPORT:onafterStatus(From, Event, To)
|
|||||||
|
|
||||||
-- Update status again.
|
-- Update status again.
|
||||||
if not self:IsDelivered() then
|
if not self:IsDelivered() then
|
||||||
self:__Status(-30)
|
self:__StatusUpdate(-30)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1671,9 +1708,9 @@ end
|
|||||||
function OPSTRANSPORT:onafterDelivered(From, Event, To)
|
function OPSTRANSPORT:onafterDelivered(From, Event, To)
|
||||||
self:T(self.lid..string.format("New status: %s-->%s", From, To))
|
self:T(self.lid..string.format("New status: %s-->%s", From, To))
|
||||||
|
|
||||||
-- Inform all assigned carriers that cargo was delivered. They can have this in the queue or are currently processing this transport.
|
-- Inform all assigned carriers that cargo was delivered. They can have this in the queue or are currently processing this transport.
|
||||||
for _,_carrier in pairs(self.carriers) do
|
for i=#self.carriers, 1, -1 do
|
||||||
local carrier=_carrier --Ops.OpsGroup#OPSGROUP
|
local carrier=self.carriers[i] --Ops.OpsGroup#OPSGROUP
|
||||||
if self:GetCarrierTransportStatus(carrier)~=OPSTRANSPORT.Status.DELIVERED then
|
if self:GetCarrierTransportStatus(carrier)~=OPSTRANSPORT.Status.DELIVERED then
|
||||||
carrier:Delivered(self)
|
carrier:Delivered(self)
|
||||||
end
|
end
|
||||||
@@ -1712,8 +1749,15 @@ end
|
|||||||
-- @param Ops.OpsGroup#OPSGROUP OpsGroup Carrier OPSGROUP that is dead.
|
-- @param Ops.OpsGroup#OPSGROUP OpsGroup Carrier OPSGROUP that is dead.
|
||||||
function OPSTRANSPORT:onafterDeadCarrierGroup(From, Event, To, OpsGroup)
|
function OPSTRANSPORT:onafterDeadCarrierGroup(From, Event, To, OpsGroup)
|
||||||
self:I(self.lid..string.format("Carrier OPSGROUP %s dead!", OpsGroup:GetName()))
|
self:I(self.lid..string.format("Carrier OPSGROUP %s dead!", OpsGroup:GetName()))
|
||||||
-- Remove group from carrier list/table.
|
|
||||||
self.NdeadCarrier=self.NdeadCarrier+1
|
-- Increase dead counter.
|
||||||
|
self.NcarrierDead=self.NcarrierDead+1
|
||||||
|
|
||||||
|
if #self.carriers==0 then
|
||||||
|
self:DeadCarrierAll()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Remove group from carrier list/table.
|
||||||
self:_DelCarrier(OpsGroup)
|
self:_DelCarrier(OpsGroup)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1724,7 +1768,11 @@ end
|
|||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
function OPSTRANSPORT:onafterDeadCarrierAll(From, Event, To)
|
function OPSTRANSPORT:onafterDeadCarrierAll(From, Event, To)
|
||||||
self:I(self.lid..string.format("ALL Carrier OPSGROUPs are dead! Setting stage to PLANNED if not all cargo was delivered."))
|
self:I(self.lid..string.format("ALL Carrier OPSGROUPs are dead! Setting stage to PLANNED if not all cargo was delivered."))
|
||||||
|
|
||||||
|
-- Check if cargo was delivered.
|
||||||
self:_CheckDelivered()
|
self:_CheckDelivered()
|
||||||
|
|
||||||
|
-- Set state back to PLANNED if not delivered.
|
||||||
if not self:IsDelivered() then
|
if not self:IsDelivered() then
|
||||||
self:Planned()
|
self:Planned()
|
||||||
end
|
end
|
||||||
@@ -2064,9 +2112,16 @@ function OPSTRANSPORT:_GetTransportZoneCombo(Carrier)
|
|||||||
|
|
||||||
-- Get carrier position.
|
-- Get carrier position.
|
||||||
local vec2=Carrier:GetVec2()
|
local vec2=Carrier:GetVec2()
|
||||||
|
|
||||||
|
--- Penalty function.
|
||||||
|
local function penalty(candidate)
|
||||||
|
local p=candidate.ncarriers*10-candidate.ncargo+candidate.distance/10
|
||||||
|
return p
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TZC candidates.
|
||||||
|
local candidates={}
|
||||||
|
|
||||||
local pickup=nil --#OPSTRANSPORT.TransportZoneCombo
|
|
||||||
local distmin=nil
|
|
||||||
for i,_transportzone in pairs(self.tzCombos) do
|
for i,_transportzone in pairs(self.tzCombos) do
|
||||||
local tz=_transportzone --#OPSTRANSPORT.TransportZoneCombo
|
local tz=_transportzone --#OPSTRANSPORT.TransportZoneCombo
|
||||||
|
|
||||||
@@ -2078,31 +2133,58 @@ function OPSTRANSPORT:_GetTransportZoneCombo(Carrier)
|
|||||||
-- 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))
|
|
||||||
|
|
||||||
-- At least one group in the zone.
|
-- At least one group in the zone.
|
||||||
if ncargo>=1 then
|
if ncargo>=1 then
|
||||||
|
|
||||||
-- Distance to the carrier in meters.
|
-- 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
|
local ncarriers=0
|
||||||
distmin=dist
|
for _,_carrier in pairs(self.carriers) do
|
||||||
pickup=tz
|
local carrier=_carrier --Ops.OpsGroup#OPSGROUP
|
||||||
|
if carrier and carrier:IsAlive() and carrier.cargoTZC and carrier.cargoTZC.uid==tz.uid then
|
||||||
|
ncarriers=ncarriers+1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- New candidate.
|
||||||
|
local candidate={tzc=tz, distance=dist/1000, ncargo=ncargo, ncarriers=ncarriers}
|
||||||
|
|
||||||
|
-- Calculdate penalty of candidate.
|
||||||
|
candidate.penalty=penalty(candidate)
|
||||||
|
|
||||||
|
-- Add candidate.
|
||||||
|
table.insert(candidates, candidate)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Debug info.
|
if #candidates>0 then
|
||||||
if pickup then
|
|
||||||
self:T(self.lid..string.format("Found pickupzone %s for carrier group %s", pickup.PickupZone:GetName(), Carrier:GetName()))
|
-- Minimize penalty.
|
||||||
|
local function optTZC(candA, candB)
|
||||||
|
return candA.penalty<candB.penalty
|
||||||
|
end
|
||||||
|
table.sort(candidates, optTZC)
|
||||||
|
|
||||||
|
-- Debug output.
|
||||||
|
if self.verbose>=3 then
|
||||||
|
local text="TZC optimized"
|
||||||
|
for i,candidate in pairs(candidates) do
|
||||||
|
text=text..string.format("\n[%d] TPZ=%d, Ncarriers=%d, Ncargo=%d, Distance=%.1f km, PENALTY=%d", i, candidate.tzc.uid, candidate.ncarriers, candidate.ncargo, candidate.distance, candidate.penalty)
|
||||||
|
end
|
||||||
|
self:I(self.lid..text)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Return best candidate.
|
||||||
|
return candidates[1].tzc
|
||||||
else
|
else
|
||||||
|
-- No candidates.
|
||||||
self:T(self.lid..string.format("Could NOT find a pickup zone (with cargo) for carrier group %s", Carrier:GetName()))
|
self:T(self.lid..string.format("Could NOT find a pickup zone (with cargo) for carrier group %s", Carrier:GetName()))
|
||||||
end
|
end
|
||||||
|
|
||||||
return pickup
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Get an OPSGROUP from a given OPSGROUP or GROUP object. If the object is a GROUUP, an OPSGROUP is created automatically.
|
--- Get an OPSGROUP from a given OPSGROUP or GROUP object. If the object is a GROUUP, an OPSGROUP is created automatically.
|
||||||
|
|||||||
Reference in New Issue
Block a user