Code: Select all
using UnityEngine;
using System;
using System.Collections;
using DaggerfallConnect;
using System.Collections.Generic;
namespace DaggerfallWorkshop.Game
{
public enum TraversalState
{
Canceled,
Frozen,
Ground, // Moving on ground
Water, // Moving along the water
Air, // Moves in the air
Climbing // Moves along walls
}
public enum TraversalCommand
{
CancelMovement,
Freeze,
Walk,
Swim,
Fly,
Climb
}
public class TraversalProcess : MonoBehaviour
{
class StateTransition
{
readonly TraversalState traversalState;
readonly TraversalCommand command;
public StateTransition(TraversalState state, TraversalCommand comm)
{
traversalState = state;
command = comm;
}
public override int GetHashCode()
{
return 17 + 31 * traversalState.GetHashCode() + 31 * command.GetHashCode();
}
public override bool Equals(object obj)
{
StateTransition other = obj as StateTransition;
return other != null && this.traversalState == other.traversalState && this.command == other.command;
}
}
Dictionary<StateTransition, TraversalState> transitions;
public TraversalState MyState { get; private set; }
public TraversalProcess()
{
MyState = TraversalState.Frozen;
transitions = new Dictionary<StateTransition, TraversalState>
{
{ new StateTransition(TraversalState.Frozen, TraversalCommand.Walk), TraversalState.Ground },
{ new StateTransition(TraversalState.Frozen, TraversalCommand.Swim), TraversalState.Water },
// add more transitions that can occur with traversal commands, and show which state it is changed to with that command.
};
}
public TraversalState GetNext(TraversalCommand command)
{
StateTransition transition = new StateTransition(MyState, command);
TraversalState nextState;
if (!transitions.TryGetValue(transition, out nextState))
throw new Exception("Invalid transition: " + MyState + " -> " + command);
return nextState;
}
public TraversalState MoveNext(TraversalCommand command)
{
MyState = GetNext(command);
return MyState;
}
}
}