private FiniteStateMachine <GameStateType, GameInputType> CreateStateMachine() { FiniteStateMachine <GameStateType, GameInputType> stateMachine = new FiniteStateMachine <GameStateType, GameInputType>(); stateMachine.AddEntryState(GameStateType.Startup); stateMachine.AddState(GameStateType.Playing); stateMachine.AddState(GameStateType.PausedMenu); stateMachine.AddState(GameStateType.InfoMenu); stateMachine.AddState(GameStateType.PlayerDead); stateMachine.AddState(GameStateType.PassivesMenu); stateMachine.AddState(GameStateType.PlayerMenu); stateMachine.AddState(GameStateType.NewPlayerMenu); stateMachine.AddState(GameStateType.WorldMenu); stateMachine.AddState(GameStateType.NewWorldMenu); stateMachine.AddState(GameStateType.MainMenu); stateMachine.AddState(GameStateType.Exit); stateMachine.AddState(GameStateType.LoadingIn); stateMachine.AddState(GameStateType.LoadingOut); stateMachine.AddState(GameStateType.ControlsMenu); // Startup stateMachine.AddTransition(GameStateType.Startup, GameStateType.MainMenu, GameInputType.FinishedLoading, false); stateMachine.OnEnterState(GameStateType.Startup, delegate(GameStateType state, GameInputType input) { SplashScreen.SetActive(true); }); stateMachine.OnExitState(GameStateType.Startup, delegate(GameInputType input, GameStateType state) { SplashScreen.SetActive(false); }); // Playing stateMachine.AddTransition(GameStateType.Playing, GameStateType.PausedMenu, GameInputType.Escape, true); stateMachine.AddTransition(GameStateType.Playing, GameStateType.PlayerDead, GameInputType.PlayerDeath, false); stateMachine.AddTransition(GameStateType.Playing, GameStateType.PassivesMenu, GameInputType.OpenPassivesMenu, false); stateMachine.AddTransition(GameStateType.Playing, GameStateType.ControlsMenu, GameInputType.OpenControlsMenu, false); stateMachine.OnEnterState(GameStateType.Playing, delegate(GameStateType state, GameInputType input) { Time.timeScale = 1; }); stateMachine.OnExitState(GameStateType.Playing, delegate(GameInputType input, GameStateType state) { Time.timeScale = 0; }); // Paused Menu stateMachine.AddTransitionToPrevious(GameStateType.PausedMenu, GameInputType.Escape, false); stateMachine.AddTransition(GameStateType.PausedMenu, GameStateType.InfoMenu, GameInputType.OpenInfoMenu, false); stateMachine.AddTransition(GameStateType.PausedMenu, GameStateType.LoadingOut, GameInputType.SaveAndExit, false); stateMachine.OnEnterState(GameStateType.PausedMenu, delegate(GameStateType state, GameInputType input) { PausedMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.PausedMenu, delegate(GameInputType input, GameStateType state) { PausedMenu.SetActive(false); }); // Info Menu stateMachine.AddTransition(GameStateType.InfoMenu, GameStateType.PausedMenu, GameInputType.Escape, false); stateMachine.OnEnterState(GameStateType.InfoMenu, delegate(GameStateType state, GameInputType input) { InfoMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.InfoMenu, delegate(GameInputType input, GameStateType state) { InfoMenu.SetActive(false); }); // Player Dead stateMachine.AddTransition(GameStateType.PlayerDead, GameStateType.Playing, GameInputType.PlayerRespawn, false); stateMachine.AddTransition(GameStateType.PlayerDead, GameStateType.PausedMenu, GameInputType.Escape, true); stateMachine.AddTransition(GameStateType.PlayerDead, GameStateType.MainMenu, GameInputType.PlayerDeath, false); stateMachine.OnEnterState(GameStateType.PlayerDead, OnPlayerDeath); stateMachine.OnExitState(GameStateType.PlayerDead, delegate(GameInputType input, GameStateType state) { Time.timeScale = 0; }); // Passives Menu stateMachine.AddTransition(GameStateType.PassivesMenu, GameStateType.Playing, GameInputType.Escape, true); stateMachine.AddTransition(GameStateType.PassivesMenu, GameStateType.Playing, GameInputType.OpenPassivesMenu, false); stateMachine.OnEnterState(GameStateType.PassivesMenu, delegate(GameStateType state, GameInputType input) { PassivesMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.PassivesMenu, delegate(GameInputType input, GameStateType state) { PassivesMenu.SetActive(false); }); // Main Menu stateMachine.AddTransition(GameStateType.MainMenu, GameStateType.PlayerMenu, GameInputType.OpenPlayerMenu, false); stateMachine.AddTransition(GameStateType.MainMenu, GameStateType.Exit, GameInputType.Escape, false); stateMachine.OnEnterState(GameStateType.MainMenu, delegate(GameStateType state, GameInputType input) { MainMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.MainMenu, delegate(GameInputType input, GameStateType state) { MainMenu.SetActive(false); }); // Player Menu stateMachine.AddTransition(GameStateType.PlayerMenu, GameStateType.NewPlayerMenu, GameInputType.OpenNewPlayerMenu, false); stateMachine.AddTransition(GameStateType.PlayerMenu, GameStateType.MainMenu, GameInputType.Escape, false); stateMachine.AddTransition(GameStateType.PlayerMenu, GameStateType.WorldMenu, GameInputType.OpenWorldMenu, false); stateMachine.OnEnterState(GameStateType.PlayerMenu, delegate(GameStateType state, GameInputType input) { PlayerMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.PlayerMenu, delegate(GameInputType input, GameStateType state) { PlayerMenu.SetActive(false); }); // New Player Menu stateMachine.AddTransition(GameStateType.NewPlayerMenu, GameStateType.PlayerMenu, GameInputType.Escape, false); stateMachine.OnEnterState(GameStateType.NewPlayerMenu, delegate(GameStateType state, GameInputType input) { NewPlayerMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.NewPlayerMenu, delegate(GameInputType input, GameStateType state) { NewPlayerMenu.SetActive(false); }); // World Menu stateMachine.AddTransition(GameStateType.WorldMenu, GameStateType.NewWorldMenu, GameInputType.OpenNewWorldMenu, false); stateMachine.AddTransition(GameStateType.WorldMenu, GameStateType.PlayerMenu, GameInputType.Escape, false); stateMachine.AddTransition(GameStateType.WorldMenu, GameStateType.LoadingIn, GameInputType.StartPlay, false); stateMachine.OnEnterState(GameStateType.WorldMenu, delegate(GameStateType state, GameInputType input) { WorldMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.WorldMenu, delegate(GameInputType input, GameStateType state) { WorldMenu.SetActive(false); }); // New World Menu stateMachine.AddTransition(GameStateType.NewWorldMenu, GameStateType.WorldMenu, GameInputType.Escape, false); stateMachine.OnEnterState(GameStateType.NewWorldMenu, delegate(GameStateType state, GameInputType input) { NewWorldMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.NewWorldMenu, delegate(GameInputType input, GameStateType state) { NewWorldMenu.SetActive(false); }); // Loading In One stateMachine.AddTransition(GameStateType.LoadingIn, GameStateType.ControlsMenu, GameInputType.WorldLoaded, false); stateMachine.OnEnterState(GameStateType.LoadingIn, LoadWorld); stateMachine.OnExitState(GameStateType.LoadingIn, delegate(GameInputType input, GameStateType state) { LoadingScreen.SetActive(false); Time.timeScale = 0; }); // Loading Out stateMachine.AddTransition(GameStateType.LoadingOut, GameStateType.MainMenu, GameInputType.WorldUnloaded, false); stateMachine.OnEnterState(GameStateType.LoadingOut, SaveAndExit); stateMachine.OnExitState(GameStateType.LoadingOut, delegate(GameInputType input, GameStateType state) { LoadingScreen.SetActive(false); }); // Controls Menu stateMachine.AddTransition(GameStateType.ControlsMenu, GameStateType.Playing, GameInputType.OpenControlsMenu, false); stateMachine.AddTransition(GameStateType.ControlsMenu, GameStateType.Playing, GameInputType.Escape, false); stateMachine.OnEnterState(GameStateType.ControlsMenu, delegate(GameStateType state, GameInputType input) { ControlsMenu.SetActive(true); }); stateMachine.OnExitState(GameStateType.ControlsMenu, delegate(GameInputType input, GameStateType state) { ControlsMenu.SetActive(false); }); // Exit stateMachine.OnEnterState(GameStateType.Exit, delegate(GameStateType state, GameInputType input) { Application.Quit(); }); return(stateMachine); }