mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
184 lines
5.3 KiB
Lua
184 lines
5.3 KiB
Lua
--- **Core** - Models the process to achieve goal(s).
|
|
--
|
|
-- ===
|
|
--
|
|
-- ## Features:
|
|
--
|
|
-- * Define the goal.
|
|
-- * Monitor the goal achievement.
|
|
-- * Manage goal contribution by players.
|
|
--
|
|
-- ===
|
|
--
|
|
-- Classes that implement a goal achievement, will derive from GOAL to implement the ways how the achievements can be realized.
|
|
--
|
|
-- ===
|
|
--
|
|
-- ### Author: **FlightControl**
|
|
--
|
|
-- ===
|
|
--
|
|
-- @module Core.Goal
|
|
-- @image Core_Goal.JPG
|
|
|
|
|
|
do -- Goal
|
|
|
|
--- @type GOAL
|
|
-- @extends Core.Fsm#FSM
|
|
|
|
|
|
--- Models processes that have an objective with a defined achievement. Derived classes implement the ways how the achievements can be realized.
|
|
--
|
|
-- # 1. GOAL constructor
|
|
--
|
|
-- * @{#GOAL.New}(): Creates a new GOAL object.
|
|
--
|
|
-- # 2. GOAL is a finite state machine (FSM).
|
|
--
|
|
-- ## 2.1. GOAL States
|
|
--
|
|
-- * **Pending**: The goal object is in progress.
|
|
-- * **Achieved**: The goal objective is Achieved.
|
|
--
|
|
-- ## 2.2. GOAL Events
|
|
--
|
|
-- * **Achieved**: Set the goal objective to Achieved.
|
|
--
|
|
-- # 3. Player contributions.
|
|
--
|
|
-- Goals are most of the time achieved by players. These player achievements can be registered as part of the goal achievement.
|
|
-- Use @{#GOAL.AddPlayerContribution}() to add a player contribution to the goal.
|
|
-- The player contributions are based on a points system, an internal counter per player.
|
|
-- So once the goal has been achieved, the player contributions can be queried using @{#GOAL.GetPlayerContributions}(),
|
|
-- that retrieves all contributions done by the players. For one player, the contribution can be queried using @{#GOAL.GetPlayerContribution}().
|
|
-- The total amount of player contributions can be queried using @{#GOAL.GetTotalContributions}().
|
|
--
|
|
-- # 4. Goal achievement.
|
|
--
|
|
-- Once the goal is achieved, the mission designer will need to trigger the goal achievement using the **Achieved** event.
|
|
-- The underlying 2 examples will achieve the goals for the `Goal` object:
|
|
--
|
|
-- Goal:Achieved() -- Achieve the goal immediately.
|
|
-- Goal:__Achieved( 30 ) -- Achieve the goal within 30 seconds.
|
|
--
|
|
-- # 5. Check goal achievement.
|
|
--
|
|
-- The method @{#GOAL.IsAchieved}() will return true if the goal is achieved (the trigger **Achieved** was executed).
|
|
-- You can use this method to check asynchronously if a goal has been achieved, for example using a scheduler.
|
|
--
|
|
-- @field #GOAL
|
|
GOAL = {
|
|
ClassName = "GOAL",
|
|
}
|
|
|
|
--- @field #table GOAL.Players
|
|
GOAL.Players = {}
|
|
|
|
--- @field #number GOAL.TotalContributions
|
|
GOAL.TotalContributions = 0
|
|
|
|
--- GOAL Constructor.
|
|
-- @param #GOAL self
|
|
-- @return #GOAL
|
|
function GOAL:New()
|
|
|
|
local self = BASE:Inherit( self, FSM:New() ) -- #GOAL
|
|
self:F( {} )
|
|
|
|
--- Achieved State for GOAL
|
|
-- @field GOAL.Achieved
|
|
|
|
--- Achieved State Handler OnLeave for GOAL
|
|
-- @function [parent=#GOAL] OnLeaveAchieved
|
|
-- @param #GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Achieved State Handler OnEnter for GOAL
|
|
-- @function [parent=#GOAL] OnEnterAchieved
|
|
-- @param #GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
|
|
self:SetStartState( "Pending" )
|
|
self:AddTransition( "*", "Achieved", "Achieved" )
|
|
|
|
--- Achieved Handler OnBefore for GOAL
|
|
-- @function [parent=#GOAL] OnBeforeAchieved
|
|
-- @param #GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
-- @return #boolean
|
|
|
|
--- Achieved Handler OnAfter for GOAL
|
|
-- @function [parent=#GOAL] OnAfterAchieved
|
|
-- @param #GOAL self
|
|
-- @param #string From
|
|
-- @param #string Event
|
|
-- @param #string To
|
|
|
|
--- Achieved Trigger for GOAL
|
|
-- @function [parent=#GOAL] Achieved
|
|
-- @param #GOAL self
|
|
|
|
--- Achieved Asynchronous Trigger for GOAL
|
|
-- @function [parent=#GOAL] __Achieved
|
|
-- @param #GOAL self
|
|
-- @param #number Delay
|
|
|
|
self:SetEventPriority( 5 )
|
|
|
|
return self
|
|
end
|
|
|
|
|
|
--- Add a new contribution by a player.
|
|
-- @param #GOAL self
|
|
-- @param #string PlayerName The name of the player.
|
|
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
|
|
|
|
|
|
--- Get the players who contributed to achieve the goal.
|
|
-- The result is a list of players, sorted by the name of the players.
|
|
-- @param #GOAL self
|
|
-- @return #list The list of players, indexed by the player name.
|
|
function GOAL:GetPlayerContributions()
|
|
return self.Players or {}
|
|
end
|
|
|
|
|
|
--- Gets the total contributions that happened to achieve the goal.
|
|
-- The result is a number.
|
|
-- @param #GOAL self
|
|
-- @return #number The total number of contributions. 0 is returned if there were no contributions (yet).
|
|
function GOAL:GetTotalContributions()
|
|
return self.TotalContributions or 0
|
|
end
|
|
|
|
|
|
|
|
--- Validates if the goal is achieved.
|
|
-- @param #GOAL self
|
|
-- @return #boolean true if the goal is achieved.
|
|
function GOAL:IsAchieved()
|
|
return self:Is( "Achieved" )
|
|
end
|
|
|
|
end |