mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
303 lines
10 KiB
Lua
303 lines
10 KiB
Lua
--- **Ops** - Brigade Warehouse.
|
|
--
|
|
-- **Main Features:**
|
|
--
|
|
-- * Manage platoons
|
|
--
|
|
-- ===
|
|
--
|
|
-- ### Author: **funkyfranky**
|
|
--
|
|
-- @module Ops.Brigade
|
|
-- @image OPS_Brigade.png
|
|
|
|
|
|
--- BRIGADE class.
|
|
-- @type BRIGADE
|
|
-- @field #string ClassName Name of the class.
|
|
-- @field #number verbose Verbosity of output.
|
|
-- @field Ops.General#GENERAL general The genral responsible for this brigade.
|
|
-- @extends Ops.Legion#LEGION
|
|
|
|
--- Be surprised!
|
|
--
|
|
-- ===
|
|
--
|
|
-- # The BRIGADE Concept
|
|
--
|
|
-- An BRIGADE consists of multiple PLATOONS. These platoons "live" in a WAREHOUSE that has a phyiscal struction (STATIC or UNIT) and can be captured or destroyed.
|
|
--
|
|
--
|
|
-- @field #BRIGADE
|
|
BRIGADE = {
|
|
ClassName = "BRIGADE",
|
|
verbose = 3,
|
|
genral = nil,
|
|
}
|
|
|
|
|
|
--- BRIGADE class version.
|
|
-- @field #string version
|
|
BRIGADE.version="0.0.1"
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- ToDo list
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
-- TODO: A lot!
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Constructor
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--- Create a new BRIGADE class object.
|
|
-- @param #BRIGADE self
|
|
-- @param #string WarehouseName Name of the warehouse STATIC or UNIT object representing the warehouse.
|
|
-- @param #string BrigadeName Name of the brigade.
|
|
-- @return #BRIGADE self
|
|
function BRIGADE:New(WarehouseName, BrigadeName)
|
|
|
|
-- Inherit everything from LEGION class.
|
|
local self=BASE:Inherit(self, LEGION:New(WarehouseName, BrigadeName)) -- #BRIGADE
|
|
|
|
-- Nil check.
|
|
if not self then
|
|
BASE:E(string.format("ERROR: Could not find warehouse %s!", WarehouseName))
|
|
return nil
|
|
end
|
|
|
|
-- Set some string id for output to DCS.log file.
|
|
self.lid=string.format("BRIGADE %s | ", self.alias)
|
|
|
|
-- Add FSM transitions.
|
|
-- From State --> Event --> To State
|
|
self:AddTransition("*", "PlatoonAssetReturned", "*") -- An asset returned (from a mission) to the Brigade warehouse.
|
|
|
|
return self
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- User Functions
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--- Add a platoon to the brigade.
|
|
-- @param #BRIGADE self
|
|
-- @param Ops.Platoon#PLATOON Platoon The platoon object.
|
|
-- @return #BRIGADE self
|
|
function BRIGADE:AddPlatoon(Platoon)
|
|
|
|
-- Add platoon to brigade.
|
|
table.insert(self.cohorts, Platoon)
|
|
|
|
-- Add assets to squadron.
|
|
self:AddAssetToPlatoon(Platoon, Platoon.Ngroups)
|
|
|
|
-- Set airwing to squadron.
|
|
Platoon:SetBrigade(self)
|
|
|
|
-- Start squadron.
|
|
if Platoon:IsStopped() then
|
|
Platoon:Start()
|
|
end
|
|
|
|
return self
|
|
end
|
|
|
|
|
|
|
|
--- Add asset group(s) to platoon.
|
|
-- @param #BRIGADE self
|
|
-- @param Ops.Platoon#PLATOON Platoon The platoon object.
|
|
-- @param #number Nassets Number of asset groups to add.
|
|
-- @return #BRIGADE self
|
|
function BRIGADE:AddAssetToPlatoon(Platoon, Nassets)
|
|
|
|
if Platoon then
|
|
|
|
-- Get the template group of the squadron.
|
|
local Group=GROUP:FindByName(Platoon.templatename)
|
|
|
|
if Group then
|
|
|
|
-- Debug text.
|
|
local text=string.format("Adding asset %s to platoon %s", Group:GetName(), Platoon.name)
|
|
self:T(self.lid..text)
|
|
|
|
-- Add assets to airwing warehouse.
|
|
self:AddAsset(Group, Nassets, nil, nil, nil, nil, Platoon.skill, Platoon.livery, Platoon.name)
|
|
|
|
else
|
|
self:E(self.lid.."ERROR: Group does not exist!")
|
|
end
|
|
|
|
else
|
|
self:E(self.lid.."ERROR: Squadron does not exit!")
|
|
end
|
|
|
|
return self
|
|
end
|
|
|
|
--- Get platoon by name.
|
|
-- @param #BRIGADE self
|
|
-- @param #string PlatoonName Name of the platoon.
|
|
-- @return Ops.Platoon#PLATOON The Platoon object.
|
|
function BRIGADE:GetPlatoon(PlatoonName)
|
|
local platoon=self:_GetCohort(PlatoonName)
|
|
return platoon
|
|
end
|
|
|
|
--- Get platoon of an asset.
|
|
-- @param #BRIGADE self
|
|
-- @param Ops.Warehouse#WAREHOUSE.Assetitem Asset The platoon asset.
|
|
-- @return Ops.Platoon#PLATOON The platoon object.
|
|
function BRIGADE:GetPlatoonOfAsset(Asset)
|
|
local platoon=self:GetPlatoon(Asset.squadname)
|
|
return platoon
|
|
end
|
|
|
|
--- Remove asset from squadron.
|
|
-- @param #BRIGADE self
|
|
-- @param #BRIGADE.SquadronAsset Asset The squad asset.
|
|
function BRIGADE:RemoveAssetFromPlatoon(Asset)
|
|
local squad=self:GetPlatoonOfAsset(Asset)
|
|
if squad then
|
|
squad:DelAsset(Asset)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- FSM Functions
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--- Start BRIGADE FSM.
|
|
-- @param #BRIGADE self
|
|
function BRIGADE:onafterStart(From, Event, To)
|
|
|
|
-- Start parent Warehouse.
|
|
self:GetParent(self, BRIGADE).onafterStart(self, From, Event, To)
|
|
|
|
-- Info.
|
|
self:I(self.lid..string.format("Starting BRIGADE v%s", BRIGADE.version))
|
|
|
|
end
|
|
|
|
--- Update status.
|
|
-- @param #BRIGADE self
|
|
function BRIGADE:onafterStatus(From, Event, To)
|
|
|
|
-- Status of parent Warehouse.
|
|
self:GetParent(self).onafterStatus(self, From, Event, To)
|
|
|
|
local fsmstate=self:GetState()
|
|
|
|
env.info("FF Brigade status "..fsmstate)
|
|
|
|
-- General info:
|
|
if self.verbose>=1 then
|
|
|
|
-- Count missions not over yet.
|
|
local Nmissions=self:CountMissionsInQueue()
|
|
|
|
-- Assets tot
|
|
local Npq, Np, Nq=self:CountAssetsOnMission()
|
|
|
|
local assets=string.format("%d (OnMission: Total=%d, Active=%d, Queued=%d)", self:CountAssets(), Npq, Np, Nq)
|
|
|
|
-- Output.
|
|
local text=string.format("%s: Missions=%d, Squads=%d, Assets=%s", fsmstate, Nmissions, #self.cohorts, assets)
|
|
self:I(self.lid..text)
|
|
end
|
|
|
|
------------------
|
|
-- Mission Info --
|
|
------------------
|
|
if self.verbose>=2 then
|
|
local text=string.format("Missions Total=%d:", #self.missionqueue)
|
|
for i,_mission in pairs(self.missionqueue) do
|
|
local mission=_mission --Ops.Auftrag#AUFTRAG
|
|
|
|
local prio=string.format("%d/%s", mission.prio, tostring(mission.importance)) ; if mission.urgent then prio=prio.." (!)" end
|
|
local assets=string.format("%d/%d", mission:CountOpsGroups(), mission.nassets)
|
|
local target=string.format("%d/%d Damage=%.1f", mission:CountMissionTargets(), mission:GetTargetInitialNumber(), mission:GetTargetDamage())
|
|
|
|
text=text..string.format("\n[%d] %s %s: Status=%s, Prio=%s, Assets=%s, Targets=%s", i, mission.name, mission.type, mission.status, prio, assets, target)
|
|
end
|
|
self:I(self.lid..text)
|
|
end
|
|
|
|
-------------------
|
|
-- Squadron Info --
|
|
-------------------
|
|
if self.verbose>=3 then
|
|
local text="Platoons:"
|
|
for i,_squadron in pairs(self.cohorts) do
|
|
local squadron=_squadron --Ops.Squadron#SQUADRON
|
|
|
|
local callsign=squadron.callsignName and UTILS.GetCallsignName(squadron.callsignName) or "N/A"
|
|
local modex=squadron.modex and squadron.modex or -1
|
|
local skill=squadron.skill and tostring(squadron.skill) or "N/A"
|
|
|
|
-- Squadron text
|
|
text=text..string.format("\n* %s %s: %s*%d/%d, Callsign=%s, Modex=%d, Skill=%s", squadron.name, squadron:GetState(), squadron.aircrafttype, squadron:CountAssets(true), #squadron.assets, callsign, modex, skill)
|
|
end
|
|
self:I(self.lid..text)
|
|
end
|
|
|
|
----------------
|
|
-- Transport ---
|
|
----------------
|
|
|
|
-- Check if any transports should be cancelled.
|
|
--self:_CheckTransports()
|
|
|
|
-- Get next mission.
|
|
local transport=self:_GetNextTransport()
|
|
|
|
-- Request mission execution.
|
|
if transport then
|
|
self:TransportRequest(transport)
|
|
end
|
|
|
|
--------------
|
|
-- Mission ---
|
|
--------------
|
|
|
|
-- Check if any missions should be cancelled.
|
|
self:_CheckMissions()
|
|
|
|
-- Get next mission.
|
|
local mission=self:_GetNextMission()
|
|
|
|
-- Request mission execution.
|
|
if mission then
|
|
self:MissionRequest(mission)
|
|
end
|
|
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- FSM Functions
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--- On after "ArmyOnMission".
|
|
-- @param #BRIGADE self
|
|
-- @param #string From From state.
|
|
-- @param #string Event Event.
|
|
-- @param #string To To state.
|
|
-- @param Ops.ArmyGroup#ARMYGROUP ArmyGroup Ops army group on mission.
|
|
-- @param Ops.Auftrag#AUFTRAG Mission The requested mission.
|
|
function BRIGADE:onafterArmyOnMission(From, Event, To, ArmyGroup, Mission)
|
|
local armygroup=ArmyGroup --Ops.ArmyGroup#ARMYGROUP
|
|
local mission=Mission --Ops.Auftrag#AUFTRAG
|
|
|
|
-- Debug info.
|
|
self:T(self.lid..string.format("Group %s on %s mission %s", armygroup:GetName(), mission:GetType(), mission:GetName()))
|
|
|
|
|
|
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|