예제 #1
0
        private RequirementGroupViewModel FindBestMatch(RequirementGroupViewModel needle, IEnumerable <RequirementGroupViewModel> haystack)
        {
            RequirementGroupViewModel bestMatch = null;
            int bestMatchCount = 0;
            var requirementExs = RequirementEx.Combine(needle.Requirements.Select(r => r.Requirement));

            foreach (var potentialMatch in haystack)
            {
                // convert to requirement clauses and compare
                var compareRequirementExs = RequirementEx.Combine(potentialMatch.Requirements.Select(r => r.Requirement));
                int matchCount            = compareRequirementExs.Count;

                foreach (var requirementEx in requirementExs)
                {
                    for (int i = 0; i < compareRequirementExs.Count; i++)
                    {
                        if (compareRequirementExs[i] == requirementEx)
                        {
                            compareRequirementExs.RemoveAt(i);
                            break;
                        }
                    }
                }

                matchCount -= compareRequirementExs.Count;
                if (matchCount > bestMatchCount)
                {
                    bestMatchCount = matchCount;
                    bestMatch      = potentialMatch;
                }
            }

            return(bestMatch);
        }
예제 #2
0
        public bool RequirementsAreEqual(RequirementGroupViewModel that)
        {
            // quick check to make sure the same number of requirements exist
            if (Requirements.Count() != that.Requirements.Count())
            {
                return(false);
            }

            // convert to requirement clauses and compare
            var requirementExs        = RequirementEx.Combine(Requirements.Select(r => r.Requirement));
            var compareRequirementExs = RequirementEx.Combine(that.Requirements.Select(r => r.Requirement));

            if (requirementExs.Count != compareRequirementExs.Count)
            {
                return(false);
            }

            foreach (var requirementEx in requirementExs)
            {
                bool matched = false;
                for (int i = 0; i < compareRequirementExs.Count; i++)
                {
                    if (compareRequirementExs[i] == requirementEx)
                    {
                        compareRequirementExs.RemoveAt(i);
                        matched = true;
                        break;
                    }
                }

                if (!matched)
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #3
0
        private void DumpPublishedRequirements(StreamWriter stream, DumpAchievementItem dumpAchievement,
                                               RequirementGroupViewModel requirementGroupViewModel, NumberFormat numberFormat)
        {
            bool      needsAmpersand = false;
            const int MaxWidth       = 106; // 120 - "    trigger = ".Length
            int       width          = MaxWidth;

            var requirementEnumerator = requirementGroupViewModel.Requirements.GetEnumerator();

            while (requirementEnumerator.MoveNext())
            {
                if (String.IsNullOrEmpty(requirementEnumerator.Current.Definition))
                {
                    continue;
                }

                var  addSources  = new StringBuilder();
                var  subSources  = new StringBuilder();
                var  addHits     = new StringBuilder();
                bool isCombining = true;
                do
                {
                    switch (requirementEnumerator.Current.Requirement.Type)
                    {
                    case RequirementType.AddSource:
                        requirementEnumerator.Current.Requirement.Left.AppendString(addSources, numberFormat);
                        addSources.Append(" + ");
                        break;

                    case RequirementType.SubSource:
                        subSources.Append(" - ");
                        requirementEnumerator.Current.Requirement.Left.AppendString(subSources, numberFormat);
                        break;

                    case RequirementType.AddHits:
                        requirementEnumerator.Current.Requirement.AppendString(addHits, numberFormat);
                        addHits.Append(" || ");
                        break;

                    default:
                        isCombining = false;
                        break;
                    }

                    if (!isCombining)
                    {
                        break;
                    }

                    if (!requirementEnumerator.MoveNext())
                    {
                        return;
                    }
                } while (true);

                var definition = new StringBuilder();
                requirementEnumerator.Current.Requirement.AppendString(definition, numberFormat,
                                                                       addSources.Length > 0 ? addSources.ToString() : null,
                                                                       subSources.Length > 0 ? subSources.ToString() : null,
                                                                       addHits.Length > 0 ? addHits.ToString() : null);

                foreach (var memoryItem in dumpAchievement.MemoryAddresses.Where(m => !String.IsNullOrEmpty(m.FunctionName)))
                {
                    var memoryReference = Field.GetMemoryReference(memoryItem.Address, memoryItem.Size);
                    var functionCall    = memoryItem.FunctionName + "()";
                    definition.Replace(memoryReference, functionCall);
                }

                if (needsAmpersand)
                {
                    stream.Write(" && ");
                    width -= 4;
                }
                else
                {
                    needsAmpersand = true;
                }

                while (definition.Length > MaxWidth)
                {
                    var index = width;
                    while (index > 0 && definition[index] != ' ')
                    {
                        index--;
                    }

                    stream.Write(definition.ToString().Substring(0, index));
                    stream.WriteLine();
                    stream.Write("              ");
                    definition.Remove(0, index);
                    width = MaxWidth;
                }

                if (width - definition.Length < 0)
                {
                    stream.WriteLine();
                    stream.Write("              ");
                    width = MaxWidth;
                }

                width -= definition.Length;
                stream.Write(definition.ToString());
            }
        }