protected override MenuScreen ProtectedUpdate(MenuScreen.ScreenLayout layout)
    {
        //Process bool flags.

        if (waitACycle)
        {
            waitACycle = false;
            return(this);
        }
        if (regenerate)
        {
            manager = WorldConstants.Creator.CreateMatchController().GetComponent <LevelManager>();
            manager.StartWorld(true);

            regenerate = false;
            waitACycle = true;
            return(this);
        }

        if (!wasUpdated)
        {
            wasUpdated = true;
            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), Owner.BackgroundTexture);
        }

        if (startGame)
        {
            return(new MatchScreen(MatchData, Consts, Owner));
        }

        DrawTitleString("Choose a level", layout.Title);
        return(DrawButtonMenu(layout.ButtonMenu,
                              new GUIContent[]
        {
            new GUIContent("Back"),
            new GUIContent("Re-generate"),
            new GUIContent("Start match"),
        },
                              new GetData <MenuScreen>[]
        {
            () =>
            {
                Owner.DestroyMatch(false);
                return new LobbyMenuScreen(MatchData, Consts, Owner);
            },
            () =>
            {
                Owner.DestroyMatch(false);
                MatchData.GenerateLevelAndSpawns();
                regenerate = true;
                return this;
            },
            () =>
            {
                Owner.DestroyMatch(false);
                waitACycle = true;
                startGame = true;
                return this;
            },
        },
                              this));
    }
    public CreateMatchMenuScreen(MatchStartData matchStartData, FrontEndConstants consts, ScreenUI owner)
        : base(matchStartData, consts, owner)
    {
        //Initialize data.

        //Debug.Log("Reading matches:");
        XmlDocument matchDoc = new XmlDocument();

        matchDoc.LoadXml(Owner.MatchesFile.text);
        //matchDoc.LoadXml(Owner.MatchesFile.text.Substring(1, Owner.MatchesFile.text.Length - 1));
        matchSettings = new MatchSettingsReadWrite(matchDoc);
        //Debug.Log("Read matches");

        //Debug.Log("Reading levels:");
        XmlDocument levelsDoc = new XmlDocument();

        levelsDoc.LoadXml(Owner.LevelsFile.text);
        //levelsDoc.LoadXml(Owner.LevelsFile.text.Substring(1, Owner.LevelsFile.text.Length - 1));
        levelGeneration = new LevelGenerationReadWrite(levelsDoc);
        //Debug.Log("Read levels");

        selectedMatch         = "Unreadable";
        selectedLevelGen      = "Unreadable";
        selectedMatchIndex    = 0;
        selectedLevelGenIndex = 0;

        //Read matches.

        if (matchSettings.ErrorMessage == "")
        {
            matches   = new GUIContent[matchSettings.Matches.Count()];
            matchSets = new Rules[matches.Length];
            int count = 0;
            foreach (string rulesN in matchSettings.Matches)
            {
                matchSets[count] = matchSettings.ReadMatch(rulesN);

                if (matchSettings.ErrorMessage != "")
                {
                    matches   = null;
                    matchSets = null;
                    break;
                }

                matches[count] = new GUIContent(rulesN, matchSets[count].Description);
                count         += 1;
            }

            selectedMatchIndex      = Search(Convert(matches, m => m.text), "Brawl", (s1, s2) => s1 == s2);
            selectedMatch           = matches[selectedMatchIndex].text;
            MatchData.MatchSettings = matchSets[selectedMatchIndex];
        }
        else
        {
            matches   = null;
            matchSets = null;
        }

        //Read levels.

        if (levelGeneration.ErrorMessage == "")
        {
            levels    = new GUIContent[levelGeneration.Levels.Count()];
            levelGens = new Generator[levels.Length];
            int count = 0;
            foreach (string levelN in levelGeneration.Levels)
            {
                levelGens[count] = levelGeneration.ReadGenerator(levelN);

                if (levelGeneration.ErrorMessage != "")
                {
                    levels    = null;
                    levelGens = null;
                    break;
                }

                levels[count] = new GUIContent(levelN, levelGens[count].Description);
                count        += 1;
            }

            selectedLevelGenIndex    = Search(Convert(levels, l => l.text), "Corridor", (s1, s2) => s1 == s2);
            selectedLevelGen         = levels[selectedLevelGenIndex].text;
            MatchData.GeneratedLevel = levelGens[selectedLevelGenIndex];
            MatchData.GenerateLevelAndSpawns();
        }
        else
        {
            levels    = null;
            levelGens = null;
        }
    }
 public GenerateLevelMenuScreen(MatchStartData matchStartData, FrontEndConstants consts, ScreenUI owner)
     : base(matchStartData, consts, owner)
 {
     MatchData.GenerateLevelAndSpawns();
     regenerate = true;
 }
    protected override MenuScreen ProtectedUpdate(MenuScreen.ScreenLayout layout)
    {
        DrawTitleString("Choose a game-type and level:", layout.Title);

        #region Draw matches and levels.

        //Some layout data.

        Rect body = layout.Body;

        float sSubtitleYOffset = body.height * Consts.Settings_SubtitleYOffset,
              sSubtitleHeight  = body.height * Consts.Settings_SubtitleHeight;

        float   sListYOffset    = body.height * Consts.Settings_List_YOffset;
        float   sListXOffset    = body.width * Consts.Settings_List_XOffset;
        float   sListSpacing    = body.height * Consts.Settings_List_Spacing;
        Vector2 sListButtonSize = new Vector2(body.width * Consts.Settings_List_ButtonSize.x, body.height * Consts.Settings_List_ButtonSize.y);

        float sTooltipXOffset = body.width * Consts.Settings_TooltipXOffset,
              sTooltipYOffset = body.height * Consts.Settings_TooltipYOffset,
              sTooltipWidth   = body.width * Consts.Settings_TooltipWidth;

        //Some layout rectangles.

        Rect matchesSubtitleRect = new Rect(body.xMin + sListXOffset, body.yMin + sSubtitleYOffset, sListButtonSize.x, sSubtitleHeight),
             levelsSubtitleRect  = new Rect(body.xMax - sListXOffset - sListButtonSize.x, matchesSubtitleRect.yMin, matchesSubtitleRect.width, matchesSubtitleRect.height);

        MyGUI.RadioButtonsLayout matchesLayout = Consts.Settings_List_Layout(new Vector2(matchesSubtitleRect.xMin, matchesSubtitleRect.yMax + sListYOffset), body),
                                 levelsLayout  = Consts.Settings_List_Layout(new Vector2(levelsSubtitleRect.xMin, levelsSubtitleRect.yMax + sListYOffset), body);

        Rect tooltipRect = new Rect(matchesSubtitleRect.xMax + sTooltipXOffset,
                                    body.yMin + sTooltipYOffset,
                                    sTooltipWidth,
                                    body.height - sTooltipYOffset);


        //Display the matches.
        if (matches == null)
        {
            GUI.color = Color.black;
            GUI.Label(body, "XML error when reading match settings:\n\"" + matchSettings.ErrorMessage + "\".");
        }
        else
        {
            GUI.Label(matchesSubtitleRect, "Game-types", WorldConstants.GUIStyles.SubtitleLabels);

            selectedMatchIndex = MyGUI.RadioButtons(matches, selectedMatchIndex, matchesLayout, false, WorldConstants.GUIStyles.SettingsRadioButtons);
            selectedMatch      = matches[selectedMatchIndex].text;

            MatchData.MatchSettings = matchSets[selectedMatchIndex];
        }

        //Display the levels.
        if (levels == null)
        {
            GUI.color = Color.black;
            GUI.Label(body, "XML error when reading level settings:\n\"" + levelGeneration.ErrorMessage + "\".");
        }
        else
        {
            GUI.Label(levelsSubtitleRect, "Levels", WorldConstants.GUIStyles.SubtitleLabels);

            int old = selectedLevelGenIndex;
            selectedLevelGenIndex = MyGUI.RadioButtons(levels, selectedLevelGenIndex, levelsLayout, false, WorldConstants.GUIStyles.SettingsRadioButtons);
            selectedLevelGen      = levels[selectedLevelGenIndex].text;
            if (selectedLevelGen == "Open")
            {
                MatchStartData.IsGeneratingOpen = true;
            }
            else
            {
                MatchStartData.IsGeneratingOpen = false;
            }

            if (old != selectedLevelGenIndex)
            {
                MatchData.GeneratedLevel = levelGens[selectedLevelGenIndex];
                MatchData.GenerateLevelAndSpawns();
            }
        }

        GUI.color = Color.white;
        GUI.Label(tooltipRect, GUI.tooltip, WorldConstants.GUIStyles.SettingsTooltip);

        #endregion

        return(DrawButtonMenu(layout.ButtonMenu,
                              new GUIContent[]
        {
            new GUIContent("Back"),
            new GUIContent("Continue")
        },
                              new GetData <MenuScreen>[]
        {
            () => new MainMenuScreen(MatchData, Consts, Owner),
            () => new LobbyMenuScreen(MatchData, Consts, Owner)
        },
                              this));
    }