diff --git a/Moose Development/Moose/Functional/Warehouse.lua b/Moose Development/Moose/Functional/Warehouse.lua index ea60abe46..d0f262f88 100644 --- a/Moose Development/Moose/Functional/Warehouse.lua +++ b/Moose Development/Moose/Functional/Warehouse.lua @@ -3340,7 +3340,6 @@ function WAREHOUSE:FindAssetInDB(group) if aid~=nil then local asset=_WAREHOUSEDB.Assets[aid] - self:T2({asset=asset}) if asset==nil then self:_ErrorMessage(string.format("ERROR: Asset for group %s not found in the data base!", group:GetName()), 0) end @@ -4446,7 +4445,6 @@ end -- @param #WAREHOUSE.Queueitem Request Information table of the request. -- @return #boolean If true, request is granted. function WAREHOUSE:onbeforeRequest(From, Event, To, Request) - self:T3({warehouse=self.alias, request=Request}) -- Distance from warehouse to requesting warehouse. local distance=self:GetCoordinate():Get2DDistance(Request.warehouse:GetCoordinate()) @@ -6153,9 +6151,6 @@ function WAREHOUSE:_SpawnAssetAircraft(alias, asset, request, parking, uncontrol -- Uncontrolled spawning. template.uncontrolled=uncontrolled - -- Debug info. - --self:T2({airtemplate=template}) - -- Spawn group. local group=_DATABASE:Spawn(template) --Wrapper.Group#GROUP diff --git a/Moose Development/Moose/Ops/ArmyGroup.lua b/Moose Development/Moose/Ops/ArmyGroup.lua index 9e21b02af..608a1c004 100644 --- a/Moose Development/Moose/Ops/ArmyGroup.lua +++ b/Moose Development/Moose/Ops/ArmyGroup.lua @@ -1841,8 +1841,6 @@ function ARMYGROUP:_UpdateEngageTarget() -- Check if target moved more than 100 meters or we do not have line of sight. if dist>100 or los==false then - --env.info("FF Update Engage Target Moved "..self.engage.Target:GetName()) - -- Update new position. self.engage.Coordinate:UpdateFromVec3(vec3) @@ -1852,13 +1850,14 @@ function ARMYGROUP:_UpdateEngageTarget() -- Remove current waypoint self:RemoveWaypointByID(self.engage.Waypoint.uid) - local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.9) + -- Get new coordinate where to go. + local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.95) -- Add waypoint after current. self.engage.Waypoint=self:AddWaypoint(intercoord, self.engage.Speed, uid, self.engage.Formation, true) -- Set if we want to resume route after reaching the detour waypoint. - self.engage.Waypoint.detour=0 + self.engage.Waypoint.detour=1 end diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 689783f60..6e58b56d3 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -324,6 +324,10 @@ -- -- A ground attack mission can be created with the @{#AUFTRAG.NewGROUNDATTACK}() function. -- +-- ## NAVALENGAGEMENT +-- +-- A naval engagement mission can be created with the @{#AUFTRAG.NewNAVALENGAGEMENT}() function. +-- -- # Assigning Missions -- -- An AUFTRAG can be assigned to groups (FLIGHTGROUP, ARMYGROUP, NAVYGROUP), legions (AIRWING, BRIGADE, FLEET) or to a COMMANDER. @@ -443,6 +447,7 @@ _AUFTRAGSNR=0 -- @field #string HOVER Hover. -- @field #string LANDATCOORDINATE Land at coordinate. -- @field #string GROUNDATTACK Ground attack. +-- @field #string NAVALENGAGEMENT Naval engagement (similar to GROUNDATTACK). -- @field #string CARGOTRANSPORT Cargo transport. -- @field #string RELOCATECOHORT Relocate a cohort from one legion to another. -- @field #string AIRDEFENSE Air defense. @@ -491,6 +496,7 @@ AUFTRAG.Type={ HOVER="Hover", LANDATCOORDINATE="Land at Coordinate", GROUNDATTACK="Ground Attack", + NAVALENGAGEMENT="Naval Engagement", CARGOTRANSPORT="Cargo Transport", RELOCATECOHORT="Relocate Cohort", AIRDEFENSE="Air Defence", @@ -515,6 +521,7 @@ AUFTRAG.Type={ -- @field #string BARRAGE Barrage. -- @field #string HOVER Hover. -- @field #string GROUNDATTACK Ground attack. +-- @field #string NAVALENGAGEMENT Naval engagement. -- @field #string FERRY Ferry mission. -- @field #string RELOCATECOHORT Relocate cohort. -- @field #string AIRDEFENSE Air defense. @@ -537,6 +544,7 @@ AUFTRAG.SpecialTask={ ARMORATTACK="AmorAttack", HOVER="Hover", GROUNDATTACK="Ground Attack", + NAVALENGAGEMENT="Naval Engagement", FERRY="Ferry", RELOCATECOHORT="Relocate Cohort", AIRDEFENSE="Air Defense", @@ -666,7 +674,7 @@ AUFTRAG.Category={ --- AUFTRAG class version. -- @field #string version -AUFTRAG.version="1.2.1" +AUFTRAG.version="1.3.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -2382,11 +2390,13 @@ function AUFTRAG:NewARMORATTACK(Target, Speed, Formation) return mission end ---- **[GROUND]** Create a GROUNDATTACK mission. Ground group(s) will go to a target object and attack. +--- **[GROUND]** Create a GROUNDATTACK mission. Ground group(s) will go to a target object and attack at their own discretion. +-- Unfortunately, the "Attack Group" and "Attack Unit" tasks do not work for ground and naval groups (only for aircraft). +-- Therefore, we resort to this workaround, which guides the attacking group to the vicinity of the target. Then they start shooting on their own, once they detect the target. -- @param #AUFTRAG self -- @param Wrapper.Positionable#POSITIONABLE Target The target to attack. Can be a GROUP, UNIT or STATIC object. -- @param #number Speed Speed in knots. Default max. --- @param #string Formation The attack formation, e.g. "Wedge", "Vee" etc. Default `ENUMS.Formation.Vehicle.Vee`. +-- @param #string Formation The attack formation, e.g. "Wedge", "Vee" etc. Default `ENUMS.Formation.Vehicle.Vee`. Only working for ground, not naval! -- @return #AUFTRAG self function AUFTRAG:NewGROUNDATTACK(Target, Speed, Formation) @@ -2413,6 +2423,38 @@ function AUFTRAG:NewGROUNDATTACK(Target, Speed, Formation) return mission end +--- **[NAVAL]** Create a NAVALENGAGEMENT mission. Naval group(s) will go to a target object and attack at their own discretion. +-- Unfortunately, the "Attack Group" and "Attack Unit" tasks do not work for ground and naval groups (only for aircraft). +-- Therefore, we resort to this workaround, which guides the attacking group to the vicinity of the target. Then they start shooting on their own, once they detect the target. +-- @param #AUFTRAG self +-- @param Wrapper.Positionable#POSITIONABLE Target The target to attack. Can be a GROUP, UNIT or STATIC object. +-- @param #number Speed Speed in knots. Default max. +-- @param #number Depth The attack depth in meters. Only for submarines! +-- @return #AUFTRAG self +function AUFTRAG:NewNAVALENGAGEMENT(Target, Speed, Depth) + + local mission=AUFTRAG:New(AUFTRAG.Type.NAVALENGAGEMENT) + + mission:_TargetFromObject(Target) + + mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.NAVALENGAGEMENT) + + -- Defaults. + mission.optionROE=ENUMS.ROE.OpenFire + mission.optionAlarm=ENUMS.AlarmState.Auto + mission.missionFraction=0.70 + mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed) or nil + mission.missionAltitude=Depth or 0 + + mission.categories={AUFTRAG.Category.NAVAL} + + mission.DCStask=mission:GetDCSMissionTask() + + mission.DCStask.params.speed=mission.missionSpeed and UTILS.KmphToMps(mission.missionSpeed) or nil + + return mission +end + --- **[AIR, GROUND, NAVAL]** Create a RECON mission. -- @param #AUFTRAG self -- @param Core.Set#SET_ZONE ZoneSet The recon zones. @@ -6652,6 +6694,26 @@ function AUFTRAG:GetDCSMissionTask() table.insert(DCStasks, DCStask) + elseif self.type==AUFTRAG.Type.NAVALENGAGEMENT then + + --------------------------- + -- NAVAL ENGAGEMENT Mission -- + --------------------------- + + local DCStask={} + + DCStask.id=AUFTRAG.SpecialTask.NAVALENGAGEMENT + + -- We create a "fake" DCS task and pass the parameters to the NAVYGROUP. + local param={} + param.target=self:GetTargetData() + param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed) or nil + param.altitude=self.missionAltitude or 0 + + DCStask.params=param + + table.insert(DCStasks, DCStask) + elseif self.type==AUFTRAG.Type.AMMOSUPPLY then ------------------------- diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index 3e9f46561..9500ae313 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -35,7 +35,7 @@ -- @field #number Nsuccess Number of successful missions. -- @field #number Nfailure Number of failed mission. -- @field #table assetNumbers Asset numbers. Each entry is a table of data type `#CHIEF.AssetNumber`. --- @extends Ops.Intel#INTEL +-- @extends Ops.Intelligence#INTEL --- *In preparing for battle I have always found that plans are useless, but planning is indispensable* -- Dwight D Eisenhower -- @@ -48,7 +48,7 @@ -- -- # Territory -- --- The chief class allows you to define boarder zones, conflict zones and attack zones. +-- The chief class allows you to define border zones, conflict zones and attack zones. -- -- ## Border Zones -- @@ -332,7 +332,7 @@ CHIEF.Strategy = { --- CHIEF class version. -- @field #string version -CHIEF.version="0.6.1" +CHIEF.version="0.7.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -2897,6 +2897,8 @@ function CHIEF:_GetMissionPerformanceFromTarget(Target) table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.ARTY, 30)) else + + -- Everything else table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.BAI, 100)) table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK, 50)) @@ -2912,6 +2914,8 @@ function CHIEF:_GetMissionPerformanceFromTarget(Target) --- table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.ANTISHIP, 100)) + table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.NAVALENGAGEMENT, 50)) + table.insert(missionperf, self:_CreateMissionPerformance(AUFTRAG.Type.ARTY, 30)) else self:E(self.lid.."ERROR: Unknown Group category!") diff --git a/Moose Development/Moose/Ops/NavyGroup.lua b/Moose Development/Moose/Ops/NavyGroup.lua index 85f03853d..24860af03 100644 --- a/Moose Development/Moose/Ops/NavyGroup.lua +++ b/Moose Development/Moose/Ops/NavyGroup.lua @@ -86,12 +86,14 @@ NAVYGROUP = { -- @field Ops.Target#TARGET Target The target. -- @field Core.Point#COORDINATE Coordinate Last known coordinate of the target. -- @field Ops.OpsGroup#OPSGROUP.Waypoint Waypoint the waypoint created to go to the target. +-- @field #number Speed Speed in knots. +-- @field #number Depth Depth of the engagement (submarines). -- @field #number roe ROE backup. -- @field #number alarmstate Alarm state backup. --- NavyGroup version. -- @field #string version -NAVYGROUP.version="1.0.3" +NAVYGROUP.version="1.0.4" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -1602,8 +1604,10 @@ end -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. --- @param Wrapper.Group#GROUP Group the group to be engaged. -function NAVYGROUP:onafterEngageTarget(From, Event, To, Target) +-- @param Ops.Target#TARGET Target The target to be engaged. Can also be a GROUP or UNIT object. +-- @param #number Speed Attack speed in knots. +-- @param #number Depth The depth in meters. Only for submarins. +function NAVYGROUP:onafterEngageTarget(From, Event, To, Target, Speed, Depth) self:T(self.lid.."Engaging Target") if Target:IsInstanceOf("TARGET") then @@ -1615,11 +1619,9 @@ function NAVYGROUP:onafterEngageTarget(From, Event, To, Target) -- Target coordinate. self.engage.Coordinate=UTILS.DeepCopy(self.engage.Target:GetCoordinate()) - - local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.9) + -- Get a coordinate close to the target. + local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.8) - - -- Backup ROE and alarm state. self.engage.roe=self:GetROE() self.engage.alarmstate=self:GetAlarmstate() @@ -1629,11 +1631,17 @@ function NAVYGROUP:onafterEngageTarget(From, Event, To, Target) self:SwitchROE(ENUMS.ROE.OpenFire) -- ID of current waypoint. - local uid=self:GetWaypointCurrent().uid + local uid=self:GetWaypointCurrentUID() + + -- Set formation. + self.engage.Depth=Depth or 0 + + -- Set speed. + self.engage.Speed=Speed -- Add waypoint after current. - self.engage.Waypoint=self:AddWaypoint(intercoord, nil, uid, Formation, true) - + self.engage.Waypoint=self:AddWaypoint(intercoord, Speed, uid, Depth, true) + -- Set if we want to resume route after reaching the detour waypoint. self.engage.Waypoint.detour=1 @@ -1656,24 +1664,22 @@ function NAVYGROUP:_UpdateEngageTarget() -- Check if target moved more than 100 meters. if dist>100 then - --env.info("FF Update Engage Target Moved "..self.engage.Target:GetName()) - -- Update new position. self.engage.Coordinate:UpdateFromVec3(vec3) -- ID of current waypoint. - local uid=self:GetWaypointCurrent().uid + local uid=self:GetWaypointCurrentUID() -- Remove current waypoint self:RemoveWaypointByID(self.engage.Waypoint.uid) - local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.9) + local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate, 0.8) -- Add waypoint after current. - self.engage.Waypoint=self:AddWaypoint(intercoord, nil, uid, Formation, true) + self.engage.Waypoint=self:AddWaypoint(intercoord, self.engage.Speed, uid, self.engage.Depth, true) -- Set if we want to resume route after reaching the detour waypoint. - self.engage.Waypoint.detour=0 + self.engage.Waypoint.detour=1 end @@ -1709,8 +1715,8 @@ function NAVYGROUP:onafterDisengage(From, Event, To) local task=self:GetTaskCurrent() -- Get if current task is ground attack. - if task and task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK then - self:T(self.lid.."Disengage with current task GROUNDATTACK ==> Task Done!") + if task and (task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK or task.dcstask.id==AUFTRAG.SpecialTask.NAVALENGAGEMENT) then + self:T(self.lid.."Disengage with current task GROUNDATTACK/NAVALENGAGEMENT ==> Task Done!") self:TaskDone(task) end diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index ab20523d1..a1ea2fb68 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -1189,8 +1189,8 @@ function OPSGROUP:GetDCSObject() return self.dcsgroup end ---- Set detection on or off. --- If detection is on, detected targets of the group will be evaluated and FSM events triggered. +--- Make a target (unit, group, opsgroup) known to this group. +-- This is useing the DCS function `controller.knowTarget`. -- @param #OPSGROUP self -- @param Wrapper.Positionable#POSITIONABLE TargetObject The target object. -- @param #boolean KnowType Make type known. @@ -4513,6 +4513,25 @@ function OPSGROUP:_UpdateTask(Task, Mission) if target then self:EngageTarget(target, speed, Task.dcstask.params.formation) end + + elseif Task.dcstask.id==AUFTRAG.SpecialTask.NAVALENGAGEMENT then + + --- + -- Task "Naval Engagement" Mission. + --- + + -- Engage target. + local target=Task.dcstask.params.target --Ops.Target#TARGET + + -- Set speed. Default max. + local speed=self.speedMax and UTILS.KmphToKnots(self.speedMax) or nil + if Task.dcstask.params.speed then + speed=UTILS.MpsToKnots(Task.dcstask.params.speed) + end + + if target then + self:EngageTarget(target, speed, Task.dcstask.params.altitude) + end elseif Task.dcstask.id==AUFTRAG.SpecialTask.PATROLRACETRACK then @@ -4886,7 +4905,7 @@ function OPSGROUP:onafterTaskCancel(From, Event, To, Task) done=true elseif Task.dcstask.id==AUFTRAG.SpecialTask.ONGUARD or Task.dcstask.id==AUFTRAG.SpecialTask.ARMOREDGUARD then done=true - elseif Task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK or Task.dcstask.id==AUFTRAG.SpecialTask.ARMORATTACK then + elseif Task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK or Task.dcstask.id==AUFTRAG.SpecialTask.ARMORATTACK or Task.dcstask.id==AUFTRAG.SpecialTask.NAVALENGAGEMENT then done=true elseif Task.dcstask.id==AUFTRAG.SpecialTask.NOTHING then done=true