public static bool GetPreviousLevel(ref LevelPack levelPack, ref Level.LevelInfo levelInfo)
        {
            if (!levelPack.Levels.Contains(levelInfo))
            {
                throw new Exception($"Level [{levelInfo.ID}] is not part of Level Pack [{levelPack.ID}]");
            }

            var levelIndex = levelInfo.Index;

            if (levelIndex - 1 >= 0 && levelIndex < levelPack.TotalLevelCount)
            {
                // Previous Level in current pack
                var prevLevel = levelPack.Levels[levelIndex - 1];

                levelInfo = prevLevel;
                return(true);
            }

            if (levelIndex - 1 < 0)
            {
                // Previous Level in previous pack
                var prevPack = GetPreviousPack(levelPack);

                if (prevPack == null)
                {
                    return(false);                                  // No more levels
                }
                levelPack = prevPack;
                levelInfo = prevPack.Levels[prevPack.Levels.Count - 1];
                return(true);
            }

            return(false);
        }
        public static bool GetNextLevel(ref LevelPack levelPack, ref Level.LevelInfo levelInfo)
        {
            if (!levelPack.Levels.Contains(levelInfo))
            {
                throw new Exception($"Level [{levelInfo.ID}] is not part of Level Pack [{levelPack.ID}]");
            }

            var levelIndex = levelInfo.Index;

            if (levelIndex >= 0 && levelIndex + 1 < levelPack.TotalLevelCount)
            {
                // Next Level in current pack
                var nextLevel = levelPack.Levels[levelIndex + 1];

                levelInfo = nextLevel;
                return(true);
            }

            if (levelIndex + 1 >= levelPack.TotalLevelCount)
            {
                // Next Level in next pack
                var nextPack = GetNextPack(levelPack);

                if (nextPack == null)
                {
                    return(false);                                  // No more levels
                }
                levelPack = nextPack;
                levelInfo = nextPack.Levels[0];
                return(true);
            }

            return(false);
        }
 // TODO: Write testing around the following four methods
 public static bool HasNextLevel(LevelPack levelPack, Level.LevelInfo levelInfo, ref bool isUnlocked)
 {
     if (GetNextLevel(ref levelPack, ref levelInfo))
     {
         isUnlocked = levelInfo.Status != Level.LevelInfo.LevelInfoStatus.Locked;
         return(true);
     }
     return(false);
 }
        private static void UnlockNextLevel(LevelPack levelPack, Level.LevelInfo level)
        {
            var levelIndex = level.Index;

            if (levelIndex >= 0 && levelIndex + 1 < levelPack.TotalLevelCount)
            {
                // Next Level in current pack
                var nextLevel = levelPack.Levels[levelIndex + 1];
                nextLevel.SetStatus(Level.LevelInfo.LevelInfoStatus.Unsolved);
                levelPack.SaveProgressForPack();
            }
            else if (levelIndex + 1 >= levelPack.TotalLevelCount)
            {
                // Next Level in next pack
                var nextPack = GetNextPack(levelPack);
                nextPack?.UnlockFirstLevel();
            }
        }
            private static Level.LevelInfo ParseLevelInfo(JToken levelInfoJSON, int index)
            {
                var levelID = levelInfoJSON.Value <string>("ID");

                if (string.IsNullOrWhiteSpace(levelID))
                {
                    throw new InvalidSerializedLevelPackException($"Level ID was not valid [{levelID}]");
                }

                var displayName = levelInfoJSON.Value <string>("DisplayName");

                if (string.IsNullOrWhiteSpace(displayName))
                {
                    throw new InvalidSerializedLevelPackException($"Level display name was not valid [{displayName}]");
                }

                var levelInfo = new Level.LevelInfo(levelID, displayName, index);

                return(levelInfo);
            }
 public static bool HasPreviousLevel(LevelPack levelPack, Level.LevelInfo levelInfo) => GetPreviousLevel(ref levelPack, ref levelInfo);