Esempio n. 1
0
        Modifier GetModifier(SkillMapEntry entry, int value)
        {
            var modifier = (Modifier)Activator.CreateInstance(entry.ModifierType);

            if (modifier is AddModifier)
            {
                AddModifier addMod = (AddModifier)modifier;
                addMod.value          = entry.IsNegative ? -value : value;
                addMod.name           = (modifiersenum)Enum.Parse(typeof(modifiersenum), entry.to);
                addMod.nameSpecified  = true;
                addMod.valueSpecified = true;
            }
            else if (modifier is SubModifier)
            {
                SubModifier subMod = (SubModifier)modifier;
                subMod.value          = entry.IsNegative ? -value : value;
                subMod.name           = (modifiersenum)Enum.Parse(typeof(modifiersenum), entry.to);
                subMod.nameSpecified  = true;
                subMod.valueSpecified = true;
            }
            else if (modifier is RateModifier)
            {
                RateModifier rateMod = (RateModifier)modifier;
                rateMod.value          = entry.IsNegative ? -value : value;
                rateMod.name           = (modifiersenum)Enum.Parse(typeof(modifiersenum), entry.to);
                rateMod.nameSpecified  = true;
                rateMod.valueSpecified = true;
            }
            else if (modifier is SetModifier)
            {
                SetModifier setMod = (SetModifier)modifier;
                setMod.value          = entry.IsNegative ? -value : value;
                setMod.name           = (modifiersenum)Enum.Parse(typeof(modifiersenum), entry.to);
                setMod.nameSpecified  = true;
                setMod.valueSpecified = true;
            }
            return(modifier);
        }
Esempio n. 2
0
        public static void CreateSkillMap(string root)
        {
            Console.WriteLine("Creating mapping rules...");

            var      utility = Utility <Item> .Instance;
            SkillMap map     = new SkillMap();

            foreach (var our in Utility.OriginalItemTemplate.TemplateList)
            {
                var clientMatch = Utility.ItemIndex.ItemList.Where(i => i.id == our.id).FirstOrDefault();
                if (clientMatch == null || our.modifiers == null)
                {
                    continue;
                }

                List <string> bonusAttrs = new List <string>();
                utility.Export(clientMatch, "bonus_attr", bonusAttrs);

                int modifierCount = 0;
                if (clientMatch.min_damage > 0 || clientMatch.max_damage > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.min_damage > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.max_damage > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.hit_accuracy > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.magical_hit_accuracy > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.parry > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.critical > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.attack_delay > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.attack_range > 0)
                {
                    modifierCount++;
                }
                if (clientMatch.hit_count > 0)
                {
                    modifierCount++;
                }
                if (our.modifiers[0].modifierList.Count != modifierCount + bonusAttrs.Count)
                {
                    continue;
                }

                bool allMatched    = true;
                var  newMappings   = new Dictionary <string, SkillMapEntry>();
                var  bonuses       = our.modifiers[0].modifierList.Where(m => m.bonus).ToList();
                var  clientBonuses = from bonus in bonusAttrs
                                     let name                         = GetAttributeName(bonus)
                                                            let value = GetAttributeValue(bonus)
                                                                        select new { Name = name, Value = value };

                foreach (var clientBonus in clientBonuses)
                {
                    Type     type        = default(Type);
                    int      value       = 0;
                    Modifier ourModifier = null;
                    if (map.AllMappings.ContainsKey(clientBonus.Name))
                    {
                        ourModifier = bonuses.Where(b => b.name.ToString() == map.AllMappings[clientBonus.Name].to)
                                      .FirstOrDefault();
                        if (ourModifier == null)
                        {
                            continue;
                        }
                        if (ourModifier is AddModifier)
                        {
                            AddModifier addMod = (AddModifier)ourModifier;
                            value = addMod.value;
                            type  = typeof(AddModifier);
                        }
                        else if (ourModifier is SubModifier)
                        {
                            SubModifier subMod = (SubModifier)ourModifier;
                            value = subMod.value;
                            type  = typeof(SubModifier);
                        }
                        else if (ourModifier is RateModifier)
                        {
                            RateModifier rateMod = (RateModifier)ourModifier;
                            value = rateMod.value;
                            type  = typeof(RateModifier);
                        }
                        else if (ourModifier is SetModifier)
                        {
                            SetModifier setMod = (SetModifier)ourModifier;
                            value = setMod.value;
                            type  = typeof(SetModifier);
                        }
                        else
                        {
                            // not implemented
                            allMatched = false;
                            break;
                        }
                        if (Math.Abs(value) != Math.Abs(clientBonus.Value))
                        {
                            allMatched = false;
                            break;
                        }
                        bonuses.Remove(ourModifier);                         // exclude from search
                    }
                    else
                    {
                        foreach (Modifier mod in bonuses)
                        {
                            if (mod is AddModifier)
                            {
                                AddModifier addMod = (AddModifier)mod;
                                value = addMod.value;
                                type  = typeof(AddModifier);
                            }
                            else if (mod is SubModifier)
                            {
                                SubModifier subMod = (SubModifier)mod;
                                value = subMod.value;
                                type  = typeof(SubModifier);
                            }
                            else if (mod is RateModifier)
                            {
                                RateModifier rateMod = (RateModifier)mod;
                                value = rateMod.value;
                                type  = typeof(RateModifier);
                            }
                            else if (mod is SetModifier)
                            {
                                SetModifier setMod = (SetModifier)mod;
                                value = setMod.value;
                                type  = typeof(SetModifier);
                            }
                            else
                            {
                                // not implemented
                                allMatched = false;
                                break;
                            }
                            if (Math.Abs(value) == Math.Abs(clientBonus.Value))
                            {
                                ourModifier = mod;
                                break;
                            }
                        }
                        if (ourModifier == null)                           // not found the same value
                        {
                            allMatched = false;
                            break;
                        }
                        bonuses.Remove(ourModifier);
                        newMappings.Add(clientBonus.Name, new SkillMapEntry()
                        {
                            from         = clientBonus.Name,
                            to           = ourModifier.name.ToString(),
                            ModifierType = type,
                            IsNegative   = value != clientBonus.Value,
                        });
                    }
                }

                if (allMatched)
                {
                    foreach (var pair in newMappings)
                    {
                        map.AllMappings.Add(pair.Key, pair.Value);
                    }
                }
            }
            map.SaveToFile(root);
        }