コード例 #1
0
        /// <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
                    });
                }
            }
        }
コード例 #2
0
 /// <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
             });
         }
     }
 }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
        }