/* * Copyright 2022 Peter Han * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ using System; namespace PeterHan.PLib.Core { /// /// Contains tools for dealing with state machines. /// public static class PStateMachines { /// /// Creates and initializes a new state. This method should be used in a postfix patch /// on InitializeStates if new states are to be added. /// /// The state machine type. /// The state machine Instance type. /// The base state machine. /// The state name. /// The new state. public static GameStateMachine.State CreateState( this GameStateMachine sm, string name) where T : GameStateMachine where I : GameStateMachine.GameInstance { var state = new GameStateMachine.State(); if (string.IsNullOrEmpty(name)) name = "State"; if (sm == null) throw new ArgumentNullException(nameof(sm)); state.defaultState = sm.GetDefaultState(); // Process any sub parameters sm.CreateStates(state); sm.BindState(sm.root, state, name); return state; } /// /// Creates and initializes a new state. This method should be used in a postfix patch /// on InitializeStates if new states are to be added. /// /// The state machine type. /// The state machine Instance type. /// The state machine Target type. /// The base state machine. /// The state name. /// The new state. public static GameStateMachine.State CreateState( this GameStateMachine sm, string name) where M : IStateMachineTarget where T : GameStateMachine where I : GameStateMachine.GameInstance { var state = new GameStateMachine.State(); if (string.IsNullOrEmpty(name)) name = "State"; if (sm == null) throw new ArgumentNullException(nameof(sm)); state.defaultState = sm.GetDefaultState(); // Process any sub parameters sm.CreateStates(state); sm.BindState(sm.root, state, name); return state; } /// /// Clears the existing Enter actions on a state. /// /// The state to modify. public static void ClearEnterActions(this StateMachine.BaseState state) { if (state != null) state.enterActions.Clear(); } /// /// Clears the existing Exit actions on a state. /// /// The state to modify. public static void ClearExitActions(this StateMachine.BaseState state) { if (state != null) state.exitActions.Clear(); } /// /// Clears the existing Transition actions on a state. Parameter transitions are not /// affected. /// /// The state to modify. public static void ClearTransitions(this StateMachine.BaseState state) { if (state != null) state.transitions.Clear(); } } }