private void EnsureSpecialForPerk(string perkName, int perkLevel) { Perk perk = GetPerk(perkName); Special requiredSpecial = perk.specialPreReq.type; int requiredLevel = perk.specialPreReq.level; int currentLevel = _initialBuild[requiredSpecial] + _investedPoints[requiredSpecial]; if (currentLevel >= requiredLevel) { return; } int diff = requiredLevel - currentLevel; while (diff > 0) { currentLevel = _initialBuild[requiredSpecial] + _investedPoints[requiredSpecial]; if (_initialSpecialPoints > 0) { _initialSpecialPoints--; _initialBuild[requiredSpecial]++; } else { _investedPoints[requiredSpecial]++; PerkInstruction pi = new PerkInstruction() { Perk = requiredSpecial.ToString(), PerkLevel = currentLevel + 1 }; _buildOrder.Add(pi); } RemoveSpecialsFromQueue(requiredSpecial, currentLevel + 1); diff--; } }
private bool AddPerkToQueue(string perk, int pri, int lineNum) { string[] parts = perk.Split('-'); if (parts.Length < 1 || parts.Length > 2) { Console.Error.WriteLine($"Invalid specification {perk} on line #{lineNum}"); return(false); } int specifiedLevel = 0; string perkName = parts[0].Trim(); Perk match = null; if (parts.Length > 1) { if (!Int32.TryParse(parts[1], out specifiedLevel)) { Console.Error.WriteLine($"Invalid max rank {parts[1]} on line #{lineNum}, is not a number."); return(false); } } if (IsSpecial(perkName)) { if (specifiedLevel == 0) { specifiedLevel = 10; } else { if (specifiedLevel < 0 || specifiedLevel > 10) { Console.Error.WriteLine($"Level {specifiedLevel} for Special {perkName} is invalid. Must be between 1 and 10."); return(false); } } } else { IEnumerable <Perk> matches = _data.perks.Where(x => x.name == perkName); if (matches.Count() <= 0) { string closestName = GetClosestPerkName(perkName); Console.Error.WriteLine($"Perk {perkName} does not exist on line #{lineNum}. Did you mean {closestName}?"); return(false); } match = matches.First(); int maxLevel = GetMaxLevelForPerk(perkName); if (specifiedLevel > 0) { if (specifiedLevel > maxLevel) { Console.Error.WriteLine($"Level {specifiedLevel} is greater than max level {maxLevel} for perk {perkName}"); return(false); } } else { specifiedLevel = maxLevel; } } for (int i = 1; i <= specifiedLevel; ++i) { // Specials have no match, keep it at 0 int requiredLevel = 0; if (match != null) { Rank currentRank = match.ranks.Where(x => x.rank == i).First(); requiredLevel = currentRank.levelPreReq; } PriorityPerkRequest pi = new PriorityPerkRequest() { Perk = perkName, PerkLevel = i, Priority = pri, RequiredCharacterLevel = requiredLevel }; if (IsSpecial(perkName) && i == 1) { // Skip specials for rank 1, already have it by default continue; } _queue.Add(pi); } return(true); }