예제 #1
0
        public void RenderMenu(MenuProperties props)
        {
            string        outputString        = "";
            string        menuBorderTopBottom = GetMenuHeaderFooter(props.Level.SubmenuList, props.Level.LevelDescription);
            List <string> submenuList         = props.Level.SubmenuList;

            outputString += menuBorderTopBottom + "\n";

            if (props.Level.LevelDescription != "")
            {
                outputString += $"{_menuBorderLeftRight} " + DataUtils.Default + props.Level.LevelDescription + DataUtils.Menu +
                                $"{new string(' ', _menuLength - 3 - props.Level.LevelDescription.Length)}"
                                + _menuBorderLeftRight + "\n";
            }

            for (int i = 0; i < submenuList.Count; i++)
            {
                string emptySpace = new string(' ', _menuLength - 3 - submenuList[i].Length);
                if (props.Level.SubmenuList[i] == "Back")
                {
                    outputString += _menuBorderLeftRight + new string('—', _menuLength - 2) + _menuBorderLeftRight + "\n";
                }
                if (i == props.SelectedRow)
                {
                    outputString += _menuBorderLeftRight +
                                    $"{Color.BlueBackground + Color.WhiteText} {submenuList[i] + emptySpace}" +
                                    DataUtils.Menu + _menuBorderLeftRight + "\n";
                    continue;
                }
                outputString += _menuBorderLeftRight + $" {submenuList[i] + emptySpace}" + _menuBorderLeftRight + "\n";
            }

            outputString += menuBorderTopBottom + "\n";
            RenderScreen(outputString);
        }
예제 #2
0
        public string EventListener(MenuProperties props, string[] options, string message, int selectedRow)
        {
            while (true)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                case ConsoleKey.UpArrow when selectedRow - 1 >= 0:
                    props.Renderer.RenderSettingsSetup(options, message, --selectedRow);
                    break;

                case ConsoleKey.DownArrow when selectedRow + 1 < options.Length:
                    props.Renderer.RenderSettingsSetup(options, message, ++selectedRow);
                    break;

                case ConsoleKey.Enter:
                    return(options[selectedRow]);

                case ConsoleKey.Backspace:
                    return("Return to settings menu");

                case ConsoleKey.Escape:
                    Console.Clear();
                    Environment.Exit(0);
                    break;
                }
            }
        }
예제 #3
0
        public void AddCustomShip(MenuProperties props)
        {
            Settings newSettings = UserSettings.DeepClone(); // Data.DeepClone(obj)

            if (SetNewShipSize(props, newSettings))
            {
                string name = SetNewShipName(props);
                newSettings.ShipCount = newSettings.ShipCount.Add(0);    // Data.Add(item)
                newSettings.ShipNames = newSettings.ShipNames.Add(name); // Data.Add(item)
                SaveUserSettings(newSettings);
            }

            props.Renderer.PreviousFrame = "";
            props.Renderer.RenderMenu(props);
        }
예제 #4
0
        public void SetBattlefieldSize(MenuProperties props)
        {
            Settings newSettings = UserSettings.DeepClone(); // Data.DeepClone(obj)

            if (SetBattlefieldHeight(props, newSettings))
            {
                if (SetBattlefieldWidth(props, newSettings))
                {
                    SaveUserSettings(newSettings);
                }
            }

            props.Renderer.PreviousFrame = "";
            props.Renderer.RenderMenu(props);
        }
예제 #5
0
        private bool SetNewShipSize(MenuProperties props, Settings settings)
        {
            string[]     options = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Return to settings menu" };
            const string message = "Enter new ship size";

            props.Renderer.RenderSettingsSetup(options, message, 0);
            string value = props.SettingsEventListener.EventListener(props, options, message, 0);

            if (value == "Return to settings menu")
            {
                return(false);
            }

            settings.ShipSettings = settings.ShipSettings.Add(int.Parse(value)); // Data.Add(item)
            return(true);
        }
예제 #6
0
        public void SetShipSettings(MenuProperties props, string shipName)
        {
            int      index       = GetShipIndex(UserSettings.ShipNames, shipName);
            Settings newSettings = UserSettings.DeepClone(); // Data.DeepClone(obj)

            if (SetShipSettingsCount(props, newSettings, shipName, index))
            {
                if (SetShipSettingsSize(props, newSettings, shipName, index))
                {
                    SetShipSettingsName(props, newSettings, shipName, index);
                    SaveUserSettings(newSettings);
                }
            }

            props.Renderer.RenderMenu(props);
        }
예제 #7
0
        private bool SetBattlefieldWidth(MenuProperties props, Settings settings)
        {
            string[] options      = GetBattlefieldOptions(settings, settings.BattlefieldSize[0]);
            string   currentValue = UserSettings.BattlefieldSize[1].ToString();
            string   message      = $"Please enter available battlefield width [Current: {currentValue}]";

            props.Renderer.RenderSettingsSetup(options, message, 0);
            string value = props.SettingsEventListener.EventListener(props, options, message, 0);

            if (value == "Return to settings menu")
            {
                return(false);
            }

            settings.BattlefieldSize[1] = int.Parse(value);
            return(true);
        }
예제 #8
0
        private bool SetShipSettingsSize(MenuProperties props, Settings settings, string shipName, int index)
        {
            string[] options      = GetShipSizeOptions(settings, index);
            string   currentValue = UserSettings.ShipSettings[index].ToString();
            string   message      = $"Please enter {shipName} size [current: {currentValue}]";

            props.Renderer.RenderSettingsSetup(options, message, 0);
            string value = props.SettingsEventListener.EventListener(props, options, message, 0);

            if (value == "Return to settings menu")
            {
                return(false);
            }

            settings.ShipSettings[index] = int.Parse(value);
            return(true);
        }
예제 #9
0
 public void Start()
 {
     _props = new MenuProperties {
         Manager = this, SettingsManager = new SettingsManager()
     };
     _props.SettingsManager.LoadSettings();
     MenuDataContainer.UserSettings = _props.SettingsManager.UserSettings;
     _props.Level = new MenuLevel("Main Menu", MenuDataContainer.GetSubmenuList("Main Menu"));
     _props.Level.LevelDescription = MenuDataContainer.GetLevelDescription(_props.Level.LevelTitle);
     _props.Renderer = new MenuRenderer {
         PreviousFrame = "Empty frame"
     };
     _props.EventListener         = new MenuEventListener();
     _props.SettingsEventListener = new SettingsEventListener();
     _props.SelectedRow           = 0;
     _props.Renderer.RenderMenu(_props);
     _props.EventListener.EventListener(_props);
 }
예제 #10
0
        public void SetShipArrangement(MenuProperties props)
        {
            Settings newSettings = UserSettings.DeepClone(); // Data.DeepClone(obj)

            string[] options      = GetArrangementOptions();
            string   currentValue = UserSettings.ShipArrangement.ToString();
            string   message      = $"Please enter available ship arrangement value [current: {currentValue}]";

            props.Renderer.RenderSettingsSetup(options, message, 0);
            string value = props.SettingsEventListener.EventListener(props, options, message, 0);

            if (value != "Return to settings menu")
            {
                newSettings.ShipArrangement = bool.Parse(value);
                if (currentValue != value)
                {
                    SaveUserSettings(newSettings);
                }
            }

            props.Renderer.PreviousFrame = "";
            props.Renderer.RenderMenu(props);
        }
예제 #11
0
        public void EventListener(MenuProperties props)
        {
            while (true)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switch (key.Key)
                {
                case ConsoleKey.UpArrow when props.SelectedRow - 1 >= 0:
                    props.SelectedRow--;
                    props.Renderer.RenderMenu(props);
                    break;

                case ConsoleKey.DownArrow when props.SelectedRow + 1 < props.Level.SubmenuList.Count:
                    props.SelectedRow++;
                    props.Renderer.RenderMenu(props);
                    break;

                case ConsoleKey.Enter:
                    props.Manager.EventEnter(props);
                    break;

                case ConsoleKey.Backspace:
                    props.SelectedRow = 0;
                    if (props.Level.LevelTitle != "Main Menu")
                    {
                        props.Manager.SwitchParametersToPreviousMenu(props.Level);
                    }
                    props.Renderer.RenderMenu(props);
                    break;

                case ConsoleKey.Escape:
                    Console.Clear();
                    Environment.Exit(0);
                    break;
                }
            }
        }
예제 #12
0
        private string SetNewShipName(MenuProperties props)
        {
            Console.Clear();
            Console.CursorVisible = true;
            string name;

            Console.WriteLine("Please enter name for new ship: ");
            while (true)
            {
                name = Console.ReadLine();
                if (StringValidator.ValidateShipName(name) && !UserSettings.ShipNames.Contains(name))
                {
                    break;
                }
                Console.WriteLine(UserSettings.ShipNames.Contains(name)
                    ? "Please enter valid name for new ship [Do not duplicate your ship names!]: "
                    : "Please enter valid name for new ship [Ship name must be with length from 1 to 20 chars and" +
                                  " do not use menu names for ships!]: ");
            }

            //props.Level.SubmenuList.Add(name);
            Console.CursorVisible = false;
            return(name);
        }
예제 #13
0
        private void SetShipSettingsName(MenuProperties props, Settings settings, string shipName, int index)
        {
            string[] options = { "Yes", "No", "Return to settings menu" };
            string   message = $"Do you want to rename {shipName}?";

            props.Renderer.RenderSettingsSetup(options, message, 0);
            string value = props.SettingsEventListener.EventListener(props, options, message, 0);

            if (value == "No" || value == "Return to settings menu")
            {
                return;
            }

            Console.Clear();
            Console.CursorVisible = true;
            Console.WriteLine($"Please enter new name for ship [Previous: {shipName}]: ");

            string newName = Console.ReadLine();

            settings.ShipNames[index]      = newName;
            props.Level.SubmenuList[index] = newName;
            Console.CursorVisible          = false;
            props.Renderer.PreviousFrame   = "Empty frame";
        }
예제 #14
0
        public void EventEnter(MenuProperties props)
        {
            string selectedMenu = props.Level.SubmenuList[props.SelectedRow];

            switch (selectedMenu)
            {
            case "Exit":
                Console.Clear();
                Environment.Exit(0);
                break;

            case "Back":
                GetBack(props);
                break;

            case "Fast Game":
                props.GameMode = "Fast Game";
                GameManager fastGame = new GameManager();
                fastGame.Start(props.GameMode, props.SettingsManager.DefaultSettings);
                break;

            case "Player vs Player":
            case "Player vs AI":
            case "AI vs AI":
                GameModeSettings(props);
                break;

            case "Default settings":
                GameManager defaultGame = new GameManager();
                defaultGame.Start(props.GameMode, props.SettingsManager.DefaultSettings);
                break;

            case "User settings":
                GameManager userGame = new GameManager();
                userGame.Start(props.GameMode, props.SettingsManager.UserSettings);
                break;

            case "Load":
                LoadSavedGame(props.Level.LevelTitle);
                break;

            case "Delete":
                Save saveForDelete = SaveManager.GetSaveReference(props.Level.LevelTitle);
                SaveManager.DeleteSavedGame(saveForDelete);
                GetBack(props);
                break;

            case "Reset user settings to default":
                props.SettingsManager.ResetSettingsToDefault();
                GetBack(props);
                break;

            case "Ship arrangement":
                props.SettingsManager.SetShipArrangement(props);
                break;

            case "Battlefield size":
                props.SettingsManager.SetBattlefieldSize(props);
                break;

            case "Add custom ship":
                props.SettingsManager.AddCustomShip(props);
                break;

            case "Carrier":
            case "Battleship":
            case "Submarine":
            case "Cruiser":
            case "Patrol":
                props.SettingsManager.SetShipSettings(props, selectedMenu);
                break;

            default: {
                if (props.SettingsManager.UserSettings.ShipNames.Contains(selectedMenu))
                {
                    props.SettingsManager.SetShipSettings(props, selectedMenu);
                }
                DefaultStatement(props);
                break;
            }
            }
        }