* Some QOL additions, docu, stuff for SCENERY
This commit is contained in:
Applevangelist 2022-10-19 17:26:40 +02:00
parent 78c209a96f
commit 2854a2d93e

View File

@ -4,11 +4,13 @@
-- --
-- * Manages target, number alive, life points, damage etc. -- * Manages target, number alive, life points, damage etc.
-- * Events when targets are damaged or destroyed -- * 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, AIRBASE, COORDINATE, SET_GROUP, SET_UNIT
-- --
-- === -- ===
-- --
-- ### Author: **funkyfranky** -- ### Author: **funkyfranky**
-- ### Additions: **applevangelist**
--
-- @module Ops.Target -- @module Ops.Target
-- @image OPS_Target.png -- @image OPS_Target.png
@ -114,9 +116,11 @@ TARGET.Category={
-- @type TARGET.ObjectStatus -- @type TARGET.ObjectStatus
-- @field #string ALIVE Object is alive. -- @field #string ALIVE Object is alive.
-- @field #string DEAD Object is dead. -- @field #string DEAD Object is dead.
-- @field #string DAMAGED Object is damaged.
TARGET.ObjectStatus={ TARGET.ObjectStatus={
ALIVE="Alive", ALIVE="Alive",
DEAD="Dead", DEAD="Dead",
DAMAGED="Damaged",
} }
--- Resource. --- Resource.
@ -147,7 +151,7 @@ _TARGETID=0
--- TARGET class version. --- TARGET class version.
-- @field #string version -- @field #string version
TARGET.version="0.5.4" TARGET.version="0.5.5"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@ -204,7 +208,7 @@ function TARGET:New(TargetObject)
self:AddTransition("*", "ObjectDestroyed", "*") -- A target object was destroyed. self:AddTransition("*", "ObjectDestroyed", "*") -- A target object was destroyed.
self:AddTransition("*", "ObjectDead", "*") -- A target object is dead (destroyed or despawned). 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("*", "Destroyed", "Dead") -- Target was completely destroyed.
self:AddTransition("*", "Dead", "Dead") -- Target is dead. Could be destroyed or despawned. self:AddTransition("*", "Dead", "Dead") -- Target is dead. Could be destroyed or despawned.
@ -237,7 +241,51 @@ function TARGET:New(TargetObject)
-- @function [parent=#TARGET] __Status -- @function [parent=#TARGET] __Status
-- @param #TARGET self -- @param #TARGET self
-- @param #number delay Delay in seconds. -- @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. -- Start.
self:__Start(-1) self:__Start(-1)
@ -261,7 +309,6 @@ end
-- * SET_UNIT -- * SET_UNIT
-- * SET_STATIC -- * SET_STATIC
-- * SET_OPSGROUP -- * SET_OPSGROUP
-- * SET_SCENERY
-- --
-- @param #TARGET self -- @param #TARGET self
-- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, AIRBASE or COORDINATE. -- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, AIRBASE or COORDINATE.
@ -304,6 +351,7 @@ function TARGET:AddObject(Object)
end end
return self
end end
--- Set priority of the target. --- Set priority of the target.
@ -502,7 +550,7 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function TARGET:onafterStart(From, Event, To) function TARGET:onafterStart(From, Event, To)
self:T({From, Event, To})
-- Short info. -- Short info.
local text=string.format("Starting Target") local text=string.format("Starting Target")
self:T(self.lid..text) self:T(self.lid..text)
@ -512,6 +560,7 @@ function TARGET:onafterStart(From, Event, To)
self:HandleEvent(EVENTS.RemoveUnit, self.OnEventUnitDeadOrLost) self:HandleEvent(EVENTS.RemoveUnit, self.OnEventUnitDeadOrLost)
self:__Status(-1) self:__Status(-1)
return self
end end
--- On after "Status" event. --- On after "Status" event.
@ -521,7 +570,7 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function TARGET:onafterStatus(From, Event, To) function TARGET:onafterStatus(From, Event, To)
self:T({From, Event, To})
-- FSM state. -- FSM state.
local fsmstate=self:GetState() local fsmstate=self:GetState()
@ -530,18 +579,29 @@ function TARGET:onafterStatus(From, Event, To)
for i,_target in pairs(self.targets) do for i,_target in pairs(self.targets) do
local target=_target --#TARGET.Object local target=_target --#TARGET.Object
-- old life
local life=target.Life local life=target.Life
-- curr life
target.Life=self:GetTargetLife(target) 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 if target.Life<life then
self:ObjectDamaged(target) target.Status = TARGET.ObjectStatus.DAMAGED
self:ObjectDamaged(target)
damaged=true damaged=true
end end
if life==0 then if life < 1 and (not target.Status == TARGET.ObjectStatus.DEAD) 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))) 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) self:ObjectDead(target)
damaged = true
end end
end end
@ -575,6 +635,7 @@ function TARGET:onafterStatus(From, Event, To)
if self:IsAlive() then if self:IsAlive() then
self:__Status(-self.TStatus) self:__Status(-self.TStatus)
end end
return self
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -588,10 +649,11 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param #TARGET.Object Target Target object. -- @param #TARGET.Object Target Target object.
function TARGET:onafterObjectDamaged(From, Event, To, Target) function TARGET:onafterObjectDamaged(From, Event, To, Target)
self:T({From, Event, To})
-- Debug info. -- Debug info.
self:T(self.lid..string.format("Object %s damaged", Target.Name)) self:T(self.lid..string.format("Object %s damaged", Target.Name))
return self
end end
--- On after "ObjectDestroyed" event. --- On after "ObjectDestroyed" event.
@ -601,7 +663,7 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param #TARGET.Object Target Target object. -- @param #TARGET.Object Target Target object.
function TARGET:onafterObjectDestroyed(From, Event, To, Target) function TARGET:onafterObjectDestroyed(From, Event, To, Target)
self:T({From, Event, To})
-- Debug message. -- Debug message.
self:T(self.lid..string.format("Object %s destroyed", Target.Name)) self:T(self.lid..string.format("Object %s destroyed", Target.Name))
@ -611,6 +673,7 @@ function TARGET:onafterObjectDestroyed(From, Event, To, Target)
-- Call object dead event. -- Call object dead event.
self:ObjectDead(Target) self:ObjectDead(Target)
return self
end end
--- On after "ObjectDead" event. --- On after "ObjectDead" event.
@ -620,7 +683,7 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param #TARGET.Object Target Target object. -- @param #TARGET.Object Target Target object.
function TARGET:onafterObjectDead(From, Event, To, Target) function TARGET:onafterObjectDead(From, Event, To, Target)
self:T({From, Event, To})
-- Debug message. -- Debug message.
self:T(self.lid..string.format("Object %s dead", Target.Name)) self:T(self.lid..string.format("Object %s dead", Target.Name))
@ -653,8 +716,11 @@ function TARGET:onafterObjectDead(From, Event, To, Target)
self:Dead() self:Dead()
end end
else
self:Damaged()
end end
return self
end end
--- On after "Damaged" event. --- On after "Damaged" event.
@ -663,9 +729,11 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function TARGET:onafterDamaged(From, Event, To) function TARGET:onafterDamaged(From, Event, To)
self:T({From, Event, To})
self:T(self.lid..string.format("TARGET damaged")) self:T(self.lid..string.format("TARGET damaged"))
return self
end end
--- On after "Destroyed" event. --- On after "Destroyed" event.
@ -674,11 +742,14 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function TARGET:onafterDestroyed(From, Event, To) function TARGET:onafterDestroyed(From, Event, To)
self:T({From, Event, To})
self:T(self.lid..string.format("TARGET destroyed")) self:T(self.lid..string.format("TARGET destroyed"))
self:Dead() self:Dead()
return self
end end
--- On after "Dead" event. --- On after "Dead" event.
@ -687,9 +758,11 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function TARGET:onafterDead(From, Event, To) function TARGET:onafterDead(From, Event, To)
self:T({From, Event, To})
self:T(self.lid..string.format("TARGET dead")) self:T(self.lid..string.format("TARGET dead"))
return self
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -707,7 +780,7 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
if self:IsElement(Name) and not self:IsCasualty(Name) then if self:IsElement(Name) and not self:IsCasualty(Name) then
-- Debug info. -- 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. -- Add to the list of casualties.
table.insert(self.casualties, Name) table.insert(self.casualties, Name)
@ -736,15 +809,19 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
-- Debug message. -- Debug message.
self:T2(self.lid..string.format("EVENT ID=%d: target %s dead/lost ==> destroyed", EventData.id, tostring(target.Name))) 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. -- Trigger object destroyed event.
self:ObjectDestroyed(target) self:ObjectDestroyed(target)
else else
-- Debug message. -- Debug message.
self:T2(self.lid..string.format("EVENT ID=%d: target %s removed ==> dead", EventData.id, tostring(target.Name))) 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. -- Trigger object dead event.
self:ObjectDead(target) self:ObjectDead(target)
@ -755,7 +832,7 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
end -- Event belongs to this TARGET end -- Event belongs to this TARGET
end end
return self
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -764,7 +841,7 @@ end
--- Create target data from a given object. --- Create target data from a given object.
-- @param #TARGET self -- @param #TARGET self
-- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, AIRBASE or COORDINATE. -- @param Wrapper.Positionable#POSITIONABLE Object The target GROUP, UNIT, STATIC, SCENERY, AIRBASE or COORDINATE.
function TARGET:_AddObject(Object) function TARGET:_AddObject(Object)
local target={} --#TARGET.Object local target={} --#TARGET.Object
@ -848,8 +925,8 @@ function TARGET:_AddObject(Object)
target.Coordinate=scenery:GetCoordinate() target.Coordinate=scenery:GetCoordinate()
target.Life0=1 target.Life0=scenery:GetLife0()
target.Life=1 target.Life=scenery:GetLife()
target.N0=target.N0+1 target.N0=target.N0+1
@ -922,7 +999,8 @@ function TARGET:_AddObject(Object)
if self.category==nil then if self.category==nil then
self.category=self:GetTargetCategory(target) self.category=self:GetTargetCategory(target)
end end
return self
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -991,8 +1069,9 @@ function TARGET:GetTargetLife(Target)
elseif Target.Type==TARGET.ObjectType.SCENERY then elseif Target.Type==TARGET.ObjectType.SCENERY then
if Target.Status==TARGET.ObjectStatus.ALIVE then if Target.Object and Target.Object:IsAlive() then
return 1 local life = Target.Object:GetLife()
return life
else else
return 0 return 0
end end
@ -1016,7 +1095,8 @@ function TARGET:GetTargetLife(Target)
else else
self:E("ERROR: unknown target object type in GetTargetLife!") self:E("ERROR: unknown target object type in GetTargetLife!")
end end
return self
end end
--- Get current life points. --- Get current life points.
@ -1091,7 +1171,8 @@ function TARGET:GetTargetThreatLevelMax(Target)
else else
self:E("ERROR: unknown target object type in GetTargetThreatLevel!") self:E("ERROR: unknown target object type in GetTargetThreatLevel!")
end end
return self
end end
@ -1558,7 +1639,7 @@ function TARGET:CountObjectives(Target)
elseif Target.Type==TARGET.ObjectType.SCENERY then elseif Target.Type==TARGET.ObjectType.SCENERY then
if Target.Status==TARGET.ObjectStatus.ALIVE then if Target.Status~=TARGET.ObjectStatus.DEAD then
N=N+1 N=N+1
end end
@ -1630,7 +1711,7 @@ function TARGET:IsCasualty(Name)
end end
for _,name in pairs(self.casualties) do for _,name in pairs(self.casualties) do
if name==Name then if tostring(name)==tostring(Name) then
return true return true
end end
end end