Exemple #1
0
    public static List <string> GetAllPlayableLevelNames()
    {
        List <string> playableLevelNames = new List <string>();

        MazeLevelNamesData levelNamesData = new JsonMazeLevelListFileReader().ReadData <MazeLevelNamesData>();

        if (levelNamesData == null)
        {
            return(playableLevelNames);
        }
        for (int i = 0; i < levelNamesData.LevelNames.Count; i++)
        {
            MazeLevelNameData levelNameData = levelNamesData.LevelNames[i];

            if (!levelNameData.IsPlayable)
            {
                continue;
            }

            if (levelNameData.LevelName == MazeLevelGameplayManager.Instance?.Level?.Name)
            {
                continue;
            }

            playableLevelNames.Add(levelNameData.LevelName);
        }

        if (playableLevelNames.Count == 0)
        {
            Logger.Warning("Found 0 playable levels!");
        }

        return(playableLevelNames);
    }
    public void Initialise(MazeLevelNameData levelNameData)
    {
        _levelNameData = levelNameData;

        gameObject.name            = $"{_levelNameData.LevelName}Toggle";
        _levelNameToggleLabel.text = _levelNameData.LevelName;
        Toggle.isOn = levelNameData.IsPlayable;
    }
    public bool LevelNameExists(string levelName)
    {
        MazeLevelNameData levelNameData = LevelNames.FirstOrDefault(l => l.LevelName == levelName);

        if (levelNameData == null)
        {
            return(false);
        }
        return(true);
    }
    private MazeLevelNameData GetMazeLevelNameData(string sanatisedLevelName)
    {
        MazeLevelNamesData mazeLevelNamesData = MazeLevelLoader.GetAllMazeLevelNamesData();
        MazeLevelNameData  mazeLevelName      = mazeLevelNamesData.LevelNames.FirstOrDefault(level => level.LevelName == sanatisedLevelName);

        if (mazeLevelName == null)
        {
            string message = $"Could not find a maze level with the name '<color={sanatisedLevelName}>info maze</color>' in the level list.\n";
            throw new MazeLevelNameNotFoundConsoleException(message);
        }

        return(mazeLevelName);
    }
    public MazeLevelNamesData AddLevelName(string mazeLevelName)
    {
        if (LevelNameExists(mazeLevelName))
        {
            Logger.Log($"A level with the name {mazeLevelName} was already registered. Not adding it to the maze name list");
            return(this);
        }

        MazeLevelNameData mazeLevelNameData = new MazeLevelNameData(mazeLevelName);

        LevelNames.Add(mazeLevelNameData);

        return(this);
    }
    private void ToggleLevelPlayability(string levelName, List <string> arguments)
    {
        if (arguments.Count < 1)
        {
            string message = "The command '<color=" + ConsoleConfiguration.HighlightColour + ">configure maze playable</color>' needs an additional argument saying 'true' or 'false'.";
            throw new NotEnoughArgumentsConsoleException(message);
        }

        MazeLevelNamesData levelNamesData = new JsonMazeLevelListFileReader().ReadData <MazeLevelNamesData>();

        string sanatisedLevelName = levelName.ToLower().Replace(" ", "-");
        int    levelNameIndex     = levelNamesData.LevelNames.FindIndex(l => l.LevelName == sanatisedLevelName);

        if (levelNameIndex == -1)
        {
            string message = $"Could not find the maze level '<color={sanatisedLevelName}>info maze</color>' in the list with known maze levels.";
            throw new MazeLevelNameNotFoundConsoleException(message);
        }

        MazeLevelNameData levelNameData = levelNamesData.LevelNames.ElementAt(levelNameIndex);

        if (levelNameData == null)
        {
            string message = $"Could not find the maze level '<color={sanatisedLevelName}>info maze</color>' in the list with known maze levels.";
            throw new MazeLevelNameNotFoundConsoleException(message);
        }

        switch (arguments[0])
        {
        case "true":
            levelNameData.IsPlayable = true;
            break;

        case "false":
            levelNameData.IsPlayable = false;
            break;

        default:
            string message = $"The command '<color={ConsoleConfiguration.HighlightColour}>configure maze {levelName} playable</color>' needs a last argument saying 'true' or 'false'.";
            throw new UnknownArgumentConsoleException(message);
        }

        levelNamesData.LevelNames[levelNameIndex] = levelNameData;
        JsonMazeLevelListFileWriter jsonMazeLevelListFileWriter = new JsonMazeLevelListFileWriter();

        jsonMazeLevelListFileWriter.SerialiseData(levelNamesData);
    }
    //Save changes to which levels are playable to the levels.json file
    public void SaveChanges()
    {
        JsonMazeLevelListFileWriter jsonMazeLevelListFileWriter = new JsonMazeLevelListFileWriter();
        MazeLevelNamesData          levelNamesData = new MazeLevelNamesData();

        foreach (KeyValuePair <PlayableMazeLevelNameToggle, MazeLevelNameData> mazeLevelNameToggleData in LevelNameToggleData)
        {
            MazeLevelNameData levelNameData = new MazeLevelNameData()
                                              .WithName(mazeLevelNameToggleData.Value.LevelName)
                                              .WithPlayability(mazeLevelNameToggleData.Key.Toggle.isOn);

            levelNamesData.LevelNames.Add(levelNameData);
        }

        jsonMazeLevelListFileWriter.SerialiseData(levelNamesData);

        Logger.Log("Playable level selection changes were saved.");

        ClosePanel();
    }
    public void OnEnable()
    {
        MazeLevelNamesData levelNamesData = new JsonMazeLevelListFileReader().ReadData <MazeLevelNamesData>();

        LevelNameToggleData.Clear();

        for (int i = 0; i < levelNamesData.LevelNames.Count; i++)
        {
            MazeLevelNameData levelNameData = levelNamesData.LevelNames[i];

            GameObject levelNameToggleGO = Instantiate(PlayableLevelNameTogglePrefab, PlayableLevelListContainer);

            PlayableMazeLevelNameToggle playableLevelNameToggle = levelNameToggleGO.GetComponent <PlayableMazeLevelNameToggle>();
            playableLevelNameToggle.Initialise(levelNameData);

            LevelNameToggleData.Add(playableLevelNameToggle, levelNameData);
        }

        IsOpen = true;
    }
    public string GetInfo(List <string> arguments)
    {
        try
        {
            if (arguments.Count < 1)
            {
                string message = "The command '<color=" + ConsoleConfiguration.HighlightColour + ">info maze</color>' needs an additional argument with the name of the maze level you want info on.";
                Logger.Warning(message);

                throw new NotEnoughArgumentsConsoleException(message);
            }

            string sanatisedLevelName = arguments[0].ToLower().Replace(" ", "-");

            MazeLevelData     mazeLevelData = GetMazeLevelData(sanatisedLevelName);
            MazeLevelNameData mazeLevelName = GetMazeLevelNameData(sanatisedLevelName);

            bool         isPlayable      = GetIsPlayable(mazeLevelName);
            GridLocation mazeLevelBounds = GetMazeLevelBounds(mazeLevelData);

            string infoMessage = "--\n";
            infoMessage += $"Information for maze level {arguments[0]}\n";
            infoMessage += "--\n\n";
            infoMessage += $"Name: {sanatisedLevelName}\n";
            infoMessage += $"Playable: {isPlayable}\n";
            infoMessage += $"Rows: {mazeLevelBounds.X + 1}\n";
            infoMessage += $"Columns: {mazeLevelBounds.Y + 1}\n";
            infoMessage += "\n\n";

            return(infoMessage);
        }
        catch (System.Exception)
        {
            return(null);
        }
    }
    private bool GetIsPlayable(MazeLevelNameData mazeLevelName)
    {
        bool isPlayable = mazeLevelName.IsPlayable;

        return(isPlayable);
    }