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); }
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); }