diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 8d36a83f3..74f6a4690 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -37,9 +37,6 @@ -- @field #number orbitLeg Length of orbit leg in meters. -- -- @field #AUFTRAG.TargetData engageTarget Target data to engage. --- @field Core.Point#COORDINATE engageCoord Coordinate of target location. --- @field Core.Set#SET_GROUP engageTargetGroupset Set of target groups to attack. --- @field Core.Set#SET_UNIT engageTargetUnitset Set of target units to attack. -- -- @field Core.Zone#ZONE_RADIUS engageZone *Circular* engagement zone. -- @field #table engageTargetTypes Table of target types that are engaged in the engagement zone. @@ -220,7 +217,7 @@ AUFTRAG.TargetType={ --- -- @type AUFTRAG.TargetData -- @field Wrapper.Positionable#POSITIONABLE Target Target Object. --- @field #string Type Target type: "Group", "Unit", "Static", "Vec2" +-- @field #string Type Target type: "Group", "Unit", "Static", "Coordinate" --- Mission success. -- @type AUFTRAG.Success @@ -239,13 +236,13 @@ AUFTRAG.TargetType={ --- AUFTRAG class version. -- @field #string version -AUFTRAG.version="0.0.7" +AUFTRAG.version="0.0.9" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- TODO: Mission ROE and ROT +-- DONE: Mission ROE and ROT. -- TODO: Mission formation, etc. -- DONE: FSM events. -- TODO: F10 marker functions that are updated on Status event. @@ -275,7 +272,7 @@ function AUFTRAG:New(Type) self.auftragsnummer=_AUFTRAGSNR -- Log id. - self.lid=string.format("Auftrag #%d %s | ", self.auftragsnummer, tostring(self.type)) + self:_SetLogID() -- State is planned. self.status=AUFTRAG.Status.PLANNED @@ -284,6 +281,7 @@ function AUFTRAG:New(Type) self:SetName() self:SetPriority() self:SetMissionTime() + self.engageAsGroup=true self.missionRepeated=0 self.missionRepeatMax=0 @@ -334,22 +332,18 @@ end --- Create an ANTI-SHIP mission. -- @param #AUFTRAG self --- @param Core.Set#SET_UNIT TargetUnitSet The set of target units. +-- @param Wrapper.Positionable#POSITIONABLE Target The target to attack. Can be passed as a @{Wrapper.Group#GROUP} or @{Wrapper.Unit#UNIT} object. -- @return #AUFTRAG self -function AUFTRAG:NewANTISHIP(TargetUnitSet) - - if TargetUnitSet:IsInstanceOf("UNIT") then - TargetUnitSet=SET_UNIT:New():AddUnit(TargetUnitSet) - end +function AUFTRAG:NewANTISHIP(Target) local mission=AUFTRAG:New(AUFTRAG.Type.ANTISHIP) - mission.engageTargetUnitset=TargetUnitSet - mission.engageTargetUnitset:FilterDeads():FilterCrashes() + mission.engageTarget=mission:_TargetFromObject(Target) mission.missionTask=ENUMS.MissionTask.ANTISHIPSTRIKE - + mission.missionFraction=0.5 mission.optionROE=ENUMS.ROE.OpenFire + mission.optionROT=ENUMS.ROT.EvadeFire mission.DCStask=mission:GetDCSMissionTask() @@ -403,6 +397,8 @@ function AUFTRAG:NewPATROL(OrbitCoordinate, OrbitSpeed, Heading, Leg, Altitude) -- Mission type PATROL. mission.type=AUFTRAG.Type.PATROL + mission:_SetLogID() + mission.missionTask=ENUMS.MissionTask.INTERCEPT mission.optionROT=ENUMS.ROT.PassiveDefense @@ -426,6 +422,8 @@ function AUFTRAG:NewTANKER(OrbitCoordinate, OrbitSpeed, Heading, Leg, Altitude, -- Mission type PATROL. mission.type=AUFTRAG.Type.TANKER + mission:_SetLogID() + mission.refuelSystem=RefuelSystem mission.missionTask=ENUMS.MissionTask.REFUELING @@ -453,6 +451,8 @@ function AUFTRAG:NewAWACS(OrbitCoordinate, OrbitSpeed, Heading, Leg, Altitude) -- Mission type PATROL. mission.type=AUFTRAG.Type.AWACS + mission:_SetLogID() + mission.missionTask=ENUMS.MissionTask.AWACS mission.optionROE=ENUMS.ROE.WeaponHold mission.optionROT=ENUMS.ROT.PassiveDefense @@ -472,7 +472,7 @@ function AUFTRAG:NewINTERCEPT(Target) local mission=AUFTRAG:New(AUFTRAG.Type.INTERCEPT) - mission.engageTarget=self:_TargetFromObject(Target) + mission.engageTarget=mission:_TargetFromObject(Target) mission.missionTask=ENUMS.MissionTask.INTERCEPT mission.missionFraction=0.1 @@ -509,6 +509,8 @@ function AUFTRAG:NewCAP(OrbitCoordinate, OrbitSpeed, Heading, Leg, ZoneCAP, Targ mission.type=AUFTRAG.Type.CAP mission.engageZone=ZoneCAP or ZONE_RADIUS:New("CAP Zone", OrbitCoordinate:GetVec2(), mission.orbitLeg) mission.engageTargetTypes=TargetTypes or {"Air"} + + mission:_SetLogID() mission.missionTask=ENUMS.MissionTask.CAP mission.optionROE=ENUMS.ROE.WeaponFree @@ -544,6 +546,8 @@ function AUFTRAG:NewCAS(OrbitCoordinate, OrbitSpeed, Heading, Leg, ZoneCAS, Targ mission.type=AUFTRAG.Type.CAS mission.engageZone=ZoneCAS or ZONE_RADIUS:New("CAS Zone", OrbitCoordinate:GetVec2(), Leg) mission.engageTargetTypes=TargetTypes or {"Helicopters", "Ground Units", "Light armed ships"} + + mission:_SetLogID() mission.missionTask=ENUMS.MissionTask.CAS mission.optionROE=ENUMS.ROE.WeaponFree @@ -564,12 +568,8 @@ function AUFTRAG:NewBAI(Target) local mission=AUFTRAG:New(AUFTRAG.Type.BAI) - mission.engageTarget=self:_TargetFromObject(Target) - - --mission.engageTargetUnitset=TargetGroupSet - --mission.engageTargetUnitset:FilterDeads() - - mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG --2956984318 + mission.engageTarget=mission:_TargetFromObject(Target) + mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL mission.engageAsGroup=true @@ -586,16 +586,16 @@ end --- Create a STRIKE mission. Flight will attack the closest map object to the specified coordinate. -- @param #AUFTRAG self --- @param Core.Point#COORDINATE TargetCoordinate Target coordinate. +-- @param Core.Point#COORDINATE Target The target coordinate. Can also be given as a GROUP, UNIT or STATIC object. -- @param #number Altitude Engage altitude in feet. Default 1000 ft. -- @return #AUFTRAG self -function AUFTRAG:NewSTRIKE(TargetCoordinate, Altitude) +function AUFTRAG:NewSTRIKE(Target, Altitude) local mission=AUFTRAG:New(AUFTRAG.Type.STRIKE) - mission.engageCoord=TargetCoordinate + mission.engageTarget=mission:_TargetFromObject(Target) mission.engageAltitude=UTILS.FeetToMeters(Altitude or 1000) - mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG --2956984318 + mission.engageWeaponType=ENUMS.WeaponFlag.AnyAG mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL mission.missionTask=ENUMS.MissionTask.GROUNDATTACK @@ -609,25 +609,57 @@ function AUFTRAG:NewSTRIKE(TargetCoordinate, Altitude) return mission end ---- Create a BOMBING mission. Flight will attack a specified coordinate. +--- Create a BOMBING mission. Flight will drop bombs a specified coordinate. -- @param #AUFTRAG self --- @param Core.Point#COORDINATE TargetCoordinate Target coordinate. --- @param #number Altitude Engage altitude in feet. Default 25000. +-- @param Core.Point#COORDINATE TargetCoordinate Target coordinate. Can also be specified as a GROUP, UNIT or STATIC object. +-- @param #number Altitude Engage altitude in feet. Default 25000 ft. -- @return #AUFTRAG self -function AUFTRAG:NewBOMBING(TargetCoordinate, Altitude) +function AUFTRAG:NewBOMBING(Target, Altitude) local mission=AUFTRAG:New(AUFTRAG.Type.BOMBING) -- DCS task options: - mission.engageCoord=TargetCoordinate + mission.engageTarget=mission:_TargetFromObject(Target) mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) - mission.engageWeaponType=4030478 --2956984318 --ENUMS.WeaponFlag.AnyBomb + mission.engageWeaponType=ENUMS.WeaponFlag.AnyBomb mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL -- Mission options: mission.missionTask=ENUMS.MissionTask.GROUNDATTACK mission.missionAltitude=mission.engageAltitude*0.8 - mission.missionFraction=0.3 + mission.missionFraction=0.5 + mission.optionROE=ENUMS.ROE.OpenFire + mission.optionROT=ENUMS.ROT.PassiveDefense + + -- Get DCS task. + mission.DCStask=mission:GetDCSMissionTask() + + return mission +end + +--- Create a BOMBRUNWAY mission. +-- @param #AUFTRAG self +-- @param Wrapper.Airbase#AIRBASE Airdrome The airbase to bomb. This must be an airdrome (not a FARP or ship) as these to not have a runway. +-- @param #number Altitude Engage altitude in feet. Default 25000 ft. +-- @return #AUFTRAG self +function AUFTRAG:NewBOMBRUNWAY(Airdrome, Altitude) + + if type(Airdrome)=="string" then + Airdrome=AIRBASE:FindByName(Airdrome) + end + + local mission=AUFTRAG:New(AUFTRAG.Type.BOMBRUNWAY) + + -- DCS task options: + mission.engageAirbase=Airdrome + mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) + mission.engageWeaponType=ENUMS.WeaponFlag.AnyBomb + mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL + + -- Mission options: + mission.missionTask=ENUMS.MissionTask.RUNWAYATTACK + mission.missionAltitude=mission.engageAltitude*0.8 + mission.missionFraction=0.5 mission.optionROE=ENUMS.ROE.OpenFire mission.optionROT=ENUMS.ROT.PassiveDefense @@ -657,7 +689,7 @@ function AUFTRAG:NewESCORT(EscortGroup, OffsetVector, EngageMaxDistance, TargetT mission.missionTask=ENUMS.MissionTask.ESCORT mission.missionFraction=0.1 - -- TODO: what's the best ROE here? + -- TODO: what's the best ROE here? Make dependent on ESCORT or FOLLOW! mission.optionROE=ENUMS.ROE.OpenFire mission.optionROT=ENUMS.ROT.PassiveDefense @@ -684,11 +716,19 @@ function AUFTRAG:NewAUTO(EngageGroup) local threatlevel=group:GetThreatLevel() if category==Group.Category.AIRPLANE or category==Group.Category.HELICOPTER then + + --- + -- AIR + --- mission=AUFTRAG:NewINTERCEPT(group) elseif category==Group.Category.GROUND then + --- + -- GROUND + --- + --TODO: action depends on type -- AA/SAM ==> SEAD -- Tanks ==> @@ -707,24 +747,13 @@ function AUFTRAG:NewAUTO(EngageGroup) elseif category==Group.Category.SHIP then + --- + -- NAVAL + --- + --TODO: ANTISHIP mission=AUFTRAG:NewANTISHIP(group) - - --[[ - local TargetUnitSet=SET_UNIT:New() - - for _,_unit in pairs(group:GetUnits()) do - local unit=_unit --Wrapper.Unit#UNIT - if unit and unit:IsAlive() and unit:GetThreatLevel()>0 then - TargetUnitSet:AddUnit(unit) - end - end - - if TargetUnitSet:Count()>0 then - mission=AUFTRAG:NewANTISHIP(TargetUnitSet) - end - ]] end end @@ -789,6 +818,15 @@ function AUFTRAG:SetPriority(Prio, Urgent) return self end +--- Set how many times the mission is repeated if it fails. +-- @param #AUFTRAG self +-- @param #number Nrepeat Number of repeats. Default 0. +-- @return #AUFTRAG self +function AUFTRAG:SetRepeatOnFailure(Nrepeat) + self.missionRepeatMax=Nrepeat or 0 + return self +end + --- Set mission name. -- @param #AUFTRAG self -- @param #string Name Name of the mission. @@ -814,7 +852,7 @@ end --- Set number of weapons to expend. -- @param #AUFTRAG self --- @param #number WeaponType Weapon type. Default is ENUMS.WeaponFlag.Auto +-- @param #number WeaponExpend How much of the weapon load is expended during the attack, e.g. `AI.Task.WeaponExpend.ALL`. Default "Auto". -- @return #AUFTRAG self function AUFTRAG:SetWeaponExpend(WeaponExpend) @@ -826,6 +864,24 @@ function AUFTRAG:SetWeaponExpend(WeaponExpend) return self end +--- Set number of weapons to expend. +-- @param #AUFTRAG self +-- @param #boolean Switch If true or nil, engage as group. If false, not. +-- @return #AUFTRAG self +function AUFTRAG:SetEngageAsGroup(Switch) + + if Switch==nil then + Switch=true + end + + self.engageAsGroup=Switch + + -- Update the DCS task parameter. + self.DCStask=self:GetDCSMissionTask() + + return self +end + --- Set mission altitude. -- @param #AUFTRAG self -- @param #string Altitude Altitude in feet. @@ -1177,7 +1233,7 @@ end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Flightgroup event function handling the crash of a unit. --- @param #FLIGHTGROUP self +-- @param #AUFTRAG self -- @param Core.Event#EVENTDATA EventData Event data. function AUFTRAG:OnEventCrash(EventData) @@ -1186,15 +1242,6 @@ function AUFTRAG:OnEventCrash(EventData) local unit=EventData.IniUnit local group=EventData.IniGroup local unitname=EventData.IniUnitName - - -- Get element. - local element=self:GetElementByName(unitname) - - if element then - self:T3(self.lid..string.format("EVENT: Element %s crashed ==> dead", element.name)) - self:ElementDead(element) - end - end end @@ -1519,10 +1566,11 @@ function AUFTRAG:CountMissionTargets() local target=self.engageTarget.Target --Wrapper.Group#GROUP N=N+target:CountAliveUnits() elseif self.engageTarget.Type==AUFTRAG.TargetType.UNIT then - if self.engageTarget.Target and self.engageTarget.Target:IsAlive() then + local target=self.engageTarget.Target --Wrapper.Unit#UNIT + if target and target:IsAlive() then N=N+1 end - elseif self.engageTarget.Type==AUFTRAG.TargetType.GROUP then + elseif self.engageTarget.Type==AUFTRAG.TargetType.STATIC then local target=self.engageTarget.Target --Wrapper.Static#STATIC if target and target:IsAlive() then N=N+1 @@ -1530,33 +1578,6 @@ function AUFTRAG:CountMissionTargets() end end - --[[ - if self.engageTargetGroupset then - --local n=self.engageTargetGroupset:CountAlive() - - for _,_group in pairs(self.engageTargetGroupset.Set) do - local group=_group --Wrapper.Group#GROUP - - if group and group:IsAlive() then - - for _,_unit in pairs(group:GetUnits()) do - local unit=_unit --Wrapper.Unit#UNIT - if unit and unit:IsAlive() then - N=N+1 - end - end - - end - end - end - - if self.engageTargetUnitset then - local n=self.engageTargetUnitset:CountAlive() - N=N+n - end - - ]] - return N end @@ -1580,35 +1601,17 @@ end function AUFTRAG:GetTargetCoordinate() if self.engageTarget then - return self.engageTarget.Target:GetCoordinate() - elseif self.engageCoord then - return self.engageCoord + if self.engageTarget.Type==AUFTRAG.TargetType.COORDINATE then + return self.engageTarget.Target + else + return self.engageTarget.Target:GetCoordinate() + end elseif self.orbitCoord then return self.orbitCoord elseif self.escortGroup then return self.escortGroup:GetCoordinate() end - --[[ - if self.engageTargetGroupset then - local group=self.engageTargetGroupset:GetFirst() --Wrapper.Group#GROUP - if group and group:IsAlive() then - return group:GetCoordinate() - end - elseif self.engageTargetUnitset then - local unit=self.engageTargetUnitset:GetFirst() --Wrapper.Unit#UNIT - if unit and unit:IsAlive() then - return unit:GetCoordinate() - end - elseif self.engageCoord then - return self.engageCoord - elseif self.orbitCoord then - return self.orbitCoord - elseif self.escortGroup then - return self.escortGroup:GetCoordinate() - end - ]] - return nil end @@ -1637,6 +1640,14 @@ function AUFTRAG:GetMissionTypesText(MissionTypes) return text end +--- Set log ID string. +-- @param #AUFTRAG self +-- @return #AUFTRAG self +function AUFTRAG:_SetLogID() + self.lid=string.format("Auftrag #%d %s | ", self.auftragsnummer, tostring(self.type)) + return self +end + --- Get DCS task table for the given mission. -- @param #AUFTRAG self -- @return DCS#Task The DCS task table. If multiple tasks are necessary, this is returned as a combo task. @@ -1672,7 +1683,6 @@ function AUFTRAG:GetDCSMissionTask() -- BAI Mission -- ----------------- - -- TODO: adjust tasks for group/unit attack! group attack also seems to now support the attack as group value. however, statics are only possible if attackunit. local DCStask=self:_GetDCSAttackTask(self.engageTarget) table.insert(DCStasks, DCStask) @@ -1683,7 +1693,7 @@ function AUFTRAG:GetDCSMissionTask() -- BOMBING Mission -- --------------------- - local Vec2=self.engageCoord:GetVec2() + local Vec2=self:GetTargetCoordinate():GetVec2() local DCStask=CONTROLLABLE.TaskBombing(nil, Vec2, self.engageAsGroup, self.engageWeaponExpend, self.engageQuantity, self.engageDirection, self.engageAltitude, self.engageWeaponType, Divebomb) @@ -1785,7 +1795,7 @@ function AUFTRAG:GetDCSMissionTask() -- STIKE Mission -- ------------------- - local Vec2=self.engageCoord:GetVec2() + local Vec2=self:GetTargetCoordinate():GetVec2() local DCStask=CONTROLLABLE.TaskAttackMapObject(nil, Vec2, self.engageAsGroup, self.engageWeaponExpend, self.engageQuantity, self.engageDirection, self.engageAltitude, self.engageWeaponType) @@ -1800,7 +1810,6 @@ function AUFTRAG:GetDCSMissionTask() local DCStask=CONTROLLABLE.EnRouteTaskTanker(nil) table.insert(self.enrouteTasks, DCStask) - --table.insert(DCStasks, DCStask) elseif self.type==AUFTRAG.Type.TRANSPORT then @@ -1901,6 +1910,8 @@ function AUFTRAG:_TargetFromObject(Object) return nil end + self:I(self.lid..string.format("Mission Target Type=%s", target.Type)) + return target end diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index ca043f4f4..4f185b1af 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -2290,7 +2290,7 @@ end -- @param #string Event Event. -- @param #string To To state. function FLIGHTGROUP:onafterFlightDead(From, Event, To) - self:T(self.lid..string.format("Flight dead")) + self:I(self.lid..string.format("Flight dead!")) -- Delete waypoints so they are re-initialized at the next spawn. self.waypoints=nil diff --git a/Moose Development/Moose/Ops/WingCommander.lua b/Moose Development/Moose/Ops/WingCommander.lua index 2750808db..01c10fc21 100644 --- a/Moose Development/Moose/Ops/WingCommander.lua +++ b/Moose Development/Moose/Ops/WingCommander.lua @@ -136,7 +136,6 @@ function WINGCOMMANDER:AddAirwing(Airwing) Airwing.wingcommander=self table.insert(self.airwings, Airwing) - --self.airwings[Airwing.alias]=Airwing return self end diff --git a/Moose Development/Moose/Utilities/Enums.lua b/Moose Development/Moose/Utilities/Enums.lua index 2229b9043..e1a88ba97 100644 --- a/Moose Development/Moose/Utilities/Enums.lua +++ b/Moose Development/Moose/Utilities/Enums.lua @@ -68,6 +68,21 @@ ENUMS.WeaponFlag={ --- Mission tasks. -- @type ENUMS.MissionTask +-- @field #string NOTHING No special task. Group can perform the minimal tasks: Orbit, Refuelling, Follow and Aerobatics. +-- @field #string AFAC Forward Air Controller Air. Can perform the tasks: Attack Group, Attack Unit, FAC assign group, Bombing, Attack Map Object. +-- @field #string ANTISHIPSTRIKE Naval ops. Can perform the tasks: Attack Group, Attack Unit. +-- @field #string AWACS AWACS. +-- @field #string CAP Combat Air Patrol. +-- @field #string CAS Close Air Support. +-- @field #string ESCORT Escort another group. +-- @field #string FIGHTERSWEEP Fighter sweep. +-- @field #string INTERCEPT Intercept. +-- @field #string PINPOINTSTRIKE Pinpoint strike. +-- @field #string RECONNAISSANCE Reconnaissance mission. +-- @field #string REFUELLING Refuelling mission. +-- @field #string RUNWAYATTAC Attack the runway of an airdrome. +-- @field #string SEAD Suppression of Enemy Air Defenses. +-- @field #string TRANSPORT Troop transport. ENUMS.MissionTask={ NOTHING="Nothing", AFAC="AFAC",