Example #1
0
        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);
        }