Ejemplo n.º 1
0
        private void ParseMod(List <Modifier> modifiers, ModifierPatternMetadata data, ModifierPattern pattern, string text)
        {
            var match = pattern.Pattern.Match(text);

            var modifier = new Modifier()
            {
                Index    = match.Index,
                Id       = data.Id,
                Text     = pattern.Text,
                Category = !data.Id.StartsWith("explicit") ? data.Category : null,
            };

            if (data.IsOption)
            {
                modifier.OptionValue = new ModifierOption()
                {
                    Value = pattern.Value,
                };
            }
            else if (pattern.Value.HasValue)
            {
                modifier.Values.Add(pattern.Value.Value);
                modifier.Text = ParseHashPattern.Replace(modifier.Text, match.Groups[1].Value, 1);
            }
            else if (match.Groups.Count > 1)
            {
                for (var index = 1; index < match.Groups.Count; index++)
                {
                    if (double.TryParse(match.Groups[index].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue))
                    {
                        if (pattern.Negative)
                        {
                            parsedValue *= -1;
                        }

                        modifier.Values.Add(parsedValue);
                        modifier.Text = ParseHashPattern.Replace(modifier.Text, match.Groups[index].Value, 1);
                    }
                }

                modifier.Text = modifier.Text.Replace("+-", "-");
            }

            modifiers.Add(modifier);
        }
Ejemplo n.º 2
0
        public bool IsMatch(string id, string text)
        {
            ModifierPatternMetadata metadata = null;

            metadata = PseudoPatterns.FirstOrDefault(x => x.Id == id);
            if (metadata == null)
            {
                metadata = ImplicitPatterns.FirstOrDefault(x => x.Id == id);
            }
            if (metadata == null)
            {
                metadata = ExplicitPatterns.FirstOrDefault(x => x.Id == id);
            }
            if (metadata == null)
            {
                metadata = CraftedPatterns.FirstOrDefault(x => x.Id == id);
            }
            if (metadata == null)
            {
                metadata = EnchantPatterns.FirstOrDefault(x => x.Id == id);
            }
            if (metadata == null)
            {
                metadata = FracturedPatterns.FirstOrDefault(x => x.Id == id);
            }


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

            foreach (var pattern in metadata.Patterns)
            {
                if (pattern.Pattern != null && pattern.Pattern.IsMatch(text))
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 3
0
        public async Task Initialize()
        {
            await statTranslationProvider.Initialize();

            var result = await cacheRepository.GetOrSet(
                "Sidekick.Infrastructure.PoeApi.Items.Modifiers.ModifierProvider.Initialize",
                () => poeTradeClient.Fetch <ApiCategory>("data/stats"));

            var categories = result.Result;

            PseudoPatterns    = new List <ModifierPatternMetadata>();
            ExplicitPatterns  = new List <ModifierPatternMetadata>();
            ImplicitPatterns  = new List <ModifierPatternMetadata>();
            EnchantPatterns   = new List <ModifierPatternMetadata>();
            CraftedPatterns   = new List <ModifierPatternMetadata>();
            VeiledPatterns    = new List <ModifierPatternMetadata>();
            FracturedPatterns = new List <ModifierPatternMetadata>();

            foreach (var category in categories)
            {
                if (!category.Entries.Any())
                {
                    continue;
                }

                // The notes in parentheses are never translated by the game.
                // We should be fine hardcoding them this way.
                List <ModifierPatternMetadata> patterns;
                var categoryLabel = category.Entries[0].Id.Split('.').First();
                switch (categoryLabel)
                {
                default: continue;

                case "pseudo": patterns = PseudoPatterns; break;

                case "delve":
                case "monster":
                case "explicit": patterns = ExplicitPatterns; break;

                case "implicit": patterns = ImplicitPatterns; break;

                case "enchant": patterns = EnchantPatterns; break;

                case "crafted": patterns = CraftedPatterns; break;

                case "veiled": patterns = VeiledPatterns; break;

                case "fractured": patterns = FracturedPatterns; break;
                }

                foreach (var entry in category.Entries)
                {
                    var modifier = new ModifierPatternMetadata()
                    {
                        Category = categoryLabel,
                        Id       = entry.Id,
                        IsOption = entry.Option?.Options?.Any() ?? false,
                    };

                    if (modifier.IsOption)
                    {
                        for (var i = 0; i < entry.Option.Options.Count; i++)
                        {
                            modifier.Patterns.Add(new ModifierPattern()
                            {
                                Text      = ComputeOptionText(entry.Text, entry.Option.Options[i].Text),
                                LineCount = NewLinePattern.Matches(entry.Text).Count + NewLinePattern.Matches(entry.Option.Options[i].Text).Count + 1,
                                Value     = i + 1,
                                Pattern   = ComputePattern(categoryLabel, entry.Text, entry.Option.Options[i].Text),
                            });
                        }
                    }
                    else
                    {
                        var stats = statTranslationProvider.GetAlternateModifiers(entry.Text);

                        if (stats != null)
                        {
                            foreach (var stat in stats)
                            {
                                modifier.Patterns.Add(new ModifierPattern()
                                {
                                    Text      = stat.Text,
                                    LineCount = NewLinePattern.Matches(stat.Text).Count + 1,
                                    Pattern   = ComputePattern(categoryLabel, stat.Text),
                                    Negative  = stat.Negative,
                                    Value     = stat.Value,
                                });
                            }
                        }
                        else
                        {
                            modifier.Patterns.Add(new ModifierPattern()
                            {
                                Text      = entry.Text,
                                LineCount = NewLinePattern.Matches(entry.Text).Count + 1,
                                Pattern   = ComputePattern(categoryLabel, entry.Text),
                            });
                        }
                    }

                    patterns.Add(modifier);
                }
            }
        }