mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
263 lines
6.4 KiB
Lua
263 lines
6.4 KiB
Lua
--- **Core** -- Base class that models processes to achieve goals involving a Zone.
|
|
--
|
|
-- ====
|
|
--
|
|
-- ZONE_GOAL models processes that have an objective with a defined achievement involving a Zone. Derived classes implement the ways how the achievements can be realized.
|
|
--
|
|
-- ====
|
|
--
|
|
-- ### Author: **Sven Van de Velde (FlightControl)**
|
|
--
|
|
-- ====
|
|
--
|
|
-- @module Zone
|
|
|
|
do -- Zone
|
|
|
|
--- @type ZONE_GOAL
|
|
-- @extends Core.Goal#GOAL
|
|
|
|
|
|
--- # ZONE_GOAL class, extends @{Goal#GOAL}
|
|
--
|
|
-- ZONE_GOAL models processes that have an objective with a defined achievement involving a Zone. Derived classes implement the ways how the achievements can be realized.
|
|
--
|
|
-- ## 1. ZONE_GOAL constructor
|
|
--
|
|
-- * @{#ZONE_GOAL.New}(): Creates a new ZONE_GOAL object.
|
|
--
|
|
-- ## 2. ZONE_GOAL is a finite state machine (FSM).
|
|
--
|
|
-- ### 2.1 ZONE_GOAL States
|
|
--
|
|
-- * **Empty**: The Zone is Empty.
|
|
-- * **Guarded**: The Zone is Guarded.
|
|
--
|
|
-- ### 2.2 ZONE_GOAL Events
|
|
--
|
|
-- * **@{#ZONE_GOAL.Guard}()**: Set the Zone to Guarded.
|
|
-- * **@{#ZONE_GOAL.Empty}()**: Set the Zone to Empty.
|
|
--
|
|
-- @field #ZONE_GOAL
|
|
ZONE_GOAL = {
|
|
ClassName = "ZONE_GOAL",
|
|
}
|
|
|
|
--- @field #table ZONE_GOAL.States
|
|
ZONE_GOAL.States = {}
|
|
|
|
--- ZONE_GOAL Constructor.
|
|
-- @param #ZONE_GOAL self
|
|
-- @param Core.Zone#ZONE_BASE Zone A @{Zone} object with the goal to be achieved.
|
|
-- @return #ZONE_GOAL
|
|
function ZONE_GOAL:New( Zone )
|
|
|
|
local self = BASE:Inherit( self, FSM:New() ) -- #ZONE_GOAL
|
|
self:F( { Zone = Zone } )
|
|
|
|
self.Zone = Zone -- Core.Zone#ZONE_BASE
|
|
self.Goal = GOAL:New():Start()
|
|
|
|
do
|
|
|
|
--- Guarded State Handler OnLeave for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnLeaveGuarded
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Guarded State Handler OnEnter for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnEnterGuarded
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
ZONE_GOAL.States.Guarded = "Guarded"
|
|
|
|
end
|
|
|
|
|
|
do
|
|
|
|
--- Empty State Handler OnLeave for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnLeaveEmpty
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Empty State Handler OnEnter for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnEnterEmpty
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
ZONE_GOAL.States.Empty = "Empty"
|
|
|
|
end
|
|
|
|
|
|
self:AddTransition( "*", "Guard", ZONE_GOAL.States.Guarded )
|
|
|
|
--- Guard Handler OnBefore for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnBeforeGuard
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Guard Handler OnAfter for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnAfterGuard
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Guard Trigger for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] Guard
|
|
-- @param #ZONE_GOAL self
|
|
|
|
--- Guard Asynchronous Trigger for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] __Guard
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #number Delay
|
|
|
|
self:AddTransition( "*", "Empty", ZONE_GOAL.States.Empty )
|
|
|
|
--- Empty Handler OnBefore for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnBeforeEmpty
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Empty Handler OnAfter for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] OnAfterEmpty
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Empty Trigger for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] Empty
|
|
-- @param #ZONE_GOAL self
|
|
|
|
--- Empty Asynchronous Trigger for ZONE_GOAL
|
|
-- @function [parent=#ZONE_GOAL] __Empty
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #number Delay
|
|
|
|
|
|
self.SmokeTime = nil
|
|
|
|
return self
|
|
end
|
|
|
|
--- Get the Zone
|
|
-- @param #ZONE_GOAL self
|
|
-- @return Core.Zone#ZONE_BASE
|
|
function ZONE_GOAL:GetZone()
|
|
return self.Zone
|
|
end
|
|
|
|
|
|
--- Get the name of the ProtectZone
|
|
-- @param #ZONE_GOAL self
|
|
-- @return #string
|
|
function ZONE_GOAL:GetZoneName()
|
|
return self.Zone:GetName()
|
|
end
|
|
|
|
--- Smoke the center of theh zone.
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #SMOKECOLOR.Color SmokeColor
|
|
function ZONE_GOAL:Smoke( SmokeColor )
|
|
|
|
self:F( { SmokeColor = SmokeColor} )
|
|
|
|
self.SmokeColor = SmokeColor
|
|
end
|
|
|
|
|
|
--- Flare the center of the zone.
|
|
-- @param #ZONE_GOAL self
|
|
-- @param #SMOKECOLOR.Color FlareColor
|
|
function ZONE_GOAL:Flare( FlareColor )
|
|
self.Zone:FlareZone( FlareColor, math.random( 1, 360 ) )
|
|
end
|
|
|
|
|
|
--- When started, check the Smoke and the Zone status.
|
|
-- @param #ZONE_GOAL self
|
|
function ZONE_GOAL:onafterGuard()
|
|
|
|
--self:GetParent( self ):onafterStart()
|
|
|
|
self:E("Guard")
|
|
|
|
--self:ScheduleRepeat( 15, 15, 0.1, nil, self.StatusZone, self )
|
|
if not self.SmokeScheduler then
|
|
self.SmokeScheduler = self:ScheduleRepeat( 1, 1, 0.1, nil, self.StatusSmoke, self )
|
|
end
|
|
end
|
|
|
|
function ZONE_GOAL:IsGuarded()
|
|
|
|
local IsGuarded = self.Zone:IsAllInZoneOfCoalition( self.Coalition )
|
|
self:E( { IsGuarded = IsGuarded } )
|
|
return IsGuarded
|
|
end
|
|
|
|
|
|
function ZONE_GOAL:IsEmpty()
|
|
|
|
local IsEmpty = self.Zone:IsNoneInZone()
|
|
self:E( { IsEmpty = IsEmpty } )
|
|
return IsEmpty
|
|
end
|
|
|
|
|
|
--- Check status Zone.
|
|
-- @param #ZONE_GOAL self
|
|
function ZONE_GOAL:StatusZone()
|
|
|
|
self:E( { State = self:GetState() } )
|
|
|
|
self.Zone:Scan()
|
|
|
|
if self:IsGuarded() then
|
|
self:Guard()
|
|
end
|
|
|
|
if self:IsEmpty() then
|
|
self:Empty()
|
|
end
|
|
|
|
end
|
|
|
|
--- Check status Smoke.
|
|
-- @param #ZONE_GOAL self
|
|
function ZONE_GOAL:StatusSmoke()
|
|
|
|
self:F({self.SmokeTime, self.SmokeColor})
|
|
|
|
local CurrentTime = timer.getTime()
|
|
|
|
if self.SmokeTime == nil or self.SmokeTime + 300 <= CurrentTime then
|
|
if self.SmokeColor then
|
|
self.Zone:GetCoordinate():Smoke( self.SmokeColor )
|
|
--self.SmokeColor = nil
|
|
self.SmokeTime = CurrentTime
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|