diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index bdbb9da57..ce5d5a65c 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -1510,6 +1510,8 @@ function CHIEF:onafterStatus(From, Event, To) end + + --- -- Defcon --- @@ -1530,6 +1532,58 @@ function CHIEF:onafterStatus(From, Event, To) -- Check target queue and assign missions to new targets. self:CheckTargetQueue() + -- Loop over targets. + for _,_target in pairs(self.targetqueue) do + local target=_target --Ops.Target#TARGET + + if target and target:IsAlive() and target.mission and target.mission:IsNotOver() then + + local inborder=self:CheckTargetInZones(target, self.borderzoneset) + + local inyellow=self:CheckTargetInZones(target, self.yellowzoneset) + + local inattack=self:CheckTargetInZones(target, self.engagezoneset) + + if self.strategy==CHIEF.Strategy.PASSIVE then + + -- Passive: No targets are engaged at all. + self:T(self.lid..string.format("Cancelling mission for target %s as strategy is PASSIVE", target:GetName())) + target.mission:Cancel() + + elseif self.strategy==CHIEF.Strategy.DEFENSIVE then + + -- Defensive: Cancel if not in border. + if not inborder then + self:T(self.lid..string.format("Cancelling mission for target %s as strategy is DEFENSIVE and not inside border", target:GetName())) + target.mission:Cancel() + end + + elseif self.strategy==CHIEF.Strategy.OFFENSIVE then + + -- Offensive: Cancel if not in border or conflict. + if not (inborder or inyellow) then + self:T(self.lid..string.format("Cancelling mission for target %s as strategy is OFFENSIVE and not inside border or conflict", target:GetName())) + target.mission:Cancel() + end + + elseif self.strategy==CHIEF.Strategy.AGGRESSIVE then + + -- Aggessive: Cancel if not in border, conflict or attack. + if not (inborder or inyellow or inattack) then + self:T(self.lid..string.format("Cancelling mission for target %s as strategy is AGGRESSIVE and not inside border, conflict or attack", target:GetName())) + target.mission:Cancel() + end + + elseif self.strategy==CHIEF.Strategy.TOTALWAR then + + -- Total War: No missions are cancelled. + + end + + end + + end + --- -- Check Strategic Zone Queue --- diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 35276066f..50f9116fa 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -837,7 +837,7 @@ function FLIGHTGROUP:Status() -- ROE and Alarm State. local roe=self:GetROE() or -1 - local als=self:GetAlarmstate() or -1 + local rot=self:GetROT() or -1 -- Waypoint stuff. local wpidxCurr=self.currentwp @@ -882,8 +882,8 @@ function FLIGHTGROUP:Status() local curr=self.currbase and self.currbase:GetName() or "N/A" -- Info text. - local text=string.format("%s [%d/%d]: ROE/AS=%d/%d | T/M=%d/%d | Wp=%d[%d]-->%d[%d]/%d [%s] | Life=%.1f | v=%.1f (%d) | Hdg=%03d | Ammo=%d | Detect=%s | Cargo=%.1f | Base=%s [%s-->%s]", - fsmstate, nelem, Nelem, roe, als, nTaskTot, nMissions, wpidxCurr, wpuidCurr, wpidxNext, wpuidNext, wpN, wpF, life, speed, speedEx, hdg, ammo, ndetected, cargo, curr, home, dest) + local text=string.format("%s [%d/%d]: ROE/ROT=%d/%d | T/M=%d/%d | Wp=%d[%d]-->%d[%d]/%d [%s] | Life=%.1f | v=%.1f (%d) | Hdg=%03d | Ammo=%d | Detect=%s | Cargo=%.1f | Base=%s [%s-->%s]", + fsmstate, nelem, Nelem, roe, rot, nTaskTot, nMissions, wpidxCurr, wpuidCurr, wpidxNext, wpuidNext, wpN, wpF, life, speed, speedEx, hdg, ammo, ndetected, cargo, curr, home, dest) self:I(self.lid..text) end @@ -1809,6 +1809,11 @@ function FLIGHTGROUP:onafterArrived(From, Event, To) self.flightcontrol:SetFlightStatus(self, FLIGHTCONTROL.FlightStatus.ARRIVED) end + if not self.isAI then + -- Player landed. No despawn. + return + end + --TODO: Check that current base is airwing base. local airwing=self:GetAirWing() --airwing:GetAirbaseName()==self.currbase:GetName() diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index c2bb3b5b1..e9c282d4c 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -4395,6 +4395,7 @@ function OPSGROUP:onafterTaskDone(From, Event, To, Task) if Task.description=="Task_Land_At" then self:T(self.lid.."Taske DONE Task_Land_At ==> Wait") + self:Cruise() self:Wait(20, 100) else self:T(self.lid.."Task Done but NO mission found ==> _CheckGroupDone in 1 sec") @@ -4790,6 +4791,11 @@ function OPSGROUP:onafterMissionExecute(From, Event, To, Mission) -- Set mission status to EXECUTING. Mission:Executing() + + -- Group is holding but has waypoints ==> Cruise. + if self:IsHolding() and not self:HasPassedFinalWaypoint() then + self:Cruise() + end -- Set auto engage detected targets. if Mission.engagedetectedOn then @@ -9698,6 +9704,8 @@ function OPSGROUP:_CheckDamage() for _,_element in pairs(self.elements) do local element=_element --Ops.OpsGroup#OPSGROUP.Element + if element.status~=OPSGROUP.ElementStatus.DEAD and element.status~=OPSGROUP.ElementStatus.INUTERO then + -- Current life points. local life=element.unit:GetLife() @@ -9708,6 +9716,8 @@ function OPSGROUP:_CheckDamage() self:ElementDamaged(element) damaged=true end + + end end @@ -11845,7 +11855,7 @@ function OPSGROUP:GetAmmoTot() Ammo.MissilesCR=0 Ammo.MissilesSA=0 - for _,_unit in pairs(units) do + for _,_unit in pairs(units or {}) do local unit=_unit --Wrapper.Unit#UNIT if unit and unit:IsAlive()~=nil then