Example #1
0
        /// <summary>
        /// Completes a perk level upgrade
        /// </summary>
        private void PurchaseUpgrade(Player player, Perk currentPerk, PerkLevel targetLevel)
        {
            if (currentPerk == null)
            {
                player.SendMessage("You have not started on this perk track!");
            }
            else if (targetLevel <= currentPerk.Level)
            {
                player.SendMessage("Your current abilities exceed your selected upgrade.");
            }
            else
            {
                int upgradeCost = GetUpgradeCost(currentPerk.Level, targetLevel);

                if (upgradeCost > player.EssenceOfCharacter)
                {
                    player.SendMessage("You do not have enough Essence of Character to afford this upgrade!");
                }
                else
                {
                    player.EssenceOfCharacter -= upgradeCost;
                    currentPerk.Level          = targetLevel;

                    PlayUpgradeEffect(player, currentPerk, targetLevel);
                }
            }
        }
Example #2
0
        public bool CanPerkBeUpgraded(Data.Entities.Perk perk, PCPerk pcPerk, PlayerCharacter player)
        {
            int rank    = pcPerk?.PerkLevel ?? 0;
            int maxRank = perk.PerkLevels.Count;

            if (rank + 1 > maxRank)
            {
                return(false);
            }

            PerkLevel level = FindPerkLevel(perk.PerkLevels, rank + 1);

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

            if (player.UnallocatedSP < level.Price)
            {
                return(false);
            }

            foreach (PerkLevelSkillRequirement req in level.PerkLevelSkillRequirements)
            {
                PCSkill pcSkill = _db.PCSkills.Single(x => x.PlayerID == player.PlayerID && x.SkillID == req.SkillID);
                if (pcSkill.Rank < req.RequiredRank)
                {
                    return(false);
                }
            }

            return(true);
        }
Example #3
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));
        }
Example #4
0
        /// <summary>
        /// Расчёт бонусов, которые дают перки.
        /// </summary>
        /// <param name="bonusDict"> Текущее состояние бонусов. </param>
        private void CalcPerkBonuses(Dictionary <SkillStatType, float> bonusDict)
        {
            var archievedPerks = _evolutionModule.GetArchievedPerks();

            foreach (var archievedPerk in archievedPerks)
            {
                PerkLevel currentLevel = archievedPerk.CurrentLevel;

                if (archievedPerk.Scheme.IsBuildIn)
                {
                    if (archievedPerk.Scheme.Levels is null)
                    {
                        continue;
                    }

                    currentLevel = new PerkLevel(0, 0);
                }

                var currentLevelScheme = archievedPerk.Scheme.Levels[currentLevel.Primary];

                if (currentLevelScheme.Rules == null)
                {
                    continue;
                }

                for (var i = 0; i <= currentLevel.Sub; i++)
                {
                    foreach (var rule in currentLevelScheme.Rules)
                    {
                        CalcRuleBonuses(rule, bonusDict);
                    }
                }
            }
        }
Example #5
0
 public LabelEntry this[PerkLevel level]
 {
     get
     {
         return(Find(entry => entry.Level == level));
     }
 }
Example #6
0
        private static bool GetNextLevelToCheckNext(IPerkScheme perkScheme, PerkLevel level)
        {
            var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub);

            currentTotal++;

            return(TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var _));
        }
Example #7
0
        public static bool CanPerkBeUpgraded(NWPlayer player, int perkID)
        {
            var dbPlayer   = DataService.Get <Player>(player.GlobalID);
            var perkLevels = DataService.Where <PerkLevel>(x => x.PerkID == perkID).ToList();
            var pcPerk     = DataService.SingleOrDefault <PCPerk>(x => x.PlayerID == player.GlobalID && x.PerkID == perkID);

            int rank = 0;

            if (pcPerk != null)
            {
                rank = pcPerk.PerkLevel;
            }
            int maxRank = perkLevels.Count;

            if (rank + 1 > maxRank)
            {
                return(false);
            }

            PerkLevel level = FindPerkLevel(perkLevels, rank + 1);

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

            if (dbPlayer.UnallocatedSP < level.Price)
            {
                return(false);
            }

            var skillRequirements = DataService.Where <PerkLevelSkillRequirement>(x => x.PerkLevelID == level.ID).ToList();

            var questRequirements = DataService.Where <PerkLevelQuestRequirement>(x => x.PerkLevelID == level.ID).ToList();

            foreach (var req in skillRequirements)
            {
                PCSkill pcSkill = DataService.Single <PCSkill>(x => x.PlayerID == dbPlayer.ID &&
                                                               x.SkillID == req.SkillID);

                if (pcSkill.Rank < req.RequiredRank)
                {
                    return(false);
                }
            }

            foreach (var req in questRequirements)
            {
                var pcQuest = DataService.SingleOrDefault <PCQuestStatus>(x => x.PlayerID == dbPlayer.ID &&
                                                                          x.QuestID == req.RequiredQuestID &&
                                                                          x.CompletionDate != null);
                if (pcQuest == null)
                {
                    return(false);
                }
            }
            return(true);
        }
        public void HasNextLevel_FromNegativeTestCases_AlwaysReturnsFalse(IPerkScheme perkScheme,
                                                                          PerkLevel currentLevel)
        {
            // ACT
            var factHasNextLevel = PerkHelper.HasNextLevel(perkScheme, currentLevel);

            // ASSERT
            factHasNextLevel.Should().BeFalse();
        }
Example #9
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;
            }
        }
        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);
        }
Example #11
0
        /// <summary>
        /// Gets the previous perk detail page to display
        /// </summary>
        private PerkLevel PreviousDisplayLevel(PerkLevel level)
        {
            switch (level)
            {
            default:
            case PerkLevel.First:
                return(PerkLevel.First);

            case PerkLevel.Fifth:
                return(PerkLevel.Third);
            }
        }
Example #12
0
        public int GetPCPerkLevel(NWPlayer player, int perkID)
        {
            if (!player.IsPlayer)
            {
                return(-1);
            }

            PerkLevel perkLevel = _db.StoredProcedureSingle <PerkLevel>("GetPCSkillAdjustedPerkLevel",
                                                                        new SqlParameter("PlayerID", player.GlobalID),
                                                                        new SqlParameter("PerkID", perkID));

            return(perkLevel?.Level ?? 0);
        }
        public void GetByID_OneItem_ReturnsPerkLevel()
        {
            // Arrange
            PerkLevel entity = new PerkLevel {
                ID = 1
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity));

            // Assert
            Assert.AreNotSame(entity, _cache.GetByID(1));
        }
Example #14
0
        /// <summary>
        /// Gets the progression dimension coordinate for the given perk level
        /// </summary>
        private int GetProgressionDim(PerkLevel level)
        {
            if (level == PerkLevel.None)
            {
                return(0);
            }

            if (level == PerkLevel.First)
            {
                return(14);
            }

            return(14 + (22 * ((int)level - 1)));
        }
Example #15
0
        /// <summary>
        /// Plays a special effect for upgrading a perk level
        /// </summary>
        private void PlayUpgradeEffect(Player player, Perk perk, PerkLevel newLevel)
        {
            Effects.SendMovingEffect(new Entity(Server.Serial.Zero, new Point3D(player.Location, player.Z + 20), player.Map), player, 0x373A, 10, 10, false, false);
            Effects.SendTargetEffect(player, 0x3779, 10, 10);
            player.PlaySound(0x0F8);

            if (newLevel == PerkLevel.First)
            {
                player.SendMessage("You have unlocked the first level of the {0} perk!", perk.Label);
            }
            else
            {
                player.SendMessage("You have upgraded {0} to the {1} level!", perk.Label, newLevel);
            }
        }
Example #16
0
        public PerkLevel GetPerkOptionsForCurrentLevel()
        {
            int       length    = perkTreeData.perkLevels.Length;
            PerkLevel perkLevel = null;

            for (int i = 0; i < length; i++)
            {
                var level = perkTreeData.perkLevels[i];
                if (level.unlockLevel == Level)
                {
                    return(level);
                }
            }
            hasPickedPerk = true;
            return(perkLevel);
        }
Example #17
0
        /// <summary>
        /// Gets the cost to upgrade from one perk level to another
        /// </summary>
        private int GetUpgradeCost(PerkLevel currentLevel, PerkLevel targetLevel)
        {
            if (targetLevel <= currentLevel)
            {
                return(0);
            }

            int diff = (targetLevel - currentLevel);
            int sum  = 0;

            for (int i = 1; i <= diff; i++)
            {
                sum += (5000 * (int)(Math.Pow(2, ((int)currentLevel + i))));
            }

            return(sum);
        }
        public void GetByID_TwoItems_ReturnsCorrectObject()
        {
            // Arrange
            PerkLevel entity1 = new PerkLevel {
                ID = 1
            };
            PerkLevel entity2 = new PerkLevel {
                ID = 2
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity2));

            // Assert
            Assert.AreNotSame(entity1, _cache.GetByID(1));
            Assert.AreNotSame(entity2, _cache.GetByID(2));
        }
Example #19
0
        private void FillSurvivalBonusesFromPerks([NotNull][ItemNotNull] ref List <SurvivalStatBonus> bonusList)
        {
            if (_evolutionModule is null)
            {
                return;
            }

            var archievedPerks = _evolutionModule.GetArchievedPerks();

            foreach (var archievedPerk in archievedPerks)
            {
                PerkLevel          currentLevel;
                PerkLevelSubScheme currentLevelScheme;

                if (archievedPerk.Scheme.IsBuildIn)
                {
                    currentLevel = new PerkLevel(0, 0);
                }
                else
                {
                    currentLevel = archievedPerk.CurrentLevel;
                }

                if (archievedPerk.Scheme.IsBuildIn && archievedPerk.Scheme.Levels is null)
                {
                    continue;
                }

                currentLevelScheme = archievedPerk.Scheme.Levels[currentLevel.Primary];

                if (currentLevelScheme.Rules == null)
                {
                    continue;
                }

                for (var i = 0; i <= currentLevel.Sub; i++)
                {
                    foreach (var rule in currentLevelScheme.Rules)
                    {
                        bonusList = ProcessRule(bonusList, rule);
                    }
                }
            }
        }
        public void GetByID_RemovedItem_ReturnsCorrectObject()
        {
            // Arrange
            PerkLevel entity1 = new PerkLevel {
                ID = 1
            };
            PerkLevel entity2 = new PerkLevel {
                ID = 2
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity2));
            MessageHub.Instance.Publish(new OnCacheObjectDeleted <PerkLevel>(entity1));

            // Assert
            Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(1); });
            Assert.AreNotSame(entity2, _cache.GetByID(2));
        }
Example #21
0
        /// <summary>
        /// Converts a perk level to a Roman numeral
        /// </summary>
        private string LevelToNumeral(PerkLevel value)
        {
            string res = "";

            switch (value)
            {
            case PerkLevel.First: res = "I"; break;

            case PerkLevel.Second: res = "II"; break;

            case PerkLevel.Third: res = "III"; break;

            case PerkLevel.Fourth: res = "IV"; break;

            case PerkLevel.Fifth: res = "V"; break;
            }

            return(res);
        }
Example #22
0
 public void UpdatePerkOptions()
 {
     if (!tower.hasPickedPerk)
     {
         var level = tower.GetPerkOptionsForCurrentLevel();
         if (level != null)
         {
             optionAText.SetText(level.perkA.description.ToString());
             optionBText.SetText(level.perkB.description.ToString());
             perkLevel = level;
             perkOptionContainer.SetActive(true);
         }
     }
     else if (tower.hasPickedPerk)
     {
         perkOptionContainer.SetActive(false);
     }
     UpdateUpgradeButton();
 }
        public void GetByID_NoItems_ThrowsKeyNotFoundException()
        {
            // Arrange
            PerkLevel entity1 = new PerkLevel {
                ID = 1
            };
            PerkLevel entity2 = new PerkLevel {
                ID = 2
            };

            // Act
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectSet <PerkLevel>(entity2));
            MessageHub.Instance.Publish(new OnCacheObjectDeleted <PerkLevel>(entity1));
            MessageHub.Instance.Publish(new OnCacheObjectDeleted <PerkLevel>(entity2));

            // Assert
            Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(1); });
            Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(2); });
        }
Example #24
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);
        }
Example #25
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));
        }
Example #26
0
        /// <summary>
        /// Plays a special effect for upgrading a perk level
        /// </summary>
        private void PlayUpgradeEffect( Player player, Perk perk, PerkLevel newLevel )
        {
            Effects.SendMovingEffect(new Entity(Server.Serial.Zero, new Point3D(player.Location, player.Z + 20), player.Map), player, 0x373A, 10, 10, false, false);
            Effects.SendTargetEffect(player, 0x3779, 10, 10);
            player.PlaySound(0x0F8);

            if( newLevel == PerkLevel.First )
            {
                player.SendMessage("You have unlocked the first level of the {0} perk!", perk.Label);
            }
            else
            {
                player.SendMessage("You have upgraded {0} to the {1} level!", perk.Label, newLevel);
            }
        }
Example #27
0
        /// <summary>
        /// Completes a perk level upgrade
        /// </summary>
        private void PurchaseUpgrade( Player player, Perk currentPerk, PerkLevel targetLevel )
        {
            if( currentPerk == null )
            {
                player.SendMessage("You have not started on this perk track!");
            }
            else if( targetLevel <= currentPerk.Level )
            {
                player.SendMessage("Your current abilities exceed your selected upgrade.");
            }
            else
            {
                int upgradeCost = GetUpgradeCost(currentPerk.Level, targetLevel);

                if( upgradeCost > player.EssenceOfCharacter )
                {
                    player.SendMessage("You do not have enough Essence of Character to afford this upgrade!");
                }
                else
                {
                    player.EssenceOfCharacter -= upgradeCost;
                    currentPerk.Level = targetLevel;

                    PlayUpgradeEffect(player, currentPerk, targetLevel);
                }
            }
        }
Example #28
0
 /// <summary>
 /// Gets the previous perk detail page to display
 /// </summary>
 private PerkLevel PreviousDisplayLevel( PerkLevel level )
 {
     switch( level )
     {
         default:
         case PerkLevel.First:
             return PerkLevel.First;
         case PerkLevel.Fifth:
             return PerkLevel.Third;
     }
 }
Example #29
0
 /// <summary>
 /// Gets the next perk detail page to display
 /// </summary>
 private PerkLevel NextDisplayLevel( PerkLevel level )
 {
     switch( level )
     {
         default:
         case PerkLevel.First:
             return PerkLevel.Third;
         case PerkLevel.Third:
             return PerkLevel.Fifth;
         case PerkLevel.Fifth:
             return PerkLevel.First;
     }
 }
Example #30
0
        /// <summary>
        /// Converts a perk level to a Roman numeral
        /// </summary>
        private string LevelToNumeral( PerkLevel value )
        {
            string res = "";

            switch( value )
            {
                case PerkLevel.First: res = "I"; break;
                case PerkLevel.Second: res = "II"; break;
                case PerkLevel.Third: res = "III"; break;
                case PerkLevel.Fourth: res = "IV"; break;
                case PerkLevel.Fifth: res = "V"; break;
            }

            return res;
        }
Example #31
0
        public PerkOverviewGump( Player from, Page page, Perk perk, PerkLevel displayLevel, PerkLevel targetLevel )
            : base(10, 10)
        {
            Player = from;
            Perk = perk;
            CurrentLevel = displayLevel;
            bool hasPerk = Perk.HasPerk(from, perk);

            AddPage(0);

            int bkHeight = 135, bkWidth = 30;

            if( page == Page.Detail )
            {
                if( targetLevel > PerkLevel.None && (!hasPerk || targetLevel != Perk.Get(from, perk).Level) )
                    bkHeight = 475;
                else
                    bkHeight = 415;

                bkWidth = 450;
            }
            else
            {
                int columns = (int)Math.Ceiling((double)Perk.AllPerks.Count / 4);
                int rows = (Perk.AllPerks.Count >= 4 ? 4 : Perk.AllPerks.Count);

                bkHeight += (rows * 70);
                bkWidth += (columns * 105);
            }

            AddBackground(0, 0, bkWidth, bkHeight, 9250);

            switch( page )
            {
                case Page.Overview:
                    AddHtml(15, 15, (bkWidth - 30), 15, Color(Center("Perks Overview"), HtmlWhite), false, false);
                    AddHtml(15, 35, (bkWidth - 30), 70, String.Format("<center>Upgrade your character's Abilities using Essence of Character." +
                                                "<br><br><center>You currently have {0}",
                                                Color(String.Format("{0:N0} Essence of Character", from.EssenceOfCharacter), HtmlBlack)
                                                ), false, true);
                    AddImageTiled(15, 110, (bkWidth - 30), 4, 9151);

                    int x = 20, y = 120;

                    for( int i = 0; i < Perk.AllPerks.Count; i++ )
                    {
                        hasPerk = Perk.HasPerk(from, Perk.AllPerks[i]);

                        if( i > 0 && (i % 4) == 0 )
                        {
                            x += 105;
                            y = 120;
                        }

                        AddBlackAlpha((x - 2), (y + 3), 90, 65);
                        AddLabel(x, y, LabelHue, Perk.AllPerks[i].Label);

                        int perkIcon = Perk.AllPerks[i].GumpID;

                        if( perkIcon == 0 )
                            perkIcon = 21280;

                        AddButton((x + 30), (y + 20), perkIcon, perkIcon, GetButtonId(1, i), GumpButtonType.Reply, 0);
                        AddButton((x + 59), (y + 49), (hasPerk ? 2361 : 2360), (hasPerk ? 2361 : 2360), GetButtonId(1, i), GumpButtonType.Reply, 0);

                        y += 70;
                    }
                    break;
                case Page.Detail:
                    if( perk == null )
                        return;

                    AddHtml(15, 15, (bkWidth - 30), 18, Color(Center(perk.Label), HtmlWhite), false, false);

                    int imgId = perk.GumpID;

                    if( imgId == 0 )
                        imgId = 21280;

                    AddImage(15, 38, imgId);
                    AddHtml(45, 38, (bkWidth - 75), 40, Center(perk.Description), false, false);
                    AddImageTiled(15, 84, (bkWidth - 30), 4, 9151);
                    AddButton(15, 15, 4014, 4015, GetButtonId(2, 0), GumpButtonType.Reply, 0);

                    AddImage(45, 90, 2200);

                    if( displayLevel > PerkLevel.First )
                        AddButton(68, 94, 2205, 2205, GetButtonId(2, 1), GumpButtonType.Reply, 0);

                    if( displayLevel < PerkLevel.Fifth )
                        AddButton(339, 94, 2206, 2206, GetButtonId(2, 2), GumpButtonType.Reply, 0);

                    LabelEntry left = perk.LabelEntries[displayLevel];

                    AddHtml(70, 117, 140, 40, Center(left.Label), false, false);
                    AddHtml(70, 162, 140, 110, Color(left.Description, HtmlBlack), false, true);
                    AddLabel(135, 275, 0, LevelToNumeral(displayLevel));

                    if( displayLevel != PerkLevel.Fifth )
                    {
                        LabelEntry right = perk.LabelEntries[(displayLevel + 1)];

                        AddHtml(230, 117, 140, 40, Center(right.Label), false, false);
                        AddHtml(230, 162, 140, 110, Color(right.Description, HtmlBlack), false, true);
                        AddLabel(295, 275, 0, LevelToNumeral(displayLevel + 1));
                    }

                    string trackProgressLbl = "";

                    if( !hasPerk )
                    {
                        if( Perk.HasFreeSlot(from) )
                        {
                            trackProgressLbl = "You have not started on this perk track.";

                            if( from.EssenceOfCharacter >= Perk.FirstLevelCost )
                            {
                                AddLabel(15, 350, LabelHue, "You can begin developing this perk for 10,000 Essence of Character.");
                                AddButton(205, 380, 4023, 4024, GetButtonId(6, 0), GumpButtonType.Reply, 0);
                                AddLabel(245, 380, LabelHue, String.Format("Begin {0}", perk.Label));
                            }
                            else
                            {
                                AddLabel(15, 350, LabelHue, "You need at least 10,000 Essence of Character to develop a perk.");
                            }
                        }
                        else
                        {
                            trackProgressLbl = "You already have two other perks and cannot begin another track.";
                        }
                    }
                    else
                    {
                        Perk playerPerk = Perk.Get(from, perk);
                        from.ValidateEquipment();

                        if( playerPerk.Level == PerkLevel.Fifth )
                            trackProgressLbl = "You have mastered this perk, congratulations!";
                        else
                            trackProgressLbl = "You are currently progressing on this perk track.";

                        AddLabel(30, 365, LabelHue, "Level:");
                        AddImage(75, 370, 2053); //base progress bar

                        if( targetLevel > PerkLevel.None && targetLevel != playerPerk.Level )
                        {
                            AddImageTiled(75, 370, (4 + GetProgressionDim(targetLevel)), 11, 2057); //yellow progress overlay

                            if( targetLevel == PerkLevel.Fifth )
                            {
                                AddButton(190, 370, 2437, 2438, GetButtonId(4, (int)(targetLevel - 1)), GumpButtonType.Reply, 0);
                                AddLabel(205, 365, LabelHue, "- level");
                            }
                            else
                            {
                                AddButton(190, 360, 2435, 2436, GetButtonId(3, (int)(targetLevel + 1)), GumpButtonType.Reply, 0);
                                AddLabel(205, 355, LabelHue, "+ level");

                                AddButton(190, 380, 2437, 2438, GetButtonId(4, (int)(targetLevel - 1)), GumpButtonType.Reply, 0);
                                AddLabel(205, 375, LabelHue, "- level");
                            }

                            int upgradeCost = GetUpgradeCost(playerPerk.Level, targetLevel);

                            AddLabel(80, 395, LabelHue, "EoC Cost:");
                            AddLabel(155, 395, LabelHue, upgradeCost.ToString("N0"));

                            AddLabel(80, 415, LabelHue, "You have:");
                            AddLabel(155, 415, LabelHue, from.EssenceOfCharacter.ToString("N0"));

                            AddLabel(80, 435, LabelHue, "Remainder:");
                            AddLabel(155, 435, (upgradeCost > from.EssenceOfCharacter ? 32 : 1154), (from.EssenceOfCharacter - upgradeCost).ToString("N0"));

                            if( upgradeCost <= from.EssenceOfCharacter )
                            {
                                AddLabel(285, 440, LabelHue, "Purchase Upgrade");
                                AddButton(405, 440, 4023, 4024, GetButtonId(5, (int)targetLevel), GumpButtonType.Reply, 0);
                            }
                        }
                        else if( playerPerk.Level != PerkLevel.Fifth )
                        {
                            AddButton(190, 370, 2435, 2436, GetButtonId(3, (int)(playerPerk.Level + 1)), GumpButtonType.Reply, 0);
                            AddLabel(205, 365, LabelHue, "+ level");
                        }

                        int progress = GetProgressionDim(playerPerk.Level);

                        AddLabel((75 + progress), 350, LabelHue, ((int)playerPerk.Level).ToString()); //progress level indicator
                        AddImageTiled(75, 370, (4 + progress), 11, 2054); //blue progress overlay
                        AddImage((75 + progress), 370, 2104); //progress pin
                    }

                    AddLabel(15, 330, LabelHue, trackProgressLbl);
                    break;
            }
        }
Example #32
0
 public static bool HasNextLevel(IPerkScheme perkScheme, PerkLevel level)
 {
     return(GetNextLevelToCheckNext(perkScheme, level));
 }
Example #33
0
        /// <summary>
        /// Gets the progression dimension coordinate for the given perk level
        /// </summary>
        private int GetProgressionDim( PerkLevel level )
        {
            if( level == PerkLevel.None )
                return 0;

            if( level == PerkLevel.First )
                return 14;

            return 14 + (22 * ((int)level - 1));
        }
Example #34
0
 public PerkOverviewGump( Player from, Page page, Perk perk, PerkLevel displayLevel )
     : this(from, page, perk, displayLevel, PerkLevel.None)
 {
 }
Example #35
0
        private void FillSurvivalBonusesFromPerks(ref List <SurvivalStatBonus> bonusList)
        {
            if (_evolutionModule is null)
            {
                return;
            }

            var archievedPerks = _evolutionModule.GetArchievedPerks();

            foreach (var archievedPerk in archievedPerks)
            {
                PerkLevel?         currentLevel;
                PerkLevelSubScheme currentLevelScheme;

                if (archievedPerk.Scheme.IsBuildIn)
                {
                    currentLevel = new PerkLevel(1, 1);
                }
                else
                {
                    currentLevel = archievedPerk.CurrentLevel;
                }

                if (archievedPerk.Scheme.IsBuildIn && archievedPerk.Scheme.Levels is null)
                {
                    continue;
                }

                var levels = archievedPerk.Scheme.Levels;
                if (levels is null)
                {
                    continue;
                }

                if (currentLevel is null)
                {
                    continue;
                }

                var notNullLevels = ConvertToNotNullLevels(levels);

                currentLevelScheme = notNullLevels[currentLevel.Primary - 1];

                if (currentLevelScheme.Rules == null)
                {
                    continue;
                }

                for (var i = 0; i <= currentLevel.Sub; i++)
                {
                    foreach (var rule in currentLevelScheme.Rules)
                    {
                        if (rule is null)
                        {
                            continue;
                        }

                        bonusList = ProcessRule(bonusList, rule);
                    }
                }
            }
        }
Example #36
0
        public PerkOverviewGump(Player from, Page page, Perk perk, PerkLevel displayLevel, PerkLevel targetLevel)
            : base(10, 10)
        {
            Player       = from;
            Perk         = perk;
            CurrentLevel = displayLevel;
            bool hasPerk = Perk.HasPerk(from, perk);

            AddPage(0);

            int bkHeight = 135, bkWidth = 30;

            if (page == Page.Detail)
            {
                if (targetLevel > PerkLevel.None && (!hasPerk || targetLevel != Perk.Get(from, perk).Level))
                {
                    bkHeight = 475;
                }
                else
                {
                    bkHeight = 415;
                }

                bkWidth = 450;
            }
            else
            {
                int columns = (int)Math.Ceiling((double)Perk.AllPerks.Count / 4);
                int rows    = (Perk.AllPerks.Count >= 4 ? 4 : Perk.AllPerks.Count);

                bkHeight += (rows * 70);
                bkWidth  += (columns * 105);
            }

            AddBackground(0, 0, bkWidth, bkHeight, 9250);

            switch (page)
            {
            case Page.Overview:
                AddHtml(15, 15, (bkWidth - 30), 15, Color(Center("Perks Overview"), HtmlWhite), false, false);
                AddHtml(15, 35, (bkWidth - 30), 70, String.Format("<center>Upgrade your character's Abilities using Essence of Character." +
                                                                  "<br><br><center>You currently have {0}",
                                                                  Color(String.Format("{0:N0} Essence of Character", from.EssenceOfCharacter), HtmlBlack)
                                                                  ), false, true);
                AddImageTiled(15, 110, (bkWidth - 30), 4, 9151);

                int x = 20, y = 120;

                for (int i = 0; i < Perk.AllPerks.Count; i++)
                {
                    hasPerk = Perk.HasPerk(from, Perk.AllPerks[i]);

                    if (i > 0 && (i % 4) == 0)
                    {
                        x += 105;
                        y  = 120;
                    }

                    AddBlackAlpha((x - 2), (y + 3), 90, 65);
                    AddLabel(x, y, LabelHue, Perk.AllPerks[i].Label);

                    int perkIcon = Perk.AllPerks[i].GumpID;

                    if (perkIcon == 0)
                    {
                        perkIcon = 21280;
                    }

                    AddButton((x + 30), (y + 20), perkIcon, perkIcon, GetButtonId(1, i), GumpButtonType.Reply, 0);
                    AddButton((x + 59), (y + 49), (hasPerk ? 2361 : 2360), (hasPerk ? 2361 : 2360), GetButtonId(1, i), GumpButtonType.Reply, 0);

                    y += 70;
                }
                break;

            case Page.Detail:
                if (perk == null)
                {
                    return;
                }

                AddHtml(15, 15, (bkWidth - 30), 18, Color(Center(perk.Label), HtmlWhite), false, false);

                int imgId = perk.GumpID;

                if (imgId == 0)
                {
                    imgId = 21280;
                }

                AddImage(15, 38, imgId);
                AddHtml(45, 38, (bkWidth - 75), 40, Center(perk.Description), false, false);
                AddImageTiled(15, 84, (bkWidth - 30), 4, 9151);
                AddButton(15, 15, 4014, 4015, GetButtonId(2, 0), GumpButtonType.Reply, 0);

                AddImage(45, 90, 2200);

                if (displayLevel > PerkLevel.First)
                {
                    AddButton(68, 94, 2205, 2205, GetButtonId(2, 1), GumpButtonType.Reply, 0);
                }

                if (displayLevel < PerkLevel.Fifth)
                {
                    AddButton(339, 94, 2206, 2206, GetButtonId(2, 2), GumpButtonType.Reply, 0);
                }

                LabelEntry left = perk.LabelEntries[displayLevel];

                AddHtml(70, 117, 140, 40, Center(left.Label), false, false);
                AddHtml(70, 162, 140, 110, Color(left.Description, HtmlBlack), false, true);
                AddLabel(135, 275, 0, LevelToNumeral(displayLevel));

                if (displayLevel != PerkLevel.Fifth)
                {
                    LabelEntry right = perk.LabelEntries[(displayLevel + 1)];

                    AddHtml(230, 117, 140, 40, Center(right.Label), false, false);
                    AddHtml(230, 162, 140, 110, Color(right.Description, HtmlBlack), false, true);
                    AddLabel(295, 275, 0, LevelToNumeral(displayLevel + 1));
                }

                string trackProgressLbl = "";

                if (!hasPerk)
                {
                    if (Perk.HasFreeSlot(from))
                    {
                        trackProgressLbl = "You have not started on this perk track.";

                        if (from.EssenceOfCharacter >= Perk.FirstLevelCost)
                        {
                            AddLabel(15, 350, LabelHue, "You can begin developing this perk for 10,000 Essence of Character.");
                            AddButton(205, 380, 4023, 4024, GetButtonId(6, 0), GumpButtonType.Reply, 0);
                            AddLabel(245, 380, LabelHue, String.Format("Begin {0}", perk.Label));
                        }
                        else
                        {
                            AddLabel(15, 350, LabelHue, "You need at least 10,000 Essence of Character to develop a perk.");
                        }
                    }
                    else
                    {
                        trackProgressLbl = "You already have two other perks and cannot begin another track.";
                    }
                }
                else
                {
                    Perk playerPerk = Perk.Get(from, perk);
                    from.ValidateEquipment();

                    if (playerPerk.Level == PerkLevel.Fifth)
                    {
                        trackProgressLbl = "You have mastered this perk, congratulations!";
                    }
                    else
                    {
                        trackProgressLbl = "You are currently progressing on this perk track.";
                    }

                    AddLabel(30, 365, LabelHue, "Level:");
                    AddImage(75, 370, 2053);     //base progress bar

                    if (targetLevel > PerkLevel.None && targetLevel != playerPerk.Level)
                    {
                        AddImageTiled(75, 370, (4 + GetProgressionDim(targetLevel)), 11, 2057);     //yellow progress overlay

                        if (targetLevel == PerkLevel.Fifth)
                        {
                            AddButton(190, 370, 2437, 2438, GetButtonId(4, (int)(targetLevel - 1)), GumpButtonType.Reply, 0);
                            AddLabel(205, 365, LabelHue, "- level");
                        }
                        else
                        {
                            AddButton(190, 360, 2435, 2436, GetButtonId(3, (int)(targetLevel + 1)), GumpButtonType.Reply, 0);
                            AddLabel(205, 355, LabelHue, "+ level");

                            AddButton(190, 380, 2437, 2438, GetButtonId(4, (int)(targetLevel - 1)), GumpButtonType.Reply, 0);
                            AddLabel(205, 375, LabelHue, "- level");
                        }

                        int upgradeCost = GetUpgradeCost(playerPerk.Level, targetLevel);

                        AddLabel(80, 395, LabelHue, "EoC Cost:");
                        AddLabel(155, 395, LabelHue, upgradeCost.ToString("N0"));

                        AddLabel(80, 415, LabelHue, "You have:");
                        AddLabel(155, 415, LabelHue, from.EssenceOfCharacter.ToString("N0"));

                        AddLabel(80, 435, LabelHue, "Remainder:");
                        AddLabel(155, 435, (upgradeCost > from.EssenceOfCharacter ? 32 : 1154), (from.EssenceOfCharacter - upgradeCost).ToString("N0"));

                        if (upgradeCost <= from.EssenceOfCharacter)
                        {
                            AddLabel(285, 440, LabelHue, "Purchase Upgrade");
                            AddButton(405, 440, 4023, 4024, GetButtonId(5, (int)targetLevel), GumpButtonType.Reply, 0);
                        }
                    }
                    else if (playerPerk.Level != PerkLevel.Fifth)
                    {
                        AddButton(190, 370, 2435, 2436, GetButtonId(3, (int)(playerPerk.Level + 1)), GumpButtonType.Reply, 0);
                        AddLabel(205, 365, LabelHue, "+ level");
                    }

                    int progress = GetProgressionDim(playerPerk.Level);

                    AddLabel((75 + progress), 350, LabelHue, ((int)playerPerk.Level).ToString()); //progress level indicator
                    AddImageTiled(75, 370, (4 + progress), 11, 2054);                             //blue progress overlay
                    AddImage((75 + progress), 370, 2104);                                         //progress pin
                }

                AddLabel(15, 330, LabelHue, trackProgressLbl);
                break;
            }
        }
Example #37
0
        /// <summary>
        /// Gets the cost to upgrade from one perk level to another
        /// </summary>
        private int GetUpgradeCost( PerkLevel currentLevel, PerkLevel targetLevel )
        {
            if( targetLevel <= currentLevel )
                return 0;

            int diff = (targetLevel - currentLevel);
            int sum = 0;

            for( int i = 1; i <= diff; i++ )
            {
                sum += (5000 * (int)(Math.Pow(2, ((int)currentLevel + i))));
            }

            return sum;
        }
Example #38
0
        private void BuildPerkDetails()
        {
            Model vm = GetDialogCustomData <Model>();

            Data.Entity.Perk perk   = _perk.GetPerkByID(vm.SelectedPerkID);
            PCPerk           pcPerk = _perk.GetPCPerkByID(GetPC().GlobalID, perk.ID);
            Player           player = _player.GetPlayerEntity(GetPC().GlobalID);
            var perkLevels          = _data.Where <PerkLevel>(x => x.PerkID == perk.ID).ToList();

            int       rank             = pcPerk?.PerkLevel ?? 0;
            int       maxRank          = perkLevels.Count();
            string    currentBonus     = "N/A";
            string    nextBonus        = "N/A";
            string    price            = "N/A";
            PerkLevel currentPerkLevel = _perk.FindPerkLevel(perkLevels, rank);
            PerkLevel nextPerkLevel    = _perk.FindPerkLevel(perkLevels, rank + 1);

            SetResponseVisible("PerkDetailsPage", 1, _perk.CanPerkBeUpgraded(GetPC(), vm.SelectedPerkID));

            if (rank > 0)
            {
                if (currentPerkLevel != null)
                {
                    currentBonus = currentPerkLevel.Description;
                }
            }
            if (rank + 1 <= maxRank)
            {
                if (nextPerkLevel != null)
                {
                    nextBonus = nextPerkLevel.Description;
                    price     = nextPerkLevel.Price + " SP (Available: " + player.UnallocatedSP + " SP)";
                }
            }
            var perkCategory     = _data.Get <PerkCategory>(perk.PerkCategoryID);
            var cooldownCategory = perk.CooldownCategoryID == null ? null : _data.Get <CooldownCategory>(perk.CooldownCategoryID);

            string header = _color.Green("Name: ") + perk.Name + "\n" +
                            _color.Green("Category: ") + perkCategory.Name + "\n" +
                            _color.Green("Rank: ") + rank + " / " + maxRank + "\n" +
                            _color.Green("Price: ") + price + "\n" +
                            (perk.BaseFPCost > 0 ? _color.Green("FP: ") + perk.BaseFPCost : "") + "\n" +
                            (cooldownCategory != null && cooldownCategory.BaseCooldownTime > 0 ? _color.Green("Cooldown: ") + cooldownCategory.BaseCooldownTime + "s" : "") + "\n" +
                            _color.Green("Description: ") + perk.Description + "\n" +
                            _color.Green("Current Bonus: ") + currentBonus + "\n" +
                            _color.Green("Next Bonus: ") + nextBonus + "\n";

            if (nextPerkLevel != null)
            {
                List <PerkLevelSkillRequirement> requirements =
                    _data.Where <PerkLevelSkillRequirement>(x => x.PerkLevelID == nextPerkLevel.ID).ToList();
                if (requirements.Count > 0)
                {
                    header += "\n" + _color.Green("Next Upgrade Skill Requirements:\n\n");

                    bool hasRequirement = false;
                    foreach (PerkLevelSkillRequirement req in requirements)
                    {
                        if (req.RequiredRank > 0)
                        {
                            PCSkill pcSkill = _skill.GetPCSkill(GetPC(), req.SkillID);
                            Skill   skill   = _skill.GetSkill(pcSkill.SkillID);

                            string detailLine = skill.Name + " Rank " + req.RequiredRank;

                            if (pcSkill.Rank >= req.RequiredRank)
                            {
                                header += _color.Green(detailLine) + "\n";
                            }
                            else
                            {
                                header += _color.Red(detailLine) + "\n";
                            }

                            hasRequirement = true;
                        }
                    }

                    if (requirements.Count <= 0 || !hasRequirement)
                    {
                        header += "None\n";
                    }
                }
            }

            SetPageHeader("PerkDetailsPage", header);
        }
Example #39
0
 public PerkOverviewGump(Player from, Page page, Perk perk, PerkLevel displayLevel)
     : this(from, page, perk, displayLevel, PerkLevel.None)
 {
 }