mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
459 lines
13 KiB
Lua
459 lines
13 KiB
Lua
--- **Functional** -- Base class that models processes to achieve goals involving a Zone for a Coalition.
|
|
--
|
|
-- ====
|
|
--
|
|
-- ZONE_GOAL_COALITION models processes that have a Goal with a defined achievement involving a Zone for a Coalition.
|
|
-- Derived classes implement the ways how the achievements can be realized.
|
|
--
|
|
-- ====
|
|
--
|
|
-- ### Author: **Sven Van de Velde (FlightControl)**
|
|
--
|
|
-- ====
|
|
--
|
|
-- @module ZoneGoalCoalition
|
|
|
|
do -- ZoneGoal
|
|
|
|
--- @type ZONE_GOAL_COALITION
|
|
-- @extends Functional.ZoneGoal#ZONE_GOAL
|
|
|
|
|
|
--- # ZONE_GOAL_COALITION class, extends @{ZoneGoal#ZONE_GOAL}
|
|
--
|
|
-- ZONE_GOAL_COALITION models processes that have a Goal with a defined achievement involving a Zone for a Coalition.
|
|
-- Derived classes implement the ways how the achievements can be realized.
|
|
--
|
|
-- ## 1. ZONE_GOAL_COALITION constructor
|
|
--
|
|
-- * @{#ZONE_GOAL_COALITION.New}(): Creates a new ZONE_GOAL_COALITION object.
|
|
--
|
|
-- ## 2. ZONE_GOAL_COALITION is a finite state machine (FSM).
|
|
--
|
|
-- ### 2.1 ZONE_GOAL_COALITION States
|
|
--
|
|
-- * **Captured**: The Zone has been captured by an other coalition.
|
|
-- * **Attacked**: The Zone is currently intruded by an other coalition. There are units of the owning coalition and an other coalition in the Zone.
|
|
-- * **Guarded**: The Zone is guarded by the owning coalition. There is no other unit of an other coalition in the Zone.
|
|
-- * **Empty**: The Zone is empty. There is not valid unit in the Zone.
|
|
--
|
|
-- ### 2.2 ZONE_GOAL_COALITION Events
|
|
--
|
|
-- * **Capture**: The Zone has been captured by an other coalition.
|
|
-- * **Attack**: The Zone is currently intruded by an other coalition. There are units of the owning coalition and an other coalition in the Zone.
|
|
-- * **Guard**: The Zone is guarded by the owning coalition. There is no other unit of an other coalition in the Zone.
|
|
-- * **Empty**: The Zone is empty. There is not valid unit in the Zone.
|
|
--
|
|
-- ### 2.3 ZONE_GOAL_COALITION State Machine
|
|
--
|
|
--
|
|
--
|
|
-- Hello | World
|
|
-- ------|------
|
|
-- Test|Test2
|
|
--
|
|
-- @field #ZONE_GOAL_COALITION
|
|
ZONE_GOAL_COALITION = {
|
|
ClassName = "ZONE_GOAL_COALITION",
|
|
}
|
|
|
|
--- @field #table ZONE_GOAL_COALITION.States
|
|
ZONE_GOAL_COALITION.States = {}
|
|
|
|
--- ZONE_GOAL_COALITION Constructor.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param Core.Zone#ZONE Zone A @{Zone} object with the goal to be achieved.
|
|
-- @param DCSCoalition.DCSCoalition#coalition Coalition The initial coalition owning the zone.
|
|
-- @return #ZONE_GOAL_COALITION
|
|
function ZONE_GOAL_COALITION:New( Zone, Coalition )
|
|
|
|
local self = BASE:Inherit( self, ZONE_GOAL:New( Zone ) ) -- #ZONE_GOAL_COALITION
|
|
self:F( { Zone = Zone, Coalition = Coalition } )
|
|
|
|
self:SetCoalition( Coalition )
|
|
|
|
do
|
|
|
|
--- Captured State Handler OnLeave for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnLeaveCaptured
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Captured State Handler OnEnter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnEnterCaptured
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
end
|
|
|
|
|
|
do
|
|
|
|
--- Attacked State Handler OnLeave for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnLeaveAttacked
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Attacked State Handler OnEnter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnEnterAttacked
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
end
|
|
|
|
do
|
|
|
|
--- Guarded State Handler OnLeave for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnLeaveGuarded
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Guarded State Handler OnEnter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnEnterGuarded
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
end
|
|
|
|
|
|
do
|
|
|
|
--- Empty State Handler OnLeave for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnLeaveEmpty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Empty State Handler OnEnter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnEnterEmpty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
end
|
|
|
|
self:AddTransition( "*", "Guard", "Guarded" )
|
|
|
|
--- Guard Handler OnBefore for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnBeforeGuard
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Guard Handler OnAfter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnAfterGuard
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Guard Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] Guard
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
|
|
--- Guard Asynchronous Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] __Guard
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #number Delay
|
|
|
|
self:AddTransition( "*", "Empty", "Empty" )
|
|
|
|
--- Empty Handler OnBefore for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnBeforeEmpty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Empty Handler OnAfter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnAfterEmpty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Empty Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] Empty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
|
|
--- Empty Asynchronous Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] __Empty
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #number Delay
|
|
|
|
|
|
self:AddTransition( { "Guarded", "Empty" }, "Attack", "Attacked" )
|
|
|
|
--- Attack Handler OnBefore for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnBeforeAttack
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Attack Handler OnAfter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnAfterAttack
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Attack Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] Attack
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
|
|
--- Attack Asynchronous Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] __Attack
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #number Delay
|
|
|
|
self:AddTransition( { "Guarded", "Attacked", "Empty" }, "Capture", "Captured" )
|
|
|
|
--- Capture Handler OnBefore for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnBeforeCapture
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Capture Handler OnAfter for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] OnAfterCapture
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Capture Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] Capture
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
|
|
--- Capture Asynchronous Trigger for ZONE_GOAL_COALITION
|
|
-- @function [parent=#ZONE_GOAL_COALITION] __Capture
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param #number Delay
|
|
|
|
return self
|
|
end
|
|
|
|
|
|
--- Set the owning coalition of the zone.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @param DCSCoalition.DCSCoalition#coalition Coalition
|
|
function ZONE_GOAL_COALITION:SetCoalition( Coalition )
|
|
self.Coalition = Coalition
|
|
end
|
|
|
|
|
|
--- Get the owning coalition of the zone.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @return DCSCoalition.DCSCoalition#coalition Coalition.
|
|
function ZONE_GOAL_COALITION:GetCoalition()
|
|
return self.Coalition
|
|
end
|
|
|
|
|
|
--- Get the owning coalition name of the zone.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
-- @return #string Coalition name.
|
|
function ZONE_GOAL_COALITION:GetCoalitionName()
|
|
|
|
if self.Coalition == coalition.side.BLUE then
|
|
return "Blue"
|
|
end
|
|
|
|
if self.Coalition == coalition.side.RED then
|
|
return "Red"
|
|
end
|
|
|
|
if self.Coalition == coalition.side.NEUTRAL then
|
|
return "Neutral"
|
|
end
|
|
|
|
return ""
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsGuarded()
|
|
|
|
local IsGuarded = self.Zone:IsAllInZoneOfCoalition( self.Coalition )
|
|
self:E( { IsGuarded = IsGuarded } )
|
|
return IsGuarded
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsEmpty()
|
|
|
|
local IsEmpty = self.Zone:IsNoneInZone()
|
|
self:E( { IsEmpty = IsEmpty } )
|
|
return IsEmpty
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsCaptured()
|
|
|
|
local IsCaptured = self.Zone:IsAllInZoneOfOtherCoalition( self.Coalition )
|
|
self:E( { IsCaptured = IsCaptured } )
|
|
return IsCaptured
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsAttacked()
|
|
|
|
local IsAttacked = self.Zone:IsSomeInZoneOfCoalition( self.Coalition )
|
|
self:E( { IsAttacked = IsAttacked } )
|
|
return IsAttacked
|
|
end
|
|
|
|
|
|
|
|
--- Mark.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
function ZONE_GOAL_COALITION:Mark()
|
|
|
|
local Coord = self.Zone:GetCoordinate()
|
|
local ZoneName = self:GetZoneName()
|
|
local State = self:GetState()
|
|
|
|
if self.MarkRed and self.MarkBlue then
|
|
self:E( { MarkRed = self.MarkRed, MarkBlue = self.MarkBlue } )
|
|
Coord:RemoveMark( self.MarkRed )
|
|
Coord:RemoveMark( self.MarkBlue )
|
|
end
|
|
|
|
if self.Coalition == coalition.side.BLUE then
|
|
self.MarkBlue = Coord:MarkToCoalitionBlue( "Guard Zone: " .. ZoneName .. "\nStatus: " .. State )
|
|
self.MarkRed = Coord:MarkToCoalitionRed( "Capture Zone: " .. ZoneName .. "\nStatus: " .. State )
|
|
else
|
|
self.MarkRed = Coord:MarkToCoalitionRed( "Guard Zone: " .. ZoneName .. "\nStatus: " .. State )
|
|
self.MarkBlue = Coord:MarkToCoalitionBlue( "Capture Zone: " .. ZoneName .. "\nStatus: " .. State )
|
|
end
|
|
end
|
|
|
|
--- Bound.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
function ZONE_GOAL_COALITION:onenterGuarded()
|
|
|
|
--self:GetParent( self ):onenterGuarded()
|
|
|
|
if self.Coalition == coalition.side.BLUE then
|
|
--elf.ProtectZone:BoundZone( 12, country.id.USA )
|
|
else
|
|
--self.ProtectZone:BoundZone( 12, country.id.RUSSIA )
|
|
end
|
|
|
|
self:Mark()
|
|
|
|
end
|
|
|
|
function ZONE_GOAL_COALITION:onenterCaptured()
|
|
|
|
--self:GetParent( self ):onenterCaptured()
|
|
|
|
local NewCoalition = self.Zone:GetCoalition()
|
|
self:E( { NewCoalition = NewCoalition } )
|
|
self:SetCoalition( NewCoalition )
|
|
|
|
self:Mark()
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:onenterEmpty()
|
|
|
|
--self:GetParent( self ):onenterEmpty()
|
|
|
|
self:Mark()
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:onenterAttacked()
|
|
|
|
--self:GetParent( self ):onenterAttacked()
|
|
|
|
self:Mark()
|
|
end
|
|
|
|
|
|
--- When started, check the Coalition status.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
function ZONE_GOAL_COALITION:onafterGuard()
|
|
|
|
--self:E({BASE:GetParent( self )})
|
|
--BASE:GetParent( self ).onafterGuard( self )
|
|
|
|
if not self.SmokeScheduler then
|
|
self.SmokeScheduler = self:ScheduleRepeat( 1, 1, 0.1, nil, self.StatusSmoke, self )
|
|
end
|
|
if not self.ScheduleStatusZone then
|
|
self.ScheduleStatusZone = self:ScheduleRepeat( 15, 15, 0.1, nil, self.StatusZone, self )
|
|
end
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsCaptured()
|
|
|
|
local IsCaptured = self.Zone:IsAllInZoneOfOtherCoalition( self.Coalition )
|
|
self:E( { IsCaptured = IsCaptured } )
|
|
return IsCaptured
|
|
end
|
|
|
|
|
|
function ZONE_GOAL_COALITION:IsAttacked()
|
|
|
|
local IsAttacked = self.Zone:IsSomeInZoneOfCoalition( self.Coalition )
|
|
self:E( { IsAttacked = IsAttacked } )
|
|
return IsAttacked
|
|
end
|
|
|
|
--- Check status Coalition ownership.
|
|
-- @param #ZONE_GOAL_COALITION self
|
|
function ZONE_GOAL_COALITION:StatusZone()
|
|
|
|
local State = self:GetState()
|
|
self:E( { State = self:GetState() } )
|
|
|
|
self.Zone:Scan()
|
|
|
|
if State ~= "Guarded" and self:IsGuarded() then
|
|
self:Guard()
|
|
end
|
|
|
|
if State ~= "Empty" and self:IsEmpty() then
|
|
self:Empty()
|
|
end
|
|
|
|
if State ~= "Attacked" and self:IsAttacked() then
|
|
self:Attack()
|
|
end
|
|
|
|
if State ~= "Captured" and self:IsCaptured() then
|
|
self:Capture()
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|