Skip to content

Instantly share code, notes, and snippets.

@Tr0sT
Created November 22, 2022 16:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tr0sT/e0010bc801d26a46cd473be5874b3ff1 to your computer and use it in GitHub Desktop.
Save Tr0sT/e0010bc801d26a46cd473be5874b3ff1 to your computer and use it in GitHub Desktop.
#nullable enable
using System;
using GUI.Bender;
using NuclearBand;
using Stateless;
using UnityEngine;
using UnityEngine.EventSystems;
namespace Bender
{
public class BenderStateMachine : IDisposable
{
public enum BenderState
{
None,
Moving,
Bolt,
Wrench,
Pistol,
Scissors,
Paused
}
public enum BenderStateMachineTrigger
{
Move,
ChooseBolt,
Wrench,
Pistol,
Scissors,
CancelTurn,
EndTrigger,
Restart,
Pause,
Unpause
}
private readonly BenderMoveController _moveController;
private readonly StateMachine<BenderState, BenderStateMachineTrigger> _stateMachine;
private readonly StateMachine<BenderState, BenderStateMachineTrigger>.TriggerWithParameters<Vector2Int> _boltTrigger;
private readonly StateMachine<BenderState, BenderStateMachineTrigger>.TriggerWithParameters<MoveDirection> _moveTrigger;
public BenderStateMachine(BenderMoveController moveController, WrenchController wrenchController, ScissorsController scissorsController, PistolController pistolController, BenderMoveHistory moveHistory)
{
_moveController = moveController;
_stateMachine = new StateMachine<BenderState, BenderStateMachineTrigger>(BenderState.None);
_boltTrigger = _stateMachine.SetTriggerParameters<Vector2Int>(BenderStateMachineTrigger.ChooseBolt);
_moveTrigger = _stateMachine.SetTriggerParameters<MoveDirection>(BenderStateMachineTrigger.Move);
_stateMachine.Configure(BenderState.None)
.Permit(BenderStateMachineTrigger.Move, BenderState.Moving)
.Permit(BenderStateMachineTrigger.ChooseBolt, BenderState.Bolt)
.Permit(BenderStateMachineTrigger.Wrench, BenderState.Wrench)
.Permit(BenderStateMachineTrigger.Pistol, BenderState.Pistol)
.Permit(BenderStateMachineTrigger.Scissors, BenderState.Scissors)
.PermitReentry(BenderStateMachineTrigger.CancelTurn)
.OnEntryFrom(BenderStateMachineTrigger.CancelTurn, moveHistory.CancelTurn)
.PermitReentry(BenderStateMachineTrigger.Restart)
.OnEntryFrom(BenderStateMachineTrigger.Restart, moveHistory.Restart)
.Permit(BenderStateMachineTrigger.Pause, BenderState.Paused);
_stateMachine.Configure(BenderState.Moving)
.Permit(BenderStateMachineTrigger.EndTrigger, BenderState.None)
.OnEntryFrom(_moveTrigger, Move);
_stateMachine.Configure(BenderState.Bolt)
.Permit(BenderStateMachineTrigger.EndTrigger, BenderState.None)
.PermitReentry(BenderStateMachineTrigger.ChooseBolt)
.Permit(BenderStateMachineTrigger.Wrench, BenderState.Wrench)
.Permit(BenderStateMachineTrigger.Pistol, BenderState.Pistol)
.Permit(BenderStateMachineTrigger.Scissors, BenderState.Scissors)
.Permit(BenderStateMachineTrigger.CancelTurn, BenderState.None)
.OnEntryFrom(_boltTrigger, wrenchController.StartBolt)
.OnExit(t =>
{
if (t.Trigger == BenderStateMachineTrigger.EndTrigger)
return;
wrenchController.FinishBolt();
});
_stateMachine.Configure(BenderState.Wrench)
.Permit(BenderStateMachineTrigger.EndTrigger, BenderState.None)
.Permit(BenderStateMachineTrigger.ChooseBolt, BenderState.Bolt)
.Permit(BenderStateMachineTrigger.Wrench, BenderState.None)
.Permit(BenderStateMachineTrigger.Pistol, BenderState.Pistol)
.Permit(BenderStateMachineTrigger.Scissors, BenderState.Scissors)
.Permit(BenderStateMachineTrigger.CancelTurn, BenderState.None)
.OnEntry(wrenchController.Start)
.OnExit(wrenchController.Finish);
_stateMachine.Configure(BenderState.Pistol)
.Permit(BenderStateMachineTrigger.EndTrigger, BenderState.None)
.Permit(BenderStateMachineTrigger.ChooseBolt, BenderState.Bolt)
.Permit(BenderStateMachineTrigger.Wrench, BenderState.Wrench)
.Permit(BenderStateMachineTrigger.Pistol, BenderState.None)
.Permit(BenderStateMachineTrigger.Scissors, BenderState.Scissors)
.Permit(BenderStateMachineTrigger.CancelTurn, BenderState.None)
.OnEntry(pistolController.Start)
.OnExit(pistolController.Finish);
_stateMachine.Configure(BenderState.Scissors)
.Permit(BenderStateMachineTrigger.EndTrigger, BenderState.None)
.Permit(BenderStateMachineTrigger.ChooseBolt, BenderState.Bolt)
.Permit(BenderStateMachineTrigger.Wrench, BenderState.Wrench)
.Permit(BenderStateMachineTrigger.Pistol, BenderState.Pistol)
.Permit(BenderStateMachineTrigger.Scissors, BenderState.None)
.Permit(BenderStateMachineTrigger.CancelTurn, BenderState.None)
.OnEntry(scissorsController.Start)
.OnExit(scissorsController.Finish);
_stateMachine.Configure(BenderState.Paused)
.Permit(BenderStateMachineTrigger.Unpause, BenderState.None)
.Permit(BenderStateMachineTrigger.Restart, BenderState.None);
_stateMachine.OnUnhandledTrigger((state, trigger) => { });
SignalBus.Subscribe<MoveSwipeSignal>(OnMoveSwipeSignalCallback);
SignalBus.Subscribe<MovingSequenceFinishSignal>(OnMovingSequenceFinishSignalCallback);
SignalBus.Subscribe<BoltStartSignal>(OnBoltStartSignalCallback);
SignalBus.Subscribe<BoltFinishSignal>(OnBoltFinishSignalCallback);
SignalBus.Subscribe<WrenchStartSignal>(OnWrenchStartSignalCallback);
SignalBus.Subscribe<WrenchFinishSignal>(OnWrenchFinishSignalCallback);
SignalBus.Subscribe<ScissorsStartSignal>(OnScissorsStartSignalCallback);
SignalBus.Subscribe<ScissorsFinishSignal>(OnScissorsFinishSignalCallback);
SignalBus.Subscribe<PistolStartSignal>(OnPistolStartSignalCallback);
SignalBus.Subscribe<PistolFinishSignal>(OnPistolFinishSignalCallback);
SignalBus.Subscribe<CancelTurnSignal>(OnCancelTurnSignalCallback);
SignalBus.Subscribe<RestartSignal>(OnRestartSignalCallback);
SignalBus.Subscribe<PauseSignal>(OnPauseSignalCallback);
SignalBus.Subscribe<UnPauseSignal>(OnUnPauseSignalCallback);
}
private void OnUnPauseSignalCallback(UnPauseSignal signal) => _stateMachine.Fire(BenderStateMachineTrigger.Unpause);
private void OnPauseSignalCallback(PauseSignal signal) => _stateMachine.Fire(BenderStateMachineTrigger.Pause);
private void OnBoltStartSignalCallback(BoltStartSignal boltStartSignal) => _stateMachine.Fire(_boltTrigger, boltStartSignal.BoltPosition);
private void OnBoltFinishSignalCallback(BoltFinishSignal obj) => End();
private void OnMovingSequenceFinishSignalCallback(MovingSequenceFinishSignal obj) => End();
private void OnWrenchStartSignalCallback(WrenchStartSignal obj) => _stateMachine.Fire(BenderStateMachineTrigger.Wrench);
private void OnWrenchFinishSignalCallback(WrenchFinishSignal obj) => End();
private void OnScissorsStartSignalCallback(ScissorsStartSignal obj) => _stateMachine.Fire(BenderStateMachineTrigger.Scissors);
private void OnScissorsFinishSignalCallback(ScissorsFinishSignal obj) => End();
private void OnPistolFinishSignalCallback(PistolFinishSignal obj) => End();
private void OnMoveSwipeSignalCallback(MoveSwipeSignal moveSwipeSignal) => _stateMachine.Fire(_moveTrigger, moveSwipeSignal.MoveDirection);
private void OnPistolStartSignalCallback(PistolStartSignal obj) => _stateMachine.Fire(BenderStateMachineTrigger.Pistol);
private void Move(MoveDirection moveDirection) => _moveController.Move(moveDirection);
private void End() => _stateMachine.Fire(BenderStateMachineTrigger.EndTrigger);
private void OnCancelTurnSignalCallback(CancelTurnSignal obj) => _stateMachine.Fire(BenderStateMachineTrigger.CancelTurn);
private void OnRestartSignalCallback(RestartSignal obj) => _stateMachine.Fire(BenderStateMachineTrigger.Restart);
public void Dispose()
{
SignalBus.Unsubscribe<MoveSwipeSignal>(OnMoveSwipeSignalCallback);
SignalBus.Unsubscribe<MovingSequenceFinishSignal>(OnMovingSequenceFinishSignalCallback);
SignalBus.Unsubscribe<BoltStartSignal>(OnBoltStartSignalCallback);
SignalBus.Unsubscribe<BoltFinishSignal>(OnBoltFinishSignalCallback);
SignalBus.Unsubscribe<WrenchStartSignal>(OnWrenchStartSignalCallback);
SignalBus.Unsubscribe<WrenchFinishSignal>(OnWrenchFinishSignalCallback);
SignalBus.Unsubscribe<ScissorsStartSignal>(OnScissorsStartSignalCallback);
SignalBus.Unsubscribe<ScissorsFinishSignal>(OnScissorsFinishSignalCallback);
SignalBus.Unsubscribe<PistolStartSignal>(OnPistolStartSignalCallback);
SignalBus.Unsubscribe<PistolFinishSignal>(OnPistolFinishSignalCallback);
SignalBus.Unsubscribe<CancelTurnSignal>(OnCancelTurnSignalCallback);
SignalBus.Unsubscribe<RestartSignal>(OnRestartSignalCallback);
SignalBus.Unsubscribe<PauseSignal>(OnPauseSignalCallback);
SignalBus.Unsubscribe<UnPauseSignal>(OnUnPauseSignalCallback);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment