Created
November 22, 2022 16:16
-
-
Save Tr0sT/e0010bc801d26a46cd473be5874b3ff1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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