/// <summary> /// Process skill stats /// These are non-standard skills, pre-processed by the parser. /// /// augmentSkill contains both the skill name and the increment amount /// augmentSkillExtras contains any additional info like which class it belongs to, and tier. /// This is done to avoid cross-record/item lookups at runtime /// </summary> /// <param name="stats"></param> /// <param name="result"></param> private void ProcessAddSkill(ISet <IItemStat> stats, List <TranslatedStat> result) { var skillCandidates = stats.Where(m => m.Stat.StartsWith("augmentSkill") && m.Stat.Length == "augmentSkill".Length + 1).ToList(); // "augmentSkill1", "augmentSkill2", foreach (var stat in skillCandidates) { var statName = stat.Stat; // Record is requires as we may have "augmentSkill1" multiple times, from different records. IItemStat statExtras = stats.FirstOrDefault(m => m.Stat == statName + "Extras" && m.Record == stat.Record); TranslatedStat extraStat = null; if (statExtras != null) { extraStat = new TranslatedStat { Text = _language.GetTag(statName + "Extras"), Param0 = statExtras.Value, Param3 = _language.GetTag(statExtras.TextValue) }; } if (stat != null) { result.Add(new TranslatedStat { Text = _language.GetTag(statName), Param0 = stat.Value, Param3 = stat.TextValue, Extra = extraStat }); } } }
/// <summary> /// Process skill stats /// These are non-standard skills, pre-processed by the parser. /// /// augmentSkill contains both the skill name and the increment amount /// augmentSkillExtras contains any additional info like which class it belongs to, and tier. /// This is done to avoid cross-record/item lookups at runtime /// </summary> /// <param name="stats"></param> /// <param name="result"></param> private void ProcessAddSkill(ISet <IItemStat> stats, List <TranslatedStat> result) { // "augmentSkill1", "augmentSkill2", for (int i = 1; i <= 4; i++) { var statName = "augmentSkill" + i; var stat = stats.FirstOrDefault(m => m.Stat == statName); var statExtras = stats.FirstOrDefault(m => m.Stat == statName + "Extras"); TranslatedStat extraStat = null; if (statExtras != null) { extraStat = new TranslatedStat { Text = _language.GetTag(statName + "Extras"), Param0 = statExtras.Value, Param3 = _language.GetTag(statExtras.TextValue) }; } if (stat != null) { result.Add(new TranslatedStat { Text = _language.GetTag(statName), Param0 = stat.Value, Param3 = stat.TextValue, Extra = extraStat }); } } }
private void _ProcessDamage(ISet <IItemStat> stats, List <TranslatedStat> result, List <string> damageTypes, TranslatedStatType location) { var candidates = stats.Where(m => damageTypes.Contains(m.Stat)); foreach (var minDmg in candidates) { var type = minDmg.Stat.Replace("offensive", "").Replace("Min", ""); var maxDmg = stats.FirstOrDefault(m => m.Stat.Equals(string.Format("offensive{0}Max", type))); var chance = stats.FirstOrDefault(m => m.Stat.Equals(string.Format("offensive{0}Chance", type))); var duration = stats.FirstOrDefault(m => m.Stat.Equals(string.Format("offensive{0}DurationMin", type))); var minDmgVal = minDmg.Value; StringBuilder sb = new StringBuilder(); if (chance != null) { sb.Append(_language.GetTag("customtag_damage_chanceof")); } if (maxDmg != null) { sb.Append(_language.GetTag("customtag_damage_123")); } else { if (type.Contains("Modifier")) { sb.Append(_language.GetTag("customtag_damage_13%")); } else { sb.Append(_language.GetTag("customtag_damage_13")); } } if (duration != null) { sb.Append(_language.GetTag("customtag_damage_delay")); minDmgVal *= duration.Value; } // TranslatedStat sm = new TranslatedStat { Text = sb.ToString(), Param0 = chance?.Value, Param1 = minDmgVal, Param2 = maxDmg?.Value, Param3 = DamageTypeTranslation(type), Param4 = duration?.Value, Type = location }; result.Add(sm); } }
public List <TranslatedStat> ProcessSkillModifierStats(ISet <IItemStat> stats, string skill, string classtag, float?tier) { List <TranslatedStat> result = new List <TranslatedStat>(); var weaponDamageEffect = stats.FirstOrDefault(m => m.Stat == "weaponDamagePct"); var offensivePhysicalResistanceReduction = stats.FirstOrDefault(m => m.Stat == "offensivePhysicalResistanceReductionAbsoluteMin"); var petLimit = stats.FirstOrDefault(m => m.Stat == "petLimit"); TranslatedStat tooltip = null; if (classtag != null && tier != null) { tooltip = new TranslatedStat { Text = _language.GetTag("augmentSkill1Extras"), Param0 = tier, Param3 = _language.GetTag(classtag) }; } if (weaponDamageEffect != null) { result.Add(new TranslatedStat { Param0 = weaponDamageEffect.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_weaponDamagePct"), Type = TranslatedStatType.FOOTER }); } if (offensivePhysicalResistanceReduction != null) { var offensivePhysicalResistanceReductionAbsoluteDurationMin = stats.FirstOrDefault(m => m.Stat == "offensivePhysicalResistanceReductionAbsoluteDurationMin"); if (offensivePhysicalResistanceReductionAbsoluteDurationMin != null) { result.Add(new TranslatedStat { Param0 = offensivePhysicalResistanceReduction.Value, Param1 = offensivePhysicalResistanceReductionAbsoluteDurationMin.Value, Param3 = skill, Extra = tooltip, Text = _language.GetTag("customtag_xpac_modif_physicalResistDuration"), Type = TranslatedStatType.FOOTER }); } else { result.Add(new TranslatedStat { Param0 = offensivePhysicalResistanceReduction.Value, Param3 = skill, Extra = tooltip, Text = _language.GetTag("customtag_xpac_modif_physicalResist"), Type = TranslatedStatType.FOOTER }); } } if (petLimit != null) { result.Add(new TranslatedStat { Param0 = petLimit.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_petLimit"), Type = TranslatedStatType.FOOTER }); } var conversionIn1 = stats.FirstOrDefault(m => m.Stat == "conversionInType"); var conversionOutType1 = stats.FirstOrDefault(m => m.Stat == "conversionOutType"); var conversionPercentage1 = stats.FirstOrDefault(m => m.Stat == "conversionPercentage"); AddConversionStat(result, skill, conversionIn1, conversionOutType1, conversionPercentage1); var conversionIn2 = stats.FirstOrDefault(m => m.Stat == "conversionInType2"); var conversionOutType2 = stats.FirstOrDefault(m => m.Stat == "conversionOutType2"); var conversionPercentage2 = stats.FirstOrDefault(m => m.Stat == "conversionPercentage2"); AddConversionStat(result, skill, conversionIn2, conversionOutType2, conversionPercentage2); // 12-85 Lightning Damage to Callidor's Tempest // "offensiveLightningMax" // "offensiveLightningMin" foreach (var damageType in BodyDamageTypes) { var min = stats.FirstOrDefault(m => m.Stat == $"offensive{damageType}Min"); var max = stats.FirstOrDefault(m => m.Stat == $"offensive{damageType}Max"); if (min != null) { if (max != null) { result.Add(new TranslatedStat { Param0 = min.Value, Param1 = max.Value, Param3 = skill, Param5 = DamageTypeTranslation(damageType), Text = _language.GetTag("customtag_xpac_modif_offensiveDamageMinMax"), Type = TranslatedStatType.FOOTER }); } else { result.Add(new TranslatedStat { Param0 = min.Value, Param3 = skill, Param5 = DamageTypeTranslation(damageType), Text = _language.GetTag("customtag_xpac_modif_offensiveDamageMin"), Type = TranslatedStatType.FOOTER }); } var offensiveXDurationModifier = stats.FirstOrDefault(m => m.Stat == $"offensive{damageType}DurationModifier"); var offensiveXModifier = stats.FirstOrDefault(m => m.Stat == $"offensive{damageType}Modifier"); if (offensiveXDurationModifier != null && offensiveXModifier != null) { result.Add(new TranslatedStat { Param0 = offensiveXDurationModifier.Value, Param1 = offensiveXModifier.Value, Param3 = skill, Param5 = DamageTypeTranslation(damageType), Text = _language.GetTag("offensiveXDurationModifier"), Type = TranslatedStatType.FOOTER }); } } var defensive = stats.FirstOrDefault(m => m.Stat == $"defensive{damageType}"); if (defensive != null) { result.Add(new TranslatedStat { Param0 = defensive.Value, Param3 = skill, Param5 = DamageTypeTranslation(damageType), Text = _language.GetTag("customtag_xpac_modif_defense"), Type = TranslatedStatType.FOOTER }); } } AddSimpleStat("characterTotalSpeedModifier", "customtag_xpac_modif_speedModifier", stats, skill, result); AddSimpleStat("characterDefensiveAbility", "customtag_xpac_modif_defensiveAbilityDebuff", stats, skill, result); AddSimpleStat("characterDefensiveAbilityModifier", "customtag_xpac_modif_defensiveAbilityBuff", stats, skill, result); AddSimpleStat("offensiveTauntMin", "customtag_xpac_modif_offensiveTaunt", stats, skill, result); AddSimpleStat("characterOffensiveAbilityModifier", "customtag_xpac_modif_offensiveAbilityBuff", stats, skill, result); AddSimpleStat("retaliationTotalDamageModifier", "customtag_xpac_modif_retaliationTotalDamageModifier", stats, skill, result); AddSimpleStat("characterAttackSpeedModifier", "customtag_xpac_modif_characterAttackSpeedModifier", stats, skill, result); // var projectileLaunchNumber = stats.FirstOrDefault(m => m.Stat == "projectileLaunchNumber"); if (projectileLaunchNumber != null) { if (projectileLaunchNumber.Value > 1) { result.Add(new TranslatedStat { Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_addProjectile1"), Type = TranslatedStatType.FOOTER }); } else { result.Add(new TranslatedStat { Param0 = projectileLaunchNumber.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_addProjectileX"), Type = TranslatedStatType.FOOTER }); } } AddSimpleStat("skillManaCostReduction", "customtag_xpac_modif_skillManaCostReduction", stats, skill, result); AddSimpleStat("skillTargetRadius", "customtag_xpac_modif_skillTargetRadius", stats, skill, result); var sparkChance = stats.FirstOrDefault(m => m.Stat == "sparkChance"); var sparkMaxNumber = stats.FirstOrDefault(m => m.Stat == "sparkMaxNumber"); if (sparkChance != null && sparkMaxNumber != null) { result.Add(new TranslatedStat { Param0 = sparkChance.Value, Param1 = sparkMaxNumber.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_sparkChance"), Type = TranslatedStatType.FOOTER }); } AddSimpleStat("skillCooldownTime", "customtag_xpac_modif_skillCooldownTime", stats, skill, result); AddSimpleStat("offensiveCritDamageModifier", "customtag_xpac_modif_offensiveCritDamageModifier", stats, skill, result); AddSimpleStat("skillActiveDuration", "customtag_xpac_modif_skillActiveDuration", stats, skill, result); var offensiveSlowDefensiveAbilityDurationMin = stats.FirstOrDefault(m => m.Stat == "offensiveSlowDefensiveAbilityDurationMin"); var offensiveSlowDefensiveAbilityMin = stats.FirstOrDefault(m => m.Stat == "offensiveSlowDefensiveAbilityMin"); if (offensiveSlowDefensiveAbilityDurationMin != null && offensiveSlowDefensiveAbilityMin != null) { result.Add(new TranslatedStat { Param0 = offensiveSlowDefensiveAbilityDurationMin.Value, Param1 = offensiveSlowDefensiveAbilityMin.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_defensiveAbilityDebuffForDuration"), Type = TranslatedStatType.FOOTER }); } AddSimpleStat("skillLifePercent", "customtag_xpac_modif_skillLifePercent", stats, skill, result); AddSimpleStat("skillTargetAngle", "customtag_xpac_modif_skillTargetAngle", stats, skill, result); AddSimpleStat("skillTargetNumber", "customtag_xpac_modif_skillTargetNumber", stats, skill, result); var skillCooldownReductionChance = stats.FirstOrDefault(m => m.Stat == "skillCooldownReductionChance"); var skillCooldownReduction = stats.FirstOrDefault(m => m.Stat == "skillCooldownReduction"); if (skillCooldownReduction != null && skillCooldownReductionChance != null) { result.Add(new TranslatedStat { Param0 = skillCooldownReductionChance.Value, Param1 = skillCooldownReduction.Value, Param3 = skill, // TODO: Possible to get skill stuff on this? Tooltip + color Text = _language.GetTag("customtag_xpac_modif_skillCooldownReductionChance"), Type = TranslatedStatType.FOOTER }); } var offensiveTotalDamageReductionPercentMin = stats.FirstOrDefault(m => m.Stat == "offensiveTotalDamageReductionPercentMin"); var offensiveTotalDamageReductionPercentDurationMin = stats.FirstOrDefault(m => m.Stat == "offensiveTotalDamageReductionPercentDurationMin"); if (offensiveTotalDamageReductionPercentMin != null && offensiveTotalDamageReductionPercentDurationMin != null) { result.Add(new TranslatedStat { Param0 = offensiveTotalDamageReductionPercentMin.Value, Param1 = offensiveTotalDamageReductionPercentDurationMin.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_offensiveTotalResistanceReductionAbsoluteMin"), Type = TranslatedStatType.FOOTER }); } var offensiveTotalResistanceReductionAbsoluteMin = stats.FirstOrDefault(m => m.Stat == "offensiveTotalResistanceReductionAbsoluteMin"); var offensiveTotalResistanceReductionAbsoluteDurationMin = stats.FirstOrDefault(m => m.Stat == "offensiveTotalResistanceReductionAbsoluteDurationMin"); if (offensiveTotalResistanceReductionAbsoluteMin != null && offensiveTotalResistanceReductionAbsoluteDurationMin != null) { result.Add(new TranslatedStat { Param0 = offensiveTotalResistanceReductionAbsoluteMin.Value, Param1 = offensiveTotalResistanceReductionAbsoluteDurationMin.Value, Param3 = skill, Text = _language.GetTag("customtag_xpac_modif_offensiveTotalDamageReductionPercentDurationMin"), Type = TranslatedStatType.FOOTER }); } AddSimpleStat("offensiveDamageMultModifier", "customtag_xpac_modif_offensiveDamageMultModifier", stats, skill, result); /* * if (stats.Count > 0 && result.Count == 0) * { * Logger.Warn("No stats parsed for modifiers"); * foreach (var stat in stats) * { * Logger.Debug($"{stat.Stat}: {stat.Value}, {stat.TextValue}"); * } * }*/ // Apply the same tooltip to all foreach (var entry in result) { if (entry.Extra == null) { entry.Extra = tooltip; } } return(result); }