Example #1
0
        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.");
            }
        }
Example #2
0
 public void PassiveHover(PassiveInfo passive)
 {
     ui.PassiveHover(passive.passive);
 }