| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //namespace Animancer.FSM{    public partial class StateMachine<TKey, TState>    {        /// <summary>        /// A simple system that can <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.State"/> a state then        /// try to enter it every time <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.Update(float)"/> is        /// called until the <see cref="StateMachine{TState}.InputBuffer{TStateMachine}.TimeOut"/> expires.        /// </summary>        ///         /// <remarks>        /// <para></para>        /// <strong>Documentation:</strong>        /// <see href="https://kybernetik.com.au/animancer/docs/manual/fsm/utilities#input-buffers">        /// Input Buffers</see>        /// <para></para>        /// See <see cref="StateMachine{TState}.InputBuffer{TStateMachine}"/> for example usage.        /// </remarks>        ///         /// https://kybernetik.com.au/animancer/api/Animancer.FSM/InputBuffer        ///         public new class InputBuffer : InputBuffer<StateMachine<TKey, TState>>        {            /************************************************************************************************************************/            /// <summary>The <typeparamref name="TKey"/> of the state this buffer is currently attempting to enter.</summary>            public TKey Key { get; set; }            /************************************************************************************************************************/            /// <summary>Creates a new <see cref="InputBuffer"/>.</summary>            public InputBuffer() { }            /// <summary>Creates a new <see cref="InputBuffer"/> for the specified `stateMachine`.</summary>            public InputBuffer(StateMachine<TKey, TState> stateMachine)                : base(stateMachine)            { }            /************************************************************************************************************************/            /// <summary>            /// If a state is registered with the `key`, this method calls <see cref="Buffer(TKey, TState, float)"/>            /// and returns true. Otherwise it returns false.            /// </summary>            /// <remarks>Doesn't actually attempt to enter the state until <see cref="Update(float)"/> is called.</remarks>            public bool Buffer(TKey key, float timeOut)            {                if (StateMachine.TryGetValue(key, out var state))                {                    Buffer(key, state, timeOut);                    return true;                }                else return false;            }            /// <summary>            /// Sets the <see cref="Key"/>, <see cref="StateMachine{TState}.InputBuffer.State"/>, and            /// <see cref="TimeOut"/>.            /// </summary>            /// <remarks>Doesn't actually attempt to enter the state until <see cref="Update(float)"/> is called.</remarks>            public void Buffer(TKey key, TState state, float timeOut)            {                Key = key;                Buffer(state, timeOut);            }            /************************************************************************************************************************/            /// <inheritdoc/>            protected override bool TryEnterState()                => StateMachine.TryResetState(Key, State);            /************************************************************************************************************************/            /// <inheritdoc/>            public override void Clear()            {                base.Clear();                Key = default;            }            /************************************************************************************************************************/        }    }}
 |