Files
SoaFE/DATA/SCRIPTS/LIBRARY/PGSTATEMACHINE.LUA
2026-02-28 14:00:45 -06:00

198 lines
5.7 KiB
Lua

-- $Id: //depot/Projects/StarWars_Expansion/Run/Data/Scripts/Library/PGStateMachine.lua#1 $
--/////////////////////////////////////////////////////////////////////////////////////////////////
--
-- (C) Petroglyph Games, Inc.
--
--
-- ***** ** * *
-- * ** * * *
-- * * * * *
-- * * * * * * * *
-- * * *** ****** * ** **** *** * * * ***** * ***
-- * ** * * * ** * ** ** * * * * ** ** ** *
-- *** ***** * * * * * * * * ** * * * *
-- * * * * * * * * * * * * * * *
-- * * * * * * * * * * ** * * * *
-- * ** * * ** * ** * * ** * * * *
-- ** **** ** * **** ***** * ** *** * *
-- * * *
-- * * *
-- * * *
-- * * * *
-- **** * *
--
--/////////////////////////////////////////////////////////////////////////////////////////////////
-- C O N F I D E N T I A L S O U R C E C O D E -- D O N O T D I S T R I B U T E
--/////////////////////////////////////////////////////////////////////////////////////////////////
--
-- $File: //depot/Projects/StarWars_Expansion/Run/Data/Scripts/Library/PGStateMachine.lua $
--
-- Original Author: Brian Hayes
--
-- $Author: Andre_Arsenault $
--
-- $Change: 37816 $
--
-- $DateTime: 2006/02/15 15:33:33 $
--
-- $Revision: #1 $
--
--/////////////////////////////////////////////////////////////////////////////////////////////////
require("pgcommands")
--
-- Define_State -- Define a new state in the state machine table.
--
-- @param state This is the tag used to identify the state. Usually
-- a text value or a number
-- @param function_value This is the function value that will process
-- all the messages associated with the given state.
-- @since 4/22/2005 7:26:01 PM -- BMH
--
function Define_State(state, function_value)
local curproc = StateMachine[state]
if curproc == nil then
StateMachineIndexes[DefineStateIndex] = state
StateMachineIndexLookup[state] = DefineStateIndex
DefineStateIndex = DefineStateIndex + 1
end
StateMachine[state] = function_value
if NextState == nil then
NextState = state
end
end
--
-- Advance_State -- Advance to the next state based on the
-- order of state definition
--
-- @since 4/22/2005 7:26:01 PM -- BMH
--
function Advance_State()
NextState = StateMachineIndexes[CurrentStateIndex + 1]
end
--
-- Set_Next_State -- Set the next state to transition to.
--
-- @param state tag specifying the state to transition to.
-- @since 4/22/2005 7:26:01 PM -- BMH
--
function Set_Next_State(state)
if state == nil or StateMachine[state] ~= nil then
NextState = state
end
end
--
-- Get_Current_State -- Returns what the current state is.
--
-- @return object detailing what the current state is.
-- @since 4/22/2005 7:12:14 PM -- BMH
--
function Get_Current_State()
return CurrentState
end
--
-- Get_Next_State -- Returns what the next state will be.
--
-- @return object detailing what the next state will be.
-- @since 4/22/2005 7:12:14 PM -- BMH
--
function Get_Next_State()
return NextState
end
--
-- Process_States -- This function is called to advance the State Machine through it's states
--
-- @since 4/22/2005 7:12:14 PM -- BMH
--
function Process_States()
while NextState ~= nil do
_curproc = StateMachine[NextState]
if type(_curproc) == "function" then
CurrentState = NextState
CurrentStateIndex = StateMachineIndexLookup[CurrentState]
_curproc(OnEnter)
while CurrentState == NextState do
_curproc(OnUpdate)
if CurrentState == NextState then
PumpEvents()
end
end
_curproc(OnExit)
DebugMessage("%s -- Advancing state from %s to %s.", tostring(Script), tostring(CurrentState), tostring(NextState))
else
ScriptError("%s -- Invalid State: %s, Function: %s", tostring(Script), tostring(NextState), tostring(_curproc))
NextState = nil
end
end
end
--
-- Base_Definitions -- This function is called once when the script is first created.
--
-- @since 4/22/2005 6:04:55 PM -- BMH
--
function Base_Definitions()
DebugMessage("%s -- In Base_Definitions", tostring(Script))
Common_Base_Definitions()
StateMachine = {}
StateMachineIndexes = {}
StateMachineIndexLookup = {}
OnEnter = 1
OnUpdate = 2
OnExit = 3
CurrentStateIndex = 1
DefineStateIndex = 1
NextState = nil
CurrentState = nil
_curproc = nil
StoryModeEvents = nil
-- This controls how often the script is serviced.
-- So try to process 5 times a second
ServiceRate = 0.2
if Definitions then
Definitions()
end
if PG_Story_Mode_Init then
PG_Story_Mode_Init()
end
end
--
-- main -- This is the main thread function for this script.
-- Upon return from this function the script will finish and be
-- destroyed by the system.
--
-- @since 4/22/2005 6:04:55 PM -- BMH
--
function main()
-- Enter your list of commands to execute here...
Process_States()
DebugMessage("%s -- Exiting.", tostring(Script))
-- ScriptExit will end the script no matter what state it's in.
ScriptExit()
end