This commit is contained in:
FlightControl_Master
2017-10-04 17:12:05 +02:00
parent 454c0e5543
commit feef4c148e
7 changed files with 244 additions and 374 deletions

View File

@@ -45,8 +45,11 @@ do -- Goal
ClassName = "GOAL",
}
--- @field #table GOAL.States
GOAL.States = {}
--- @field #table GOAL.Players
GOAL.Players = {}
--- @field #number GOAL.TotalContributions
GOAL.TotalContributions = 0
--- GOAL Constructor.
-- @param #GOAL self
@@ -56,51 +59,6 @@ do -- Goal
local self = BASE:Inherit( self, FSM:New() ) -- #GOAL
self:F( {} )
do
--- On State for GOAL
-- @field GOAL.On
--- On State Handler OnLeave for GOAL
-- @function [parent=#GOAL] OnLeaveOn
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- On State Handler OnEnter for GOAL
-- @function [parent=#GOAL] OnEnterOn
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
end
do
--- Off State for GOAL
-- @field GOAL.Off
--- Off State Handler OnLeave for GOAL
-- @function [parent=#GOAL] OnLeaveOff
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- Off State Handler OnEnter for GOAL
-- @function [parent=#GOAL] OnEnterOff
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
end
--- Achieved State for GOAL
-- @field GOAL.Achieved
@@ -120,86 +78,7 @@ do -- Goal
-- @param #string To
self:SetStartState( "Idle" )
self:AddTransition( "Idle", "Start", "On" )
--- Start Handler OnBefore for GOAL
-- @function [parent=#GOAL] OnBeforeStart
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- Start Handler OnAfter for GOAL
-- @function [parent=#GOAL] OnAfterStart
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
--- Start Trigger for GOAL
-- @function [parent=#GOAL] Start
-- @param #GOAL self
--- Start Asynchronous Trigger for GOAL
-- @function [parent=#GOAL] __Start
-- @param #GOAL self
-- @param #number Delay
self:AddTransition( "On", "Stop", "Idle" )
--- Stop Handler OnBefore for GOAL
-- @function [parent=#GOAL] OnBeforeStop
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- Stop Handler OnAfter for GOAL
-- @function [parent=#GOAL] OnAfterStop
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
--- Stop Trigger for GOAL
-- @function [parent=#GOAL] Stop
-- @param #GOAL self
--- Stop Asynchronous Trigger for GOAL
-- @function [parent=#GOAL] __Stop
-- @param #GOAL self
-- @param #number Delay
self:AddTransition( "On", "IsAchieved", "On" )
--- IsAchieved Handler OnBefore for GOAL
-- @function [parent=#GOAL] OnBeforeIsAchieved
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- IsAchieved Handler OnAfter for GOAL
-- @function [parent=#GOAL] OnAfterIsAchieved
-- @param #GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
--- IsAchieved Trigger for GOAL
-- @function [parent=#GOAL] IsAchieved
-- @param #GOAL self
--- IsAchieved Asynchronous Trigger for GOAL
-- @function [parent=#GOAL] __IsAchieved
-- @param #GOAL self
-- @param #number Delay
self:SetStartState( "Pending" )
self:AddTransition( "*", "Achieved", "Achieved" )
--- Achieved Handler OnBefore for GOAL
@@ -226,9 +105,6 @@ do -- Goal
-- @param #GOAL self
-- @param #number Delay
self.AchievedScheduler = nil
self:SetEventPriority( 5 )
return self
@@ -236,30 +112,38 @@ do -- Goal
--- @param #GOAL self
-- @param From
-- @param Event
-- @param To
function GOAL:onafterOn( From, Event, To )
if not self.AchievedScheduler then
self.AchievedScheduler = self:ScheduleRepeat( 15, 15, 0, nil, self.CheckAchieved, self )
end
-- @param #string PlayerName
function GOAL:AddPlayerContribution( PlayerName )
self.Players[PlayerName] = self.Players[PlayerName] or 0
self.Players[PlayerName] = self.Players[PlayerName] + 1
self.TotalContributions = self.TotalContributions + 1
end
--- @param #GOAL self
-- @param #number Player contribution.
function GOAL:GetPlayerContribution( PlayerName )
return self.Players[PlayerName] or 0
end
--- @param #GOAL self
-- @param From
-- @param Event
-- @param To
function GOAL:onafterOff( From, Event, To )
self:ScheduleStop( self.CheckAchieved )
self.ArchievedScheduler = nil
function GOAL:GetPlayerContributions()
return self.Players or {}
end
--- @param #GOAL self
-- @param From
-- @param Event
-- @param To
function GOAL:CheckAchieved( From, Event, To )
self:IsAchieved()
function GOAL:GetTotalContributions()
return self.TotalContributions or 0
end
--- @param #GOAL self
-- @return #boolean true if the goal is Achieved
function GOAL:IsAchieved()
return self:Is( "Achieved" )
end
end

View File

@@ -43,9 +43,6 @@ do -- Zone
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.
@@ -58,101 +55,20 @@ do -- Zone
self.Zone = Zone -- Core.Zone#ZONE_BASE
self.Goal = GOAL:New()
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
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
end
self:AddTransition( "*", "Guard", "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", "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
self:AddTransition( "*", "DestroyedUnit", "*" )
--- DestroyedUnit Handler OnAfter for ZONE_GOAL
-- @function [parent=#ZONE_GOAL] OnAfterDestroyedUnit
-- @param #ZONE_GOAL self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @param Wrapper.Unit#UNIT DestroyedUnit The destroyed unit.
-- @param #string PlayerName The name of the player.
return self
end
@@ -171,6 +87,7 @@ do -- Zone
return self.Zone:GetName()
end
--- Smoke the center of theh zone.
-- @param #ZONE_GOAL self
-- @param #SMOKECOLOR.Color SmokeColor
@@ -204,41 +121,7 @@ do -- Zone
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()
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
end
--- Check status Smoke.
-- @param #ZONE_GOAL self
function ZONE_GOAL:StatusSmoke()
@@ -255,5 +138,34 @@ do -- Zone
end
end
end
--- @param #ZONE_GOAL self
-- @param Event#EVENTDATA EventData
function ZONE_GOAL:__Destroyed( EventData )
self:T( { "EventDead", EventData } )
if EventData.IniDCSUnit then
if EventData.IniUnit:IsInZone( self:GetZone() ) then
local PlayerHits = _DATABASE.HITS[EventData.IniUnitName]
if PlayerHits then
for PlayerName, PlayerHit in pairs( PlayerHits ) do
self.Goal:AddPlayerContribution( PlayerName )
self:DestroyedUnit( EventData.IniUnitName, PlayerName )
end
end
end
end
end
--- Activate the event UnitDestroyed to be fired when a unit is destroyed in the zone.
-- @param #ZONE_GOAL self
function ZONE_GOAL:MonitorDestroyedUnits()
self:HandleEvent( EVENTS.Dead, self.__Destroyed )
self:HandleEvent( EVENTS.Crash, self.__Destroyed )
end
end

View File

@@ -16,10 +16,10 @@
do -- ZoneGoal
--- @type ZONE_GOAL_COALITION
-- @extends Core.ZoneGoal#ZONE_GOAL
-- @extends Core.ZoneGoal#ZONE_GOAL_COALITION
--- # ZONE_GOAL_COALITION class, extends @{ZoneGoal#ZONE_GOAL}
--- # ZONE_GOAL_COALITION class, extends @{ZoneGoal#ZONE_GOAL_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.
@@ -67,7 +67,7 @@ do -- ZoneGoal
-- @return #ZONE_GOAL_COALITION
function ZONE_GOAL_COALITION:New( Zone, Coalition )
local self = BASE:Inherit( self, ZONE_GOAL:New( Zone ) ) -- #ZONE_GOAL_COALITION
local self = BASE:Inherit( self, ZONE_GOAL_COALITION:New( Zone ) ) -- #ZONE_GOAL_COALITION
self:F( { Zone = Zone, Coalition = Coalition } )
self:SetCoalition( Coalition )
@@ -110,10 +110,98 @@ do -- ZoneGoal
-- @param #string To
end
do
self:E( { Guarded = "Guarded" } )
--- 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" )
@@ -214,7 +302,16 @@ do -- ZoneGoal
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 )
@@ -300,7 +397,7 @@ do -- ZoneGoal
--- When started, check the Coalition status.
-- @param #ZONE_GOAL self
-- @param #ZONE_GOAL_COALITION self
function ZONE_GOAL_COALITION:onafterGuard()
--self:E({BASE:GetParent( self )})
@@ -334,11 +431,21 @@ do -- ZoneGoal
-- @param #ZONE_GOAL_COALITION self
function ZONE_GOAL_COALITION:StatusZone()
local State = self:GetState()
self:E( { State = self:GetState() } )
self:GetParent( self, ZONE_GOAL_COALITION ).StatusZone( self )
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