mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Merge branch 'develop' into FF/Ops
This commit is contained in:
@@ -4,11 +4,13 @@
|
||||
--
|
||||
-- * Manages target, number alive, life points, damage etc.
|
||||
-- * Events when targets are damaged or destroyed
|
||||
-- * Various target objects: UNIT, GROUP, STATIC, AIRBASE, COORDINATE, SET_GROUP, SET_UNIT, SET_SCENERY
|
||||
-- * Various target objects: UNIT, GROUP, STATIC, SCENERY, AIRBASE, COORDINATE, ZONE, SET_GROUP, SET_UNIT, SET_STATIC, SET_SCENERY, SET_ZONE
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- ### Author: **funkyfranky**
|
||||
-- ### Additions: **applevangelist**
|
||||
--
|
||||
-- @module Ops.Target
|
||||
-- @image OPS_Target.png
|
||||
|
||||
@@ -114,9 +116,11 @@ TARGET.Category={
|
||||
-- @type TARGET.ObjectStatus
|
||||
-- @field #string ALIVE Object is alive.
|
||||
-- @field #string DEAD Object is dead.
|
||||
-- @field #string DAMAGED Object is damaged.
|
||||
TARGET.ObjectStatus={
|
||||
ALIVE="Alive",
|
||||
DEAD="Dead",
|
||||
DAMAGED="Damaged",
|
||||
}
|
||||
|
||||
--- Resource.
|
||||
@@ -147,14 +151,14 @@ _TARGETID=0
|
||||
|
||||
--- TARGET class version.
|
||||
-- @field #string version
|
||||
TARGET.version="0.5.4"
|
||||
TARGET.version="0.5.5"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- TODO list
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- TODO: Had cases where target life was 0 but target was not dead. Need to figure out why!
|
||||
-- TODO: Add pseudo functions.
|
||||
-- DONE: Add pseudo functions.
|
||||
-- DONE: Initial object can be nil.
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -163,7 +167,7 @@ TARGET.version="0.5.4"
|
||||
|
||||
--- Create a new TARGET object and start the FSM.
|
||||
-- @param #TARGET self
|
||||
-- @param #table TargetObject Target object.
|
||||
-- @param #table TargetObject Target object. Can be a: UNIT, GROUP, STATIC, SCENERY, AIRBASE, COORDINATE, ZONE, SET_GROUP, SET_UNIT, SET_STATIC, SET_SCENERY, SET_ZONE
|
||||
-- @return #TARGET self
|
||||
function TARGET:New(TargetObject)
|
||||
|
||||
@@ -204,7 +208,7 @@ function TARGET:New(TargetObject)
|
||||
self:AddTransition("*", "ObjectDestroyed", "*") -- A target object was destroyed.
|
||||
self:AddTransition("*", "ObjectDead", "*") -- A target object is dead (destroyed or despawned).
|
||||
|
||||
self:AddTransition("*", "Damaged", "*") -- Target was damaged.
|
||||
self:AddTransition("*", "Damaged", "Damaged") -- Target was damaged.
|
||||
self:AddTransition("*", "Destroyed", "Dead") -- Target was completely destroyed.
|
||||
self:AddTransition("*", "Dead", "Dead") -- Target is dead. Could be destroyed or despawned.
|
||||
|
||||
@@ -237,7 +241,51 @@ function TARGET:New(TargetObject)
|
||||
-- @function [parent=#TARGET] __Status
|
||||
-- @param #TARGET self
|
||||
-- @param #number delay Delay in seconds.
|
||||
|
||||
|
||||
--- On After "ObjectDamaged" event. A (sub-) target object has been damaged, e.g. a UNIT of a GROUP, or an object of a SET
|
||||
-- @function [parent=#TARGET] OnAfterObjectDamaged
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
|
||||
--- On After "ObjectDestroyed" event. A (sub-) target object has been destroyed, e.g. a UNIT of a GROUP, or an object of a SET
|
||||
-- @function [parent=#TARGET] OnAfterObjectDestroyed
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
|
||||
--- On After "ObjectDead" event. A (sub-) target object is dead, e.g. a UNIT of a GROUP, or an object of a SET
|
||||
-- @function [parent=#TARGET] OnAfterObjectDead
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
|
||||
--- On After "Damaged" event. The (whole) target object has been damaged.
|
||||
-- @function [parent=#TARGET] OnAfterDamaged
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
|
||||
--- On After "ObjectDestroyed" event. The (whole) target object has been destroyed.
|
||||
-- @function [parent=#TARGET] OnAfterDestroyed
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
|
||||
--- On After "ObjectDead" event. The (whole) target object is dead.
|
||||
-- @function [parent=#TARGET] OnAfterDead
|
||||
-- @param #TARGET self
|
||||
-- @param #string From From state.
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
|
||||
-- Start.
|
||||
self:__Start(-1)
|
||||
@@ -254,17 +302,19 @@ end
|
||||
-- * GROUP
|
||||
-- * UNIT
|
||||
-- * STATIC
|
||||
-- * SCENERY
|
||||
-- * AIRBASE
|
||||
-- * COORDINATE
|
||||
-- * ZONE
|
||||
-- * SET_GROUP
|
||||
-- * SET_UNIT
|
||||
-- * SET_STATIC
|
||||
-- * SET_OPSGROUP
|
||||
-- * SET_SCENERY
|
||||
-- * SET_OPSGROUP
|
||||
-- * SET_ZONE
|
||||
--
|
||||
-- @param #TARGET self
|
||||
-- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, AIRBASE or COORDINATE.
|
||||
-- @param Wrapper.Positionable#POSITIONABLE Object The target UNIT, GROUP, STATIC, SCENERY, AIRBASE, COORDINATE, ZONE, SET_GROUP, SET_UNIT, SET_STATIC, SET_SCENERY, SET_ZONE
|
||||
function TARGET:AddObject(Object)
|
||||
|
||||
if Object:IsInstanceOf("SET_GROUP") or Object:IsInstanceOf("SET_UNIT") or Object:IsInstanceOf("SET_STATIC") or Object:IsInstanceOf("SET_SCENERY") or Object:IsInstanceOf("SET_OPSGROUP") then
|
||||
@@ -304,6 +354,7 @@ function TARGET:AddObject(Object)
|
||||
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Set priority of the target.
|
||||
@@ -502,7 +553,7 @@ end
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
function TARGET:onafterStart(From, Event, To)
|
||||
|
||||
self:T({From, Event, To})
|
||||
-- Short info.
|
||||
local text=string.format("Starting Target")
|
||||
self:T(self.lid..text)
|
||||
@@ -512,6 +563,7 @@ function TARGET:onafterStart(From, Event, To)
|
||||
self:HandleEvent(EVENTS.RemoveUnit, self.OnEventUnitDeadOrLost)
|
||||
|
||||
self:__Status(-1)
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "Status" event.
|
||||
@@ -521,7 +573,7 @@ end
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
function TARGET:onafterStatus(From, Event, To)
|
||||
|
||||
self:T({From, Event, To})
|
||||
-- FSM state.
|
||||
local fsmstate=self:GetState()
|
||||
|
||||
@@ -530,18 +582,29 @@ function TARGET:onafterStatus(From, Event, To)
|
||||
for i,_target in pairs(self.targets) do
|
||||
local target=_target --#TARGET.Object
|
||||
|
||||
-- old life
|
||||
local life=target.Life
|
||||
|
||||
-- curr life
|
||||
target.Life=self:GetTargetLife(target)
|
||||
|
||||
-- TODO: special case ED bug > life **increases** after hits on SCENERY
|
||||
if target.Life > target.Life0 then
|
||||
local delta = 2*(target.Life-target.Life0)
|
||||
target.Life0 = target.Life0 + delta
|
||||
life = target.Life0
|
||||
self.life0 = self.life0+delta
|
||||
end
|
||||
|
||||
if target.Life<life then
|
||||
self:ObjectDamaged(target)
|
||||
target.Status = TARGET.ObjectStatus.DAMAGED
|
||||
self:ObjectDamaged(target)
|
||||
damaged=true
|
||||
end
|
||||
|
||||
if life==0 then
|
||||
self:I(self.lid..string.format("FF life is zero but no object dead event fired ==> object dead now for target object %s!", tostring(target.Name)))
|
||||
if life < 1 and (not target.Status == TARGET.ObjectStatus.DEAD) then
|
||||
self:E(self.lid..string.format("FF life is zero but no object dead event fired ==> object dead now for target object %s!", tostring(target.Name)))
|
||||
self:ObjectDead(target)
|
||||
damaged = true
|
||||
end
|
||||
|
||||
end
|
||||
@@ -554,7 +617,9 @@ function TARGET:onafterStatus(From, Event, To)
|
||||
-- Log output verbose=1.
|
||||
if self.verbose>=1 then
|
||||
local text=string.format("%s: Targets=%d/%d Life=%.1f/%.1f Damage=%.1f", fsmstate, self:CountTargets(), self.N0, self:GetLife(), self:GetLife0(), self:GetDamage())
|
||||
if damaged then
|
||||
if self:CountTargets() == 0 then
|
||||
text=text.." Dead!"
|
||||
elseif damaged then
|
||||
text=text.." Damaged!"
|
||||
end
|
||||
self:I(self.lid..text)
|
||||
@@ -570,11 +635,16 @@ function TARGET:onafterStatus(From, Event, To)
|
||||
end
|
||||
self:I(self.lid..text)
|
||||
end
|
||||
|
||||
|
||||
if self:CountTargets() == 0 then
|
||||
self:Dead()
|
||||
end
|
||||
|
||||
-- Update status again in 30 sec.
|
||||
if self:IsAlive() then
|
||||
self:__Status(-self.TStatus)
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -588,10 +658,11 @@ end
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
function TARGET:onafterObjectDamaged(From, Event, To, Target)
|
||||
|
||||
self:T({From, Event, To})
|
||||
-- Debug info.
|
||||
self:T(self.lid..string.format("Object %s damaged", Target.Name))
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "ObjectDestroyed" event.
|
||||
@@ -601,7 +672,7 @@ end
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
function TARGET:onafterObjectDestroyed(From, Event, To, Target)
|
||||
|
||||
self:T({From, Event, To})
|
||||
-- Debug message.
|
||||
self:T(self.lid..string.format("Object %s destroyed", Target.Name))
|
||||
|
||||
@@ -611,6 +682,7 @@ function TARGET:onafterObjectDestroyed(From, Event, To, Target)
|
||||
-- Call object dead event.
|
||||
self:ObjectDead(Target)
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "ObjectDead" event.
|
||||
@@ -620,7 +692,7 @@ end
|
||||
-- @param #string To To state.
|
||||
-- @param #TARGET.Object Target Target object.
|
||||
function TARGET:onafterObjectDead(From, Event, To, Target)
|
||||
|
||||
self:T({From, Event, To})
|
||||
-- Debug message.
|
||||
self:T(self.lid..string.format("Object %s dead", Target.Name))
|
||||
|
||||
@@ -653,8 +725,11 @@ function TARGET:onafterObjectDead(From, Event, To, Target)
|
||||
self:Dead()
|
||||
|
||||
end
|
||||
else
|
||||
self:Damaged()
|
||||
end
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "Damaged" event.
|
||||
@@ -663,9 +738,11 @@ end
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
function TARGET:onafterDamaged(From, Event, To)
|
||||
|
||||
self:T({From, Event, To})
|
||||
|
||||
self:T(self.lid..string.format("TARGET damaged"))
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "Destroyed" event.
|
||||
@@ -674,11 +751,14 @@ end
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
function TARGET:onafterDestroyed(From, Event, To)
|
||||
|
||||
|
||||
self:T({From, Event, To})
|
||||
|
||||
self:T(self.lid..string.format("TARGET destroyed"))
|
||||
|
||||
self:Dead()
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- On after "Dead" event.
|
||||
@@ -687,9 +767,11 @@ end
|
||||
-- @param #string Event Event.
|
||||
-- @param #string To To state.
|
||||
function TARGET:onafterDead(From, Event, To)
|
||||
|
||||
self:T({From, Event, To})
|
||||
|
||||
self:T(self.lid..string.format("TARGET dead"))
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -707,7 +789,7 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
|
||||
if self:IsElement(Name) and not self:IsCasualty(Name) then
|
||||
|
||||
-- Debug info.
|
||||
self:T3(self.lid..string.format("EVENT ID=%d: Unit %s dead or lost!", EventData.id, tostring(Name)))
|
||||
self:T(self.lid..string.format("EVENT ID=%d: Unit %s dead or lost!", EventData.id, tostring(Name)))
|
||||
|
||||
-- Add to the list of casualties.
|
||||
table.insert(self.casualties, Name)
|
||||
@@ -736,15 +818,19 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
|
||||
|
||||
-- Debug message.
|
||||
self:T2(self.lid..string.format("EVENT ID=%d: target %s dead/lost ==> destroyed", EventData.id, tostring(target.Name)))
|
||||
|
||||
|
||||
target.Life = 0
|
||||
|
||||
-- Trigger object destroyed event.
|
||||
self:ObjectDestroyed(target)
|
||||
|
||||
|
||||
else
|
||||
|
||||
-- Debug message.
|
||||
self:T2(self.lid..string.format("EVENT ID=%d: target %s removed ==> dead", EventData.id, tostring(target.Name)))
|
||||
|
||||
|
||||
target.Life = 0
|
||||
|
||||
-- Trigger object dead event.
|
||||
self:ObjectDead(target)
|
||||
|
||||
@@ -755,7 +841,7 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
|
||||
end -- Event belongs to this TARGET
|
||||
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -764,7 +850,7 @@ end
|
||||
|
||||
--- Create target data from a given object.
|
||||
-- @param #TARGET self
|
||||
-- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, AIRBASE or COORDINATE.
|
||||
-- @param Wrapper.Positionable#POSITIONABLE Object The target UNIT, GROUP, STATIC, SCENERY, AIRBASE, COORDINATE, ZONE, SET_GROUP, SET_UNIT, SET_STATIC, SET_SCENERY, SET_ZONE
|
||||
function TARGET:_AddObject(Object)
|
||||
|
||||
local target={} --#TARGET.Object
|
||||
@@ -848,8 +934,8 @@ function TARGET:_AddObject(Object)
|
||||
|
||||
target.Coordinate=scenery:GetCoordinate()
|
||||
|
||||
target.Life0=1
|
||||
target.Life=1
|
||||
target.Life0=scenery:GetLife0()
|
||||
target.Life=scenery:GetLife()
|
||||
|
||||
target.N0=target.N0+1
|
||||
|
||||
@@ -922,7 +1008,8 @@ function TARGET:_AddObject(Object)
|
||||
if self.category==nil then
|
||||
self.category=self:GetTargetCategory(target)
|
||||
end
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -991,8 +1078,9 @@ function TARGET:GetTargetLife(Target)
|
||||
|
||||
elseif Target.Type==TARGET.ObjectType.SCENERY then
|
||||
|
||||
if Target.Status==TARGET.ObjectStatus.ALIVE then
|
||||
return 1
|
||||
if Target.Object and Target.Object:IsAlive() then
|
||||
local life = Target.Object:GetLife()
|
||||
return life
|
||||
else
|
||||
return 0
|
||||
end
|
||||
@@ -1016,7 +1104,8 @@ function TARGET:GetTargetLife(Target)
|
||||
else
|
||||
self:E("ERROR: unknown target object type in GetTargetLife!")
|
||||
end
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Get current total life points. This is the sum of all target objects.
|
||||
@@ -1091,7 +1180,8 @@ function TARGET:GetTargetThreatLevelMax(Target)
|
||||
else
|
||||
self:E("ERROR: unknown target object type in GetTargetThreatLevel!")
|
||||
end
|
||||
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
@@ -1380,6 +1470,11 @@ function TARGET:GetTargetName(Target)
|
||||
|
||||
return Zone:GetName()
|
||||
|
||||
elseif Target.Type==TARGET.ObjectType.SCENERY then
|
||||
|
||||
local Zone=Target.Object --Core.Zone#ZONE
|
||||
|
||||
return Zone:GetName()
|
||||
end
|
||||
|
||||
return "Unknown"
|
||||
@@ -1602,7 +1697,7 @@ function TARGET:GetObjective()
|
||||
|
||||
for _,_target in pairs(self.targets) do
|
||||
local target=_target --#TARGET.Object
|
||||
if target.Status==TARGET.ObjectStatus.ALIVE then
|
||||
if target.Status~=TARGET.ObjectStatus.DEAD then
|
||||
return target
|
||||
end
|
||||
end
|
||||
@@ -1662,7 +1757,7 @@ function TARGET:CountObjectives(Target)
|
||||
|
||||
elseif Target.Type==TARGET.ObjectType.SCENERY then
|
||||
|
||||
if Target.Status==TARGET.ObjectStatus.ALIVE then
|
||||
if Target.Status~=TARGET.ObjectStatus.DEAD then
|
||||
N=N+1
|
||||
end
|
||||
|
||||
@@ -1734,7 +1829,7 @@ function TARGET:IsCasualty(Name)
|
||||
end
|
||||
|
||||
for _,name in pairs(self.casualties) do
|
||||
if name==Name then
|
||||
if tostring(name)==tostring(Name) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user