From 3f8efae23fd90995b93a759f335672208b782fe2 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 31 Oct 2022 13:26:35 +0100 Subject: [PATCH] Update Chief.lua resources --- Moose Development/Moose/Ops/Chief.lua | 228 +++++++++++++++++++++----- 1 file changed, 187 insertions(+), 41 deletions(-) diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index c4ec3c6b3..a79b5f738 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -300,10 +300,14 @@ CHIEF.Strategy = { -- @field Ops.OpsZone#OPSZONE opszone OPS zone. -- @field #number prio Priority. -- @field #number importance Importance. --- @field #table resourceEmpty Resource list. --- @field #table resourceOccup Resource list. +-- @field #CHIEF.Resources resourceEmpty List of resources employed when the zone is empty. +-- @field #CHIEF.Resources resourceOccup List of resources employed when the zone is occupied by an enemy. -- @field #table missions Mission. +--- Resource list. +-- @type CHIEF.Resources +-- @field <#CHIEF.Resource> List of resources. + --- Resource. -- @type CHIEF.Resource -- @field #string MissionType Mission type, e.g. `AUFTRAG.Type.BAI`. @@ -314,6 +318,10 @@ CHIEF.Strategy = { -- @field Ops.Auftrag#AUFTRAG mission Attached mission. -- @field #number carrierNmin Min number of assets. -- @field #number carrierNmax Max number of assets. +-- @field #table cargoCategories Group categories. +-- @field #table cargoAttributes Generalized attribute, e.g. `{GROUP.Attribute.GROUND_INFANTRY}`. +-- @field #table cargoProperties Properties ([DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes)), e.g. `"Attack helicopters"` or `"Mobile AAA"`. +-- @field #table carrierCategories Group categories. -- @field #table carrierAttributes Generalized attribute, e.g. `{GROUP.Attribute.GROUND_INFANTRY}`. -- @field #table carrierProperties Properties ([DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes)), e.g. `"Attack helicopters"` or `"Mobile AAA"`. @@ -743,25 +751,26 @@ end -- @param #number Nmax Max number of requried assets. Default 1. -- @param #table Attributes Generalized attribute(s). Default `nil`. -- @param #table Properties DCS attribute(s). Default `nil`. --- @return #table The resource object. +-- @return #CHIEF.Resources The newly created resource list table. +-- @return #CHIEF.Resource The resource object that was added. function CHIEF:CreateResource(MissionType, Nmin, Nmax, Attributes, Properties) - local resource={} + local resources={} - self:AddToResource(resource, MissionType, Nmin, Nmax, Attributes, Properties) + local resource=self:AddToResource(resources, MissionType, Nmin, Nmax, Attributes, Properties) - return resource + return resources, resource end --- Add mission type and number of required assets to resource. -- @param #CHIEF self --- @param #table Resource Resource table. +-- @param #CHIEF.Resources Resource Resource list. -- @param #string MissionType Mission Type. -- @param #number Nmin Min number of required assets. -- @param #number Nmax Max number of requried assets. -- @param #table Attributes Generalized attribute(s). -- @param #table Properties DCS attribute(s). Default `nil`. --- @return #CHIEF self +-- @return #CHIEF.Resource Resource table. function CHIEF:AddToResource(Resource, MissionType, Nmin, Nmax, Attributes, Properties) -- Create new resource table. @@ -773,10 +782,14 @@ function CHIEF:AddToResource(Resource, MissionType, Nmin, Nmax, Attributes, Prop resource.Properties=UTILS.EnsureTable(Properties) -- Transport carrier parameters. + resource.cargoAttributes=nil + resource.cargoProperties=nil + resource.cargoCategories=nil resource.carrierNmin=nil resource.carrierNmax=nil resource.carrierAttributes=nil resource.carrierProperties=nil + resource.carrierCategories=nil -- Add to table. table.insert(Resource, resource) @@ -791,25 +804,31 @@ function CHIEF:AddToResource(Resource, MissionType, Nmin, Nmax, Attributes, Prop self:I(self.lid..text) end - return self + return resource end ---- Set that assets will be transported and define the number and attributes/properties of the cargo carrier assets. +--- Define which assets will be transported and define the number and attributes/properties of the cargo carrier assets. -- @param #CHIEF self --- @param #table Resource Resource table. --- @param #number Nmin Min number of required assets. --- @param #number Nmax Max number of requried assets. --- @param #table Categories Generalized attribute(s). --- @param #table Attributes Generalized attribute(s). --- @param #table Properties DCS attribute(s). Default `nil`. +-- @param #CHIEF.Resource Resource Resource table. +-- @param #table CargoAttributes Generalized attribute(s) of the cargo assets. +-- @param #table CargoProperties DCS attribute(s) of the cargo assets. +-- @param #table CargoCategories Group categories of the cargo assets. +-- @param #number Nmin Min number of required assets. Default 1. +-- @param #number Nmax Max number of requried assets. Default 1. +-- @param #table CarrierAttributes Generalized attribute(s) of the carrier assets. +-- @param #table CarrierProperties DCS attribute(s) of the carrier assets. +-- @param #table CarrierCategories Group categories of the carrier assets. -- @return #CHIEF self -function CHIEF:AddTransportToResource(Resource, Nmin, Nmax, Categories, Attributes, Properties) +function CHIEF:AddTransportToResource(Resource, CargoAttributes, CargoProperties, CargoCategories, Nmin, Nmax, CarrierAttributes, CarrierProperties, CarrierCategories) - Resource.carrierNmin=Nmin - Resource.carrierNmax=Nmin - Resource.carrierCategories=UTILS.EnsureTable(Categories) - Resource.carrierAttributes=UTILS.EnsureTable(Attributes) - Resource.carrierProperties=UTILS.EnsureTable(Properties) + Resource.cargoCategories=CargoCategories + Resource.cargoAttributes=CargoAttributes + Resource.cargoProperties=CargoProperties + Resource.carrierNmin=Nmin or 1 + Resource.carrierNmax=Nmin or 1 + Resource.carrierCategories=CarrierCategories + Resource.carrierAttributes=CarrierAttributes + Resource.carrierProperties=CarrierProperties return self end @@ -1216,17 +1235,17 @@ end -- -- Empty: -- --- * `AUFTRAG.Type.ONGUARD` with Nmin=1 and Nmax=3 assets, Attribute=`GROUP.Attribute.GROUND_INFANTRY`. -- * `AUFTRAG.Type.ONGURAD` with Nmin=1 and Nmax=1 assets, Attribute=`GROUP.Attribute.GROUND_TANK`. +-- * `AUFTRAG.Type.ONGUARD` with Nmin=1 and Nmax=3 assets, Attribute=`GROUP.Attribute.GROUND_INFANTRY`. -- -- Resources can be created with the @{#CHIEF.CreateResource} and @{#CHIEF.AddToResource} functions. -- -- @param #CHIEF self -- @param Ops.OpsZone#OPSZONE OpsZone OPS zone object. -- @param #number Priority Priority. Default 50. --- @param #number Importance Importance. Default nil. --- @param #CHIEF.Resource ResourceOccupied (Optional) Resources used then zone is occupied by the enemy. --- @param #CHIEF.Resource ResourceEmpty (Optional) Resources used then zone is empty. +-- @param #number Importance Importance. Default `#nil`. +-- @param #CHIEF.Resources ResourceOccupied (Optional) Resources used then zone is occupied by the enemy. +-- @param #CHIEF.Resources ResourceEmpty (Optional) Resources used then zone is empty. -- @return #CHIEF.StrategicZone The strategic zone. function CHIEF:AddStrategicZone(OpsZone, Priority, Importance, ResourceOccupied, ResourceEmpty) @@ -1255,8 +1274,10 @@ function CHIEF:AddStrategicZone(OpsZone, Priority, Importance, ResourceOccupied, if ResourceEmpty then stratzone.resourceEmpty=UTILS.DeepCopy(ResourceEmpty) else - stratzone.resourceEmpty=self:CreateResource(AUFTRAG.Type.ONGUARD, 1, 3, GROUP.Attribute.GROUND_INFANTRY) - self:AddToResource(stratzone.resourceEmpty, AUFTRAG.Type.ONGUARD, 1, 1, GROUP.Attribute.GROUND_TANK) + local resourceEmpty, resourceInfantry=self:CreateResource(AUFTRAG.Type.ONGUARD, 1, 1, GROUP.Attribute.GROUND_INFANTRY) + self:AddToResource(resourceEmpty, AUFTRAG.Type.ONGUARD, 1, 1, GROUP.Attribute.GROUND_TANK) + self:AddTransportToResource(resourceInfantry, GROUP.Attribute.GROUND_INFANTRY, nil, nil, 1, 1, {GROUP.Attribute.AIR_TRANSPORTHELO, GROUP.Attribute.GROUND_APC}) + stratzone.resourceEmpty=resourceEmpty end -- Add to table. @@ -1487,6 +1508,18 @@ function CHIEF:AddBorderZone(Zone) return self end +--- Remove a zone defining your territory. +-- @param #CHIEF self +-- @param Core.Zone#ZONE Zone The zone to be removed. +-- @return #CHIEF self +function CHIEF:RemoveBorderZone(Zone) + + -- Add a border zone. + self.borderzoneset:Remove(Zone:GetName()) + + return self +end + --- Set conflict zone set. -- -- * Detected enemy troops in these zones will trigger defence condition `YELLOW`. @@ -1549,6 +1582,18 @@ function CHIEF:AddAttackZone(Zone) return self end +--- Remove an attack zone. +-- @param #CHIEF self +-- @param Core.Zone#ZONE Zone The zone to be removed. +-- @return #CHIEF self +function CHIEF:RemoveAttackZone(Zone) + + -- Add an attack zone. + self.engagezoneset:Remove(Zone:GetName()) + + return self +end + --- Allow chief to use GROUND units for transport tasks. Helicopters are still preferred, and be aware there's no check as of now -- if a destination can be reached on land. -- @param #CHIEF self @@ -2137,7 +2182,16 @@ function CHIEF:_TacticalOverview() for _,_stratzone in pairs(self.zonequeue) do local stratzone=_stratzone --#CHIEF.StrategicZone local owner=stratzone.opszone:GetOwnerName() - text=text..string.format(" - %s: %s - %s [I=%d, P=%d]\n", stratzone.opszone:GetName(), owner, stratzone.opszone:GetState(), stratzone.importance, stratzone.prio) + text=text..string.format(" - %s: %s - %s [I=%d, P=%d]\n", stratzone.opszone:GetName(), owner, stratzone.opszone:GetState(), stratzone.importance or 0, stratzone.prio or 0) + end + + local Ntransports=#self.commander.transportqueue + if Ntransports>0 then + text=text..string.format("Transports: %d\n", Ntransports) + for _,_transport in pairs(self.commander.transportqueue) do + local transport=_transport --Ops.OpsTransport#OPSTRANSPORT + text=text..string.format(" - %s", transport:GetState()) + end end -- Message to coalition. @@ -2734,6 +2788,7 @@ function CHIEF:_GetMissionPerformanceFromTarget(Target) -- Tanks table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.CAS, 100)) + table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.BAI, 80)) table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK, 50)) table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.ARMORATTACK, 40)) table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.ARTY, 30)) @@ -2895,14 +2950,21 @@ function CHIEF:RecruitAssetsForZone(StratZone, Resource) -- First check if we need a transportation. local transport=nil if Resource.carrierNmin and Resource.carrierNmin>0 then + + -- Filter only those assets that shall be transported. + local cargoassets=CHIEF._FilterAssets(assets, Resource.cargoCategories, Resource.cargoAttributes, Resource.cargoProperties) + + if #cargoassets>0 then - -- Recruit transport assets for infantry. - recruited, transport=LEGION.AssignAssetsForTransport(self.commander, self.commander.legions, assets, - Resource.carrierNmin, Resource.carrierNmin, TargetZone, nil, Resource.carrierCategories, Resource.carrierAttributes) + -- Recruit transport carrier assets. + recruited, transport=LEGION.AssignAssetsForTransport(self.commander, self.commander.legions, cargoassets, + Resource.carrierNmin, Resource.carrierNmin, TargetZone, nil, Resource.carrierCategories, Resource.carrierAttributes) + + end end - + -- Check if everything was recruited. if not recruited then -- No (transport) assets ==> no mission! self:T(self.lid..string.format("Could not allocate assets or transport of OPSZONE!")) @@ -2910,14 +2972,6 @@ function CHIEF:RecruitAssetsForZone(StratZone, Resource) return false end - if transport then - -- Attach OPS transport to mission. - mission.opstransport=transport - -- Set ops zone to transport. - transport.opszone=StratZone.opszone - transport.chief=self - transport.commander=self.commander - end if MissionType==AUFTRAG.Type.PATROLZONE or MissionType==AUFTRAG.Type.ONGUARD then @@ -3059,6 +3113,15 @@ function CHIEF:RecruitAssetsForZone(StratZone, Resource) -- Attach mission to resource. Resource.mission=mission + + if transport then + -- Attach OPS transport to mission. + mission.opstransport=transport + -- Set ops zone to transport. + transport.opszone=StratZone.opszone + transport.chief=self + transport.commander=self.commander + end return true else @@ -3078,6 +3141,89 @@ function CHIEF:RecruitAssetsForZone(StratZone, Resource) return false end +--- Filter assets, which have certain categories, attributes and/or properties. +-- @param #table Assets The assets to be filtered. +-- @param #table Categories Group categories. +-- @param #table Attributes Generalized attributes. +-- @param #table Properties DCS attributes +-- @return #table Table of filtered assets. +function CHIEF._FilterAssets(Assets, Categories, Attributes, Properties) + + local filtered={} + + for _,_asset in pairs(Assets) do + local asset=_asset --Functional.Warehouse#WAREHOUSE.Assetitem + + local hasCat=CHIEF._CheckAssetCategories(asset, Categories) + local hasAtt=CHIEF._CheckAssetAttributes(asset, Attributes) + local hasPro=CHIEF._CheckAssetProperties(asset, Properties) + + if hasAtt and hasCat and hasPro then + table.insert(filtered, asset) + end + + end + + return filtered +end + +--- Check if a given asset has certain attribute(s). +-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset item. +-- @param #table Attributes The required attributes. See `WAREHOUSE.Attribute` enum. Can also be passed as a single attribute `#string`. +-- @return #boolean Returns `true`, the asset has at least one requested attribute. +function CHIEF._CheckAssetAttributes(Asset, Attributes) + + if not Attributes then + return true + end + + for _,attribute in pairs(UTILS.EnsureTable(Attributes)) do + if attribute==Asset.attribute then + return true + end + end + + return false +end + +--- Check if a given asset has certain categories. +-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset item. +-- @param #table Categories DCS group categories. +-- @return #boolean Returns `true`, the asset has at least one requested category. +function CHIEF._CheckAssetCategories(Asset, Categories) + + if not Categories then + return true + end + + for _,attribute in pairs(UTILS.EnsureTable(Categories)) do + if attribute==Asset.category then + return true + end + end + + return false +end + +--- Check if a given asset has certain properties. +-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset item. +-- @param #table Categories DCS group categories. +-- @return #boolean Returns `true`, the asset has at least one requested property. +function CHIEF._CheckAssetProperties(Asset, Properties) + + if not Properties then + return true + end + + for _,attribute in pairs(UTILS.EnsureTable(Properties)) do + if attribute==Asset.DCSdesc then + return true + end + end + + return false +end + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------