static MetaGame() { var mainMenuState = new MainMenuState(StateMachine, MainGame.Instance); StateMachine.States.Add(mainMenuState); var mainGameState = new MainGameState(StateMachine, MainGame.Instance); StateMachine.States.Add(mainGameState); if (Program.SkipIntro) { StateMachine.AddTransition(new Transition <GameState>("start", null, mainMenuState)); } else { var borneGamesLogoState = new BorneGamesLogoState(StateMachine, MainGame.Instance); var titleState = new TitleState(StateMachine, MainGame.Instance); StateMachine.States.Add(borneGamesLogoState); StateMachine.States.Add(titleState); StateMachine.AddTransition(new Transition <GameState>("start", null, borneGamesLogoState)); StateMachine.AddTransition(new Transition <GameState>("next", borneGamesLogoState, titleState, Mode.PushPop)); StateMachine.AddTransition(new Transition <GameState>("next", titleState, mainMenuState, Mode.PushPop)); } StateMachine.AddTransition(new Transition <GameState>("start", mainMenuState, mainGameState, Mode.PushPop)); StateMachine.AddTransition(new Transition <GameState>("exit", mainMenuState, null)); }
// Start is called before the first frame update private void Start() { m_gameStateMachine = new GameStateMachine(); var splash = new SplashState(this, UIController.Instance.SplashPanel); var mainMenu = new MainMenuState(this, UIController.Instance.MainMenuPanel, UIController.Instance.MainMenuPlayButton); var tutorial = new TutorialState(this, UIController.Instance.TutorialPanel, UIController.Instance.TutorialDoneButton); var gameplay = new GamePlayState(this, UIController.Instance.GamePlayPanel); var win = new WinState(this, UIController.Instance.LevelCompletePanel, UIController.Instance.WinContinueButton); var fail = new FailState(this, UIController.Instance.LevelFailPanel, UIController.Instance.FailContinueButton); //Adding Transitions At(splash, mainMenu, CanShowMainMenu()); At(mainMenu, tutorial, CanPlayTutorial()); At(mainMenu, gameplay, CanPlayGame()); At(tutorial, gameplay, () => tutorial.HasTutorialFinished); At(gameplay, win, GameToWin()); At(gameplay, fail, GameToFail()); At(win, mainMenu, WinToMainMenu()); void At(IState from, IState to, Func <bool> condition) => m_gameStateMachine.AddTransition(from, to, condition); //Adding Conditions for Transitions Func <bool> CanShowMainMenu() => () => splash.HasSplashEnded; Func <bool> CanPlayGame() => () => mainMenu.HasPressedPlay && PlayerPrefs.GetInt(GameConstants.TutorialCompleted, 0) == 1; Func <bool> CanPlayTutorial() => () => mainMenu.HasPressedPlay && PlayerPrefs.GetInt(GameConstants.TutorialCompleted, 0) == 0; Func <bool> GameToWin() => () => gameplay.HasWon; Func <bool> GameToFail() => () => gameplay.HasLost; Func <bool> WinToMainMenu() => () => win.HasPressedContinue; //SetDefaultState m_gameStateMachine.SetState(splash); }