Пример #1
0
        // Indexes attributes.
        internal void Index()
        {
            LevelIndex.Clear();
            QualityIndex.Clear();

            if (Attributes == null)
            {
                return;
            }

            foreach (GemAttribute attr in Attributes)
            {
                LookupTable  levelTable    = new LookupTable();
                LookupTable  qualityTable  = new LookupTable();
                LookupRanges levelRanges   = new LookupRanges();
                LookupRanges qualityRanges = new LookupRanges();
                LookupGain   levelGain     = null;
                LookupGain   qualityGain   = null;
                LookupFixed  fixedValue    = null;

                foreach (Value value in attr.Values)
                {
                    // Ignore values which doesn't have required cardinality of attribute.
                    if (value.Cardinality != attr.Cardinality)
                    {
                        continue;
                    }

                    if (value is ValueAt)
                    {
                        ValueAt valueAt = (ValueAt)value;
                        if (valueAt.LevelSpecified)
                        {
                            levelTable.Add(valueAt.Level, valueAt.ToValue());
                        }
                        else if (valueAt.QualitySpecified)
                        {
                            qualityTable.Add(valueAt.Quality, valueAt.ToValue());
                        }
                        else
                        {
                            fixedValue = new LookupFixed {
                                Value = valueAt.ToValue()
                            }
                        };
                    }
                    else if (value is ValueForLevelRange)
                    {
                        ValueForLevelRange range = (ValueForLevelRange)value;
                        levelRanges.Add(range.From, range.To, range.ToValue());
                    }
                    else if (value is ValueForQualityRange)
                    {
                        ValueForQualityRange range = (ValueForQualityRange)value;
                        qualityRanges.Add(range.From, range.To, range.ToValue());
                    }
                    else if (value is ValuePerLevel)
                    {
                        levelGain = new LookupGain {
                            From = 2, Value = ((ValuePerLevel)value).ToValue()
                        };
                    }
                    else // value is ValuePerQuality
                    {
                        qualityGain = new LookupGain {
                            Value = ((ValuePerQuality)value).ToValue()
                        };
                    }
                }

                // Add level dependant attribute to index.
                // LookupFixed is added to LevelIndex only (due to quality-based attributes not being defined for non-quality gems).
                LookupBase.Method method = LookupBase.Method.None;
                if (!levelTable.IsEmpty())
                {
                    method |= LookupBase.Method.Table;
                }
                if (!levelRanges.IsEmpty())
                {
                    method |= LookupBase.Method.Range;
                }
                if (levelGain != null)
                {
                    method |= LookupBase.Method.Gain;
                }
                if (fixedValue != null)
                {
                    method |= LookupBase.Method.Fixed;
                }
                if (method != LookupBase.Method.None && method != LookupBase.Method.Table && method != LookupBase.Method.Range && method != LookupBase.Method.Gain &&
                    method != LookupBase.Method.Fixed)
                {
                    LevelIndex.Add(attr.Name, new LookupMixed
                    {
                        Table  = method.HasFlag(LookupBase.Method.Table) ? levelTable : null,
                        Ranges = method.HasFlag(LookupBase.Method.Range) ? levelRanges : null,
                        Gain   = method.HasFlag(LookupBase.Method.Gain) ? levelGain : null,
                        Fixed  = method.HasFlag(LookupBase.Method.Fixed) ? fixedValue : null
                    });
                }
                else if (method.HasFlag(LookupBase.Method.Table))
                {
                    LevelIndex.Add(attr.Name, levelTable);
                }
                else if (method.HasFlag(LookupBase.Method.Range))
                {
                    LevelIndex.Add(attr.Name, levelRanges);
                }
                else if (method.HasFlag(LookupBase.Method.Gain))
                {
                    LevelIndex.Add(attr.Name, levelGain);
                }
                else if (method.HasFlag(LookupBase.Method.Fixed))
                {
                    LevelIndex.Add(attr.Name, fixedValue);
                }

                // Add quality dependant attribute to index.
                method = LookupBase.Method.None;
                if (!qualityTable.IsEmpty())
                {
                    method |= LookupBase.Method.Table;
                }
                if (!qualityRanges.IsEmpty())
                {
                    method |= LookupBase.Method.Range;
                }
                if (qualityGain != null)
                {
                    method |= LookupBase.Method.Gain;
                }
                if (method != LookupBase.Method.None && method != LookupBase.Method.Table && method != LookupBase.Method.Range && method != LookupBase.Method.Gain)
                {
                    QualityIndex.Add(attr.Name, new LookupMixed
                    {
                        Table  = method.HasFlag(LookupBase.Method.Table) ? qualityTable : null,
                        Ranges = method.HasFlag(LookupBase.Method.Range) ? qualityRanges : null,
                        Gain   = method.HasFlag(LookupBase.Method.Gain) ? qualityGain : null
                    });
                }
                else if (method.HasFlag(LookupBase.Method.Table))
                {
                    QualityIndex.Add(attr.Name, qualityTable);
                }
                else if (method.HasFlag(LookupBase.Method.Range))
                {
                    QualityIndex.Add(attr.Name, qualityRanges);
                }
                else if (method.HasFlag(LookupBase.Method.Gain))
                {
                    QualityIndex.Add(attr.Name, qualityGain);
                }
            }
        }