/// <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); } } }
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); }
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)); }
/// <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); } } } }
public LabelEntry this[PerkLevel level] { get { return(Find(entry => entry.Level == level)); } }
private static bool GetNextLevelToCheckNext(IPerkScheme perkScheme, PerkLevel level) { var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub); currentTotal++; return(TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var _)); }
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(); }
/// <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); }
/// <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); } }
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)); }
/// <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))); }
/// <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); } }
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); }
/// <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)); }
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)); }
/// <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); }
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); }); }
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); }
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)); }
/// <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); } }
/// <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); } } }
/// <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; } }
/// <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; } }
/// <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; }
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; } }
public static bool HasNextLevel(IPerkScheme perkScheme, PerkLevel level) { return(GetNextLevelToCheckNext(perkScheme, level)); }
/// <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)); }
public PerkOverviewGump( Player from, Page page, Perk perk, PerkLevel displayLevel ) : this(from, page, perk, displayLevel, PerkLevel.None) { }
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); } } } }
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; } }
/// <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; }
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); }
public PerkOverviewGump(Player from, Page page, Perk perk, PerkLevel displayLevel) : this(from, page, perk, displayLevel, PerkLevel.None) { }