Esempio n. 1
0
        /// <summary>
        /// Преобразование уровня/подуровня в суммарный уровень.
        /// </summary>
        /// <param name="perkScheme">Схема.</param>
        /// <param name="level">Уровень перка.</param>
        /// <param name="subLevel">Подуровень перка.</param>
        /// <returns></returns>
        public static int?ConvertLevel(IPerkScheme perkScheme, int?level, int subLevel)
        {
            if (perkScheme is null)
            {
                throw new ArgumentNullException(nameof(perkScheme));
            }

            if (level == null)
            {
                return(null);
            }

            var sum = 0;

            for (var i = 0; i <= level; i++)
            {
                if (i < level)
                {
                    sum += perkScheme.Levels[i].MaxValue + 1;
                }
                else
                {
                    sum += subLevel;
                }
            }

            return(sum);
        }
Esempio n. 2
0
        /// <summary>
        /// Преобразование суммарного уровня в уровень/подуровень для конкретной схемы перка.
        /// </summary>
        /// <param name="perkScheme">Схема.</param>
        /// <param name="totalLevel">Суммарный уровень.</param>
        /// <param name="level">Уровень перка.</param>
        /// <param name="subLevel">Подуровень перка.</param>
        public static void ConvertTotalLevel(IPerkScheme perkScheme, int totalLevel, out int?level, out int?subLevel)
        {
            if (perkScheme is null)
            {
                throw new ArgumentNullException(nameof(perkScheme));
            }

            var levelRemains        = totalLevel;
            var currentLevelPointer = 0;

            do
            {
                if (currentLevelPointer >= perkScheme.Levels.Length)
                {
                    level    = null;
                    subLevel = null;
                    return;
                }

                var levelScheme = perkScheme.Levels[currentLevelPointer];
                level    = currentLevelPointer + 1;
                subLevel = Math.Min(levelRemains, levelScheme.MaxValue);
                currentLevelPointer++;

                var currentLevelCapability = levelScheme.MaxValue;
                levelRemains -= currentLevelCapability;
            } while (levelRemains >= 0);
        }
        public void GetTest_OneBuildInPerk_ReturnsThisBuildInPerk()
        {
            var diceMock = new Mock <IDice>();
            var dice     = diceMock.Object;

            var schemeServiceMock = new Mock <ISchemeService>();
            var perkSchemeList    = new IPerkScheme[]
            {
                new TestPerkScheme
                {
                    Sid       = "test",
                    IsBuildIn = true
                }
            };

            schemeServiceMock.Setup(x => x.GetSchemes <IPerkScheme>()).Returns(perkSchemeList);
            var schemeService = schemeServiceMock.Object;

            var perkInitializator = new PersonPerkInitializator(dice, schemeService);

            // ACT

            var factPerks = perkInitializator.Generate();

            // ASSERT

            factPerks.Should().HaveCount(1);
            factPerks[0].Scheme.Should().Be(perkSchemeList[0]);
        }
Esempio n. 4
0
        public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level)
        {
            if (perkScheme is null)
            {
                throw new ArgumentNullException(nameof(perkScheme));
            }

            if (level == null)
            {
                return(new PerkLevel(0, 0));
            }

            var currentLevel    = level.Primary;
            var currentSubLevel = level.Sub;

            var currentLevelScheme = perkScheme.Levels[currentLevel];

            if (currentSubLevel + 1 > currentLevelScheme.MaxValue)
            {
                currentSubLevel = 0;
                currentLevel++;
            }
            else
            {
                currentSubLevel++;
            }

            return(new PerkLevel(currentLevel, currentSubLevel));
        }
Esempio n. 5
0
        private static bool GetNextLevelToCheckNext(IPerkScheme perkScheme, PerkLevel level)
        {
            var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub);

            currentTotal++;

            return(TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var _));
        }
Esempio n. 6
0
        public int ConvertLevelSubsToTotal_FromPositiveTestCases_ReturnsCorrectFact(IPerkScheme perkScheme,
                                                                                    int primaryLevel, int subLevel)
        {
            // ACT
            var factTotal = PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel);

            // ASSERT
            return(factTotal);
        }
Esempio n. 7
0
        public void HasNextLevel_FromNegativeTestCases_AlwaysReturnsFalse(IPerkScheme perkScheme,
                                                                          PerkLevel currentLevel)
        {
            // ACT
            var factHasNextLevel = PerkHelper.HasNextLevel(perkScheme, currentLevel);

            // ASSERT
            factHasNextLevel.Should().BeFalse();
        }
Esempio n. 8
0
        /// <summary>
        /// Преобразование суммарного уровня в уровень/подуровень для конкретной схемы перка.
        /// </summary>
        /// <param name="perkScheme">Схема.</param>
        /// <param name="totalLevel">Суммарный уровень.</param>
        public static bool TryConvertTotalLevelToLevelSubs(IPerkScheme perkScheme, int totalLevel,
                                                           out PerkLevel?perkLevel)
        {
            if (perkScheme is null)
            {
                throw new ArgumentNullException(nameof(perkScheme));
            }

            if (totalLevel == 0)
            {
                throw new ArgumentException("Total must be more that zero.", nameof(totalLevel));
            }

            if (perkScheme.Levels is null)
            {
                throw new ArgumentException("Scheme's levels must not be null.", nameof(perkScheme));
            }

            if (perkScheme.Levels.Length == 0)
            {
                throw new ArgumentException("Scheme's levels must notbe empty.", nameof(perkScheme));
            }

            foreach (var schemeLevel in perkScheme.Levels)
            {
                if (schemeLevel?.MaxValue <= 0)
                {
                    throw new ArgumentException("Scheme must contains no zeros.", nameof(perkScheme));
                }
            }

            var schemeLevels = perkScheme.Levels.Select(x => x !.MaxValue).ToArray();

            try
            {
                var isSuccess = TryConvertTotalIntoLevelSubsInner(schemeLevels, totalLevel, out var levelInner,
                                                                  out var subInner);

                perkLevel = null;
                if (isSuccess)
                {
                    perkLevel = new PerkLevel(levelInner, subInner);
                }

                return(isSuccess);
            }
            catch (ArgumentException exception)
            {
                if (exception.ParamName == "total")
                {
                    throw new ArgumentException($"Total {totalLevel} is too big", nameof(totalLevel), exception);
                }

                throw;
            }
        }
Esempio n. 9
0
        public void GetNextLevel_FromTestCases_ReturnsCorrectNextLevel(IPerkScheme perkScheme, PerkLevel currentLevel,
                                                                       PerkLevel expectedNextLevel)
        {
            // ACT
            var nextLevel = PerkHelper.GetNextLevel(perkScheme, currentLevel);

            // ASSERT
            nextLevel.Primary.Should().Be(expectedNextLevel.Primary);
            nextLevel.Sub.Should().Be(expectedNextLevel.Sub);
        }
Esempio n. 10
0
        public void ConvertLevelSubsToTotal_FromExceptionTestCases_ThrowsException(IPerkScheme perkScheme,
                                                                                   int primaryLevel, int subLevel)
        {
            // ACT
            Action act = () =>
            {
                PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel);
            };

            act.Should().Throw <Exception>();
        }
Esempio n. 11
0
        /// <summary>
        /// Преобразование уровня/подуровня в суммарный уровень.
        /// </summary>
        /// <param name="perkScheme">Схема.</param>
        /// <param name="level">Уровень перка.</param>
        /// <param name="subLevel">Подуровень перка.</param>
        /// <returns></returns>
        public static int ConvertLevelSubsToTotal(IPerkScheme perkScheme, int level, int subLevel)
        {
            if (perkScheme is null)
            {
                throw new ArgumentNullException(nameof(perkScheme));
            }

            if (perkScheme.Levels?.Length < level)
            {
                throw new ArgumentException(
                          $"Specified level: {level} is less that levels in scheme: {perkScheme.Levels?.Length}.");
            }

            var levels = perkScheme.Levels;

            if (levels is null)
            {
                throw new ArgumentException("The scheme's levels is null.", nameof(perkScheme));
            }

            var sum = 0;

            for (var i = 1; i <= level; i++)
            {
                var perkLevelSubScheme = levels[i - 1];
                if (perkLevelSubScheme is null)
                {
                    throw new InvalidOperationException();
                }

                if (i < level)
                {
                    sum += perkLevelSubScheme.MaxValue;
                }
                else
                {
                    if (perkLevelSubScheme.MaxValue < subLevel)
                    {
                        throw new ArgumentException(
                                  $"Specified sub: {subLevel} is less that sub in scheme: {perkLevelSubScheme.MaxValue}.");
                    }

                    sum += subLevel;
                }
            }

            return(sum);
        }
Esempio n. 12
0
        public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level)
        {
            var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub);

            currentTotal++;

            if (!TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var nextLevel))
            {
                throw new InvalidOperationException("Perk has no next level.");
            }

            if (nextLevel is null)
            {
                // The inner method garantee nextLevel is not null if convertion is successful.
                // So it is unknown error.
                throw new InvalidOperationException("Unknown exception.");
            }

            return(nextLevel);
        }
Esempio n. 13
0
        /// <summary>
        /// Преобразование уровня/подуровня в суммарный уровень.
        /// </summary>
        /// <param name="perkScheme">Схема.</param>
        /// <param name="level">Уровень перка.</param>
        /// <param name="subLevel">Подуровень перка.</param>
        /// <returns></returns>
        public static int?ConvertLevel(IPerkScheme perkScheme, int?level, int subLevel)
        {
            if (level == null)
            {
                return(null);
            }

            var sum = 0;

            for (var i = 0; i <= level; i++)
            {
                if (i < level)
                {
                    sum += perkScheme.Levels[i].MaxValue + 1;
                }
                else
                {
                    sum += subLevel;
                }
            }

            return(sum);
        }
Esempio n. 14
0
        public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level)
        {
            if (level == null)
            {
                return(new PerkLevel(0, 0));
            }

            var currentLevel    = level.Primary;
            var currentSubLevel = level.Sub;

            var currentLevelScheme = perkScheme.Levels[currentLevel];

            if (currentSubLevel + 1 > currentLevelScheme.MaxValue)
            {
                currentSubLevel = 0;
                currentLevel++;
            }
            else
            {
                currentSubLevel++;
            }

            return(new PerkLevel(currentLevel, currentSubLevel));
        }
Esempio n. 15
0
 public Perk(IPerkScheme scheme)
 {
     Scheme = scheme ?? throw new ArgumentNullException(nameof(scheme));
 }
Esempio n. 16
0
        public void ConvertTotalLevelToLevelSubs_FromTestCases_ReturnsCorrectLevelAndSublevel(IPerkScheme perkScheme,
                                                                                              int testedTotalLevel, int expectedLevel, int expectedSubLevel)
        {
            // ACT
            var isSuccess = PerkHelper.TryConvertTotalLevelToLevelSubs(perkScheme, testedTotalLevel, out var perkLevel);

            // ASSERT
            isSuccess.Should().BeTrue();
            perkLevel.Primary.Should().Be(expectedLevel);
            perkLevel.Sub.Should().Be(expectedSubLevel);
        }
Esempio n. 17
0
 public static bool HasNextLevel(IPerkScheme perkScheme, PerkLevel level)
 {
     return(GetNextLevelToCheckNext(perkScheme, level));
 }