Beispiel #1
0
        /// <summary>
        /// Compares a node's research, unlocks and tech-level to the current filter. Updates the node of it's match status.
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public FilterMatchType NodeIsMatch(Node node)
        {
            if (!FilterDirty)
            {
                return(FilterMatchType.NONE);
            }

            string          phrase  = _filterPhrase.Trim();
            FilterMatchType ret     = FilterMatchType.NONE;
            string          retDesc = StringExtensions.TitleCase(node.Research.LabelCap); // default

            if (phrase != "")
            {
                foreach (FilterMatchType tryMatch in Enum.GetValues(typeof(FilterMatchType)))
                {
                    //Log.Message("trying match for " + tryMatch.ToString());
                    switch (tryMatch)
                    {
                    case FilterMatchType.RESEARCH:
                        if (node.Research.label.Contains(phrase, StringComparison.InvariantCultureIgnoreCase))
                        {
                            ret = FilterMatchType.RESEARCH;
                        }
                        break;

                    case FilterMatchType.UNLOCK:
                    {
                        List <string> unlockDescs = node.Research.GetUnlockDefsAndDescs()
                                                    .Where(unlock => unlock.First.label.Contains(phrase, StringComparison.InvariantCulture))
                                                    .Select(unlock => unlock.First.label).ToList();
                        if (unlockDescs.Count > 0)
                        {
                            retDesc = string.Format("{0} ({1})", retDesc, StringExtensions.TitleCase(string.Join(", ", unlockDescs.ToArray())));
                            ret     = FilterMatchType.UNLOCK;
                        }
                    }
                    break;

                    case FilterMatchType.TECH_LEVEL:
                    {
                        if (node.Research.techLevel.ToStringHuman().Contains(phrase, StringComparison.InvariantCultureIgnoreCase))
                        {
                            ret = FilterMatchType.TECH_LEVEL;
                        }
                    }
                    break;

                    default:
                        ret = FilterMatchType.NO_MATCH;
                        break;
                    }
                    if (ret != FilterMatchType.NONE)
                    {
                        break;
                    }
                }
            }
            else
            {
                ret = FilterMatchType.NONE;
            }

            // save the result for display later
            if (ret.IsValidMatch())
            {
                if (!_matchResults.ContainsKey(ret))
                {
                    _matchResults.Add(ret, new List <string>());
                }
                _matchResults[ret].Add(retDesc);
            }

            // update the node of the result
            node.FilterMatch = ret;

            return(ret);
        }