protected override void OnControllerStop(Controller controller)
        {
            if (controller is MenuController)
            {
                MenuController.ExitCode exitCode = (MenuController.ExitCode)controller.exitCode;
                if (exitCode == MenuController.ExitCode.Quit)
                {
                    Application.sharedApplication.Stop();
                    return;
                }

                switch (exitCode)
                {
                    case MenuController.ExitCode.SingleStart:
                    {
                        StartController(new GameLobbyController());
                        break;
                    }

                    case MenuController.ExitCode.MultiplayerStart:
                    {
                        StartController(new MultiplayerController());
                        break;
                    }

                    case MenuController.ExitCode.DebugClientStart:
                    {
                        StartController(new DebugMultiplayerController(DebugMultiplayerController.Mode.Client));
                        break;
                    }

                    case MenuController.ExitCode.DebugServerStart:
                    {
                        StartController(new DebugMultiplayerController(DebugMultiplayerController.Mode.Server));
                        break;
                    }
                }
            }
            else if (controller is MultiplayerController)
            {
                MultiplayerController.ExitCode exitCode = (MultiplayerController.ExitCode)controller.exitCode;
                if (exitCode == MultiplayerController.ExitCode.Cancel)
                {
                    StartMainMenuController();
                    return;
                }

                switch (exitCode)
                {
                    case MultiplayerController.ExitCode.Create:
                        break;

                    case MultiplayerController.ExitCode.Join:
                        break;
                }
            }
            else if (controller is GameController)
            {
                StartMainMenuController();
            }
            else if (controller is GameLobbyController)
            {
                GameLobbyController.ExitCode exitCode = (GameLobbyController.ExitCode)controller.exitCode;
                switch (exitCode)
                {
                    case GameLobbyController.ExitCode.StartGame:
                    {
                        GameLobbyController glc = controller as GameLobbyController;
                        Scheme selectedScheme = glc.GetSelectedScheme();

                        GameSettings settings = new GameSettings(selectedScheme);
                        settings.inputEntries = glc.CreateInputEntries();
                        StartController(GameController.Local(settings));
                        break;
                    }

                    case GameLobbyController.ExitCode.Cancel:
                    {
                        StartMainMenuController();
                        break;
                    }
                }
            }
            else if (controller is DebugMultiplayerController)
            {
                DebugMultiplayerController.ExitCode exitCode = (DebugMultiplayerController.ExitCode)controller.exitCode;
                switch (exitCode)
                {
                    case DebugMultiplayerController.ExitCode.Cancel:
                    {
                        StartMainMenuController();
                        break;
                    }
                    case DebugMultiplayerController.ExitCode.ClientStarted:
                    {
                        ServerInfo info = controller.exitData as ServerInfo;
                        Debug.Assert(info != null);

                        GameSettings settings = new GameSettings(info.scheme);
                        StartController(GameController.Client(settings));
                        break;
                    }

                    case DebugMultiplayerController.ExitCode.ServerStarted:
                    {
                        ServerInfo info = controller.exitData as ServerInfo;
                        Debug.Assert(info != null);

                        GameSettings settings = new GameSettings(info.scheme);
                        settings.inputEntries = new GameSettings.InputEntry[]
                        {
                            new GameSettings.InputEntry(0, InputMapping.CreatePlayerInput(InputType.Keyboard1))
                        };
                        StartController(GameController.Server(settings));
                        break;
                    }
                }
            }
        }
 public static GameController Client(GameSettings settings)
 {
     return new GameControllerClient(settings);
 }
 protected GameController(GameSettings settings)
 {
     this.settings = settings;
 }
 public LocalGameController(GameSettings settings)
     : base(settings)
 {
     Debug.CheckArgumentNotNull(settings.inputEntries);
     Debug.CheckArgument(settings.inputEntries.Length > 0);
 }
 public static GameController Server(GameSettings settings)
 {
     return new GameControllerServer(settings);
 }
 public static GameController Local(GameSettings settings)
 {
     return new LocalGameController(settings);
 }