private static void CreateDamages(IDictionary<string, JToken> damages) { var generator = new DamageGenerator(); foreach (var hero in GameObjects.Heroes) { JToken championToken; if (damages.TryGetValue(hero.ChampionName, out championToken)) { if (generator.IsClassTaken(hero.ChampionName)) { continue; } var @class = generator.AddClass(hero.ChampionName); var championTokenCollection = (IDictionary<string, JToken>)championToken; JToken varToken; if (championTokenCollection.TryGetValue("Vars", out varToken)) { var varTokenCollection = (IDictionary<string, JToken>)varToken; foreach (var item in varTokenCollection) { switch (item.Value.Type) { case JTokenType.Array: var itemArray = (JArray)item.Value; if (itemArray.Count > 0) { if (Regex.IsMatch((string)(itemArray[0]), @"[0-9]*\.[0-9]*")) { if (((string)(itemArray[0])).Length <= 9) { // float @class.AddField( item.Key, itemArray.Select(colItem => (float)colItem).ToArray()); } else { // double @class.AddField( item.Key, itemArray.Select(colItem => (double)colItem).ToArray()); } } else if (Regex.IsMatch((string)(itemArray[0]), @"^[0-9]*$")) { // integer @class.AddField( item.Key, itemArray.Select(colItem => (int)colItem).ToArray()); } } break; case JTokenType.Float: @class.AddField(item.Key, (float)item.Value); break; case JTokenType.Integer: @class.AddField(item.Key, (int)item.Value); break; case JTokenType.String: @class.AddField(item.Key, (string)item.Value); break; } } } JToken passiveToken; if (championTokenCollection.TryGetValue("Passives", out passiveToken)) { var passiveTokenCollection = (IDictionary<string, JToken>)passiveToken; foreach (var passiveInfo in passiveTokenCollection) { var syslink = generator.AddPassiveLink(hero.ChampionName, passiveInfo.Key); var inlineFunction = "return 0d;"; if (passiveInfo.Value.Type == JTokenType.Array && ((JArray)passiveInfo.Value).HasValues) { inlineFunction = ((JArray)passiveInfo.Value).Aggregate( string.Empty, (current, item) => current + item); } else { Logging.Write()( LogLevel.Fatal, $"Invalid configuration {hero.ChampionName}->PASSIVE->{passiveInfo.Key}."); } @class.AddFunction( $"public static double {syslink.Function}(Obj_AI_Base source)", inlineFunction); } } foreach (var entry in championTokenCollection) { SpellSlot spellSlot; if (Enum.TryParse(entry.Key, out spellSlot)) { var spellToken = (IDictionary<string, JToken>)entry.Value; int stages; if (spellToken.ContainsKey("Stages") && int.TryParse(spellToken["Stages"].ToString(), out stages)) { for (var i = 0; i < stages; ++i) { JToken stageToken; if (spellToken.TryGetValue("Stage" + i, out stageToken)) { var syslink = generator.AddLink(hero.ChampionName, spellSlot, i); var inlineFunction = "return 0d;"; if (stageToken.Type == JTokenType.Array && ((JArray)stageToken).HasValues) { inlineFunction = ((JArray)stageToken).Aggregate( string.Empty, (current, item) => current + (string)item); } else { Logging.Write()( LogLevel.Fatal, $"Invalid configuration {hero.ChampionName}->{spellSlot}->{i}."); } @class.AddFunction( $"public static double {syslink.Function}(Obj_AI_Base source, Obj_AI_Base target)", inlineFunction); } else { Logging.Write()( LogLevel.Fatal, $"Missing configuration {hero.ChampionName}->{spellSlot}->{i}."); } } } else { Logging.Write()( LogLevel.Fatal, $"Invalid configuration {hero.ChampionName}->{spellSlot} at 'Stages'."); } } } } else { Logging.Write()(LogLevel.Fatal, "No entry for champion {0} in damage file.", hero.ChampionName); } } var assembly = generator.Compile(); if (assembly != null) { var links = generator.GetLinks(assembly); foreach (var link in links) { DamageInfo damageInfo; if (!DamagesDictionary.TryGetValue(link.Key, out damageInfo)) { damageInfo = new DamageInfo(link.Key); DamagesDictionary.Add(link.Key, damageInfo); } foreach (var spellSlot in link.Value) { foreach (var stage in spellSlot.Value) { damageInfo.AddSpell(spellSlot.Key, stage.Key, stage.Value); } } } var passiveLinks = generator.GetPassiveLinks(assembly); foreach (var link in passiveLinks) { PassiveInfo passiveInfo; if (!PassiveDictionary.TryGetValue(link.Key, out passiveInfo)) { passiveInfo = new PassiveInfo(link.Key); PassiveDictionary.Add(link.Key, passiveInfo); } foreach (var passive in link.Value) { passiveInfo.AddPassive(passive.Key, passive.Value); } } } else { Logging.Write()(LogLevel.Fatal, "Unable to compile damage class."); } }
public void PassiveHover(PassiveInfo passive) { ui.PassiveHover(passive.passive); }