Beispiel #1
0
        public void ExternalName()
        {
            // ID 50464 - Nourish
            var spellDescParser = new SpellDescParser("Receives triple bonus from $@spellname77495.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 50464, new FakeSupplier());

            Assert.AreEqual("Receives triple bonus from Mastery: Harmony.", sb.ToString());
        }
Beispiel #2
0
        public void EffectAmplitude()
        {
            // ID 322516 - Singe Mana
            var spellDescParser = new SpellDescParser("Hits an enemy with an anti-mana bolt. For each point of mana consumed by the bolt, the target takes $e1 damage.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 322516, new FakeSupplier());

            Assert.AreEqual("Hits an enemy with an anti-mana bolt. For each point of mana consumed by the bolt, the target takes 3 damage.", sb.ToString());
        }
Beispiel #3
0
        public void MaxTargets()
        {
            // ID 245235 - From the Void
            var spellDescParser = new SpellDescParser("Calls to the void, summoning $i Waning Voids.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 334809, new FakeSupplier());

            Assert.AreEqual("Calls to the void, summoning 3 Waning Voids.", sb.ToString());
        }
Beispiel #4
0
        public void ProcChance()
        {
            // ID 3424 - Tainted Howl
            var spellDescParser = new SpellDescParser("Gives nearby allies $h% chance to poison an enemy on hit.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 3424, new FakeSupplier());

            Assert.AreEqual("Gives nearby allies 35% chance to poison an enemy on hit.", sb.ToString());
        }
Beispiel #5
0
        public void MaxStacks()
        {
            // ID 149587 - Total Time
            var spellDescParser = new SpellDescParser("Bell Tollssss: $u1");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 149587, new FakeSupplier());

            Assert.AreEqual("Bell Tollssss: 9999", sb.ToString());
        }
Beispiel #6
0
        public void Radius()
        {
            // ID 22012 - Spirit Heal
            var spellDescParser = new SpellDescParser("Resurrects all friends within $a1 yards.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 22012, new FakeSupplier());

            Assert.AreEqual("Resurrects all friends within 20 yards.", sb.ToString());
        }
Beispiel #7
0
        public void AuraPeriod()
        {
            // ID 201867 - Call of the Void
            var spellDescParser = new SpellDescParser("Your soul is drawn into the void, dealing Shadow damage every $t1.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 201867, new FakeSupplier());

            Assert.AreEqual("Your soul is drawn into the void, dealing Shadow damage every 2.", sb.ToString()); // Yes, every 2.
        }
Beispiel #8
0
        public void Duration()
        {
            // ID 2871 - Nullify Disease
            var spellDescParser = new SpellDescParser("Target is immune to disease for $d and is cured of any existing diseases.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 2871, new FakeSupplier());

            Assert.AreEqual("Target is immune to disease for 30 sec and is cured of any existing diseases.", sb.ToString());
        }
Beispiel #9
0
        public void SpellEffectAndDuration()
        {
            // ID 871 - Shield Wall
            var spellDescParser = new SpellDescParser("Reduces all damage you take by $s1% for $d.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 871, new FakeSupplier());

            Assert.AreEqual("Reduces all damage you take by 40% for 8 sec.", sb.ToString());
        }
Beispiel #10
0
        public void MaxTargetLevel()
        {
            // ID 334809 - Spiritual Knowledge
            var spellDescParser = new SpellDescParser("Experience gained from killing monsters and completing quests in the Shadowlands increased by $s1%. Lasts $d. Does not function above level $V.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 334809, new FakeSupplier());

            Assert.AreEqual("Experience gained from killing monsters and completing quests in the Shadowlands increased by 5%. Lasts 1 hour. Does not function above level 60.", sb.ToString());
        }
Beispiel #11
0
        public void Range()
        {
            // ID 340484 - Allaying
            var spellDescParser = new SpellDescParser("Puts fallen anima-starved creatures to rest within $r yds.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 340484, new FakeSupplier());

            Assert.AreEqual("Puts fallen anima-starved creatures to rest within 20 yds.", sb.ToString());
        }
Beispiel #12
0
        public void ChainTargets()
        {
            // ID 245131 - Chain Lightning
            var spellDescParser = new SpellDescParser("Strikes an enemy with a lightning bolt that arcs to another nearby enemy. The spell affects up to $x1 targets.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 245131, new FakeSupplier());

            Assert.AreEqual("Strikes an enemy with a lightning bolt that arcs to another nearby enemy. The spell affects up to 3 targets.", sb.ToString());
        }
Beispiel #13
0
        public void ProcChargesAndNewLine()
        {
            // ID 35399 - Spell Reflection
            var spellDescParser = new SpellDescParser("Magical spells will be reflected.\n $n charges.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 35399, new FakeSupplier());

            Assert.AreEqual("Magical spells will be reflected.\n 4 charges.", sb.ToString());
        }
Beispiel #14
0
        public void EffectTest()
        {
            // ID 11 - Frostbolt of Ages
            var spellDescParser = new SpellDescParser("Deals $s1 Frost damage to the target.");

            spellDescParser.Parse();

            var sb = new StringBuilder();

            spellDescParser.root.Format(sb, 11, new FakeSupplier());

            Assert.AreEqual("Deals 649 Frost damage to the target.", sb.ToString());
        }
Beispiel #15
0
        public async Task <IActionResult> GetSpellTooltip(int spellID, string build)
        {
            var result = new TTSpell();

            result.SpellID = spellID;

            var spellNameDB = await dbcManager.GetOrLoad("SpellName", build);

            if (spellNameDB.TryGetValue(spellID, out DBCDRow spellNameRow))
            {
                var spellName = (string)spellNameRow["Name_lang"];
                if (!string.IsNullOrWhiteSpace(spellName))
                {
                    result.Name = spellName;
                }
            }

            var spellDB = await dbcManager.GetOrLoad("Spell", build);

            if (spellDB.TryGetValue(spellID, out var spellRow))
            {
                var dataSupplier = new SpellDataSupplier(dbcManager, build);

                if ((string)spellRow["Description_lang"] != string.Empty)
                {
                    var spellDescParser = new SpellDescParser((string)spellRow["Description_lang"]);
                    spellDescParser.Parse();

                    var sb = new StringBuilder();
                    spellDescParser.root.Format(sb, spellID, dataSupplier);

                    result.Description = sb.ToString();
                }
            }

            var spellMiscRow = dbcManager.FindRecords("spellMisc", build, "SpellID", spellID, true).Result;

            if (spellMiscRow.Count == 0)
            {
                result.IconFileDataID = 134400;
            }
            else
            {
                result.IconFileDataID = (int)spellMiscRow[0]["SpellIconFileDataID"];
            }

            return(Ok(result));
        }
Beispiel #16
0
        public void JustDontCrash()
        {
            if (!File.Exists(Path.Combine(Directory.GetCurrentDirectory(), "SpellDescs.txt")))
            {
                Assert.Inconclusive("Unable to find SpellDescs.txt");
                return;
            }

            foreach (var line in File.ReadAllLines("SpellDescs.txt"))
            {
                var parser = new SpellDescParser(line);
                //Console.WriteLine("--------");
                parser.Parse();
                //Console.WriteLine(parser.root.ToString());
            }
        }
Beispiel #17
0
        public void SimpleDescription()
        {
            var spellDescParser = new SpellDescParser("Hello this is a test string with a $d variable ${test} in the middle of it.");

            spellDescParser.Parse();
            var expectedOutput = new Root(new List <INode>()
            {
                new PlainText("Hello this is a test string with a "),
                new Property(PropertyType.Duration, null, null),
                new PlainText(" variable "),
                new Expression("test"),
                new PlainText(" in the middle of it.")
            });

            Assert.AreEqual(expectedOutput, spellDescParser.root);
        }
Beispiel #18
0
        public void ExternalDescription()
        {
            var spellDescParser = new SpellDescParser("Conjures a Mana Gem that can be used to instantly restore $5405s1% mana, and holds up to $s2 charges. $@spellname118812 $@spelldesc118812");

            spellDescParser.Parse();
            var expectedOutput = new Root(new List <INode>()
            {
                new PlainText("Conjures a Mana Gem that can be used to instantly restore "),
                new Property(PropertyType.Effect, 1, 5405),
                new PlainText("% mana, and holds up to "),
                new Property(PropertyType.Effect, 2, null),
                new PlainText(" charges. "),
                new Property(PropertyType.SpellName, null, 118812),
                new PlainText(" "),
                new Property(PropertyType.SpellDescription, null, 118812)
            });

            Assert.AreEqual(expectedOutput, spellDescParser.root);
        }
        public async Task <IActionResult> GetSpellTooltip(int spellID, string build, byte level = 60, sbyte difficulty = -1, short mapID = -1, uint itemID = 0)
        {
            // If difficulty is -1 fall back to Normal

            var result = new TTSpell();

            result.SpellID = spellID;

            using (var query = new SQLiteCommand("SELECT Name_lang FROM SpellName WHERE ID = :id"))
            {
                query.Connection = db;
                query.Parameters.AddWithValue(":id", spellID);
                await query.ExecuteNonQueryAsync();

                var reader = await query.ExecuteReaderAsync();

                if (!reader.HasRows)
                {
                    return(NotFound());
                }

                while (reader.Read())
                {
                    result.Name = reader.GetString(0);
                }
            }

            using (var query = new SQLiteCommand("SELECT * FROM Spell WHERE ID = :id"))
            {
                query.Connection = db;
                query.Parameters.AddWithValue(":id", spellID);
                await query.ExecuteNonQueryAsync();

                var reader = await query.ExecuteReaderAsync();

                if (!reader.HasRows)
                {
                    return(NotFound());
                }

                while (reader.Read())
                {
                    var dataSupplier = new SpellDataSupplier(build, level, difficulty, mapID, itemID);

                    var nameSubtext = reader.GetString(reader.GetOrdinal("NameSubtext_lang"));
                    var descLang    = reader.GetString(reader.GetOrdinal("Description_lang"));

                    if (descLang != string.Empty)
                    {
                        var spellDescParser = new SpellDescParser(descLang);
                        spellDescParser.Parse();

                        var sb = new StringBuilder();
                        spellDescParser.root.Format(sb, spellID, dataSupplier);

                        result.Description = sb.ToString();

                        // Check for PropertyType.SpellDescription nodes and feed those into separate parsers (make sure to add a recursion limit :) )
                        foreach (var node in spellDescParser.root.nodes)
                        {
                            if (node is Property property && property.propertyType == PropertyType.SpellDescription && property.overrideSpellID != null)
                            {
                                using (var subQuery = new SQLiteCommand("SELECT * FROM Spell WHERE ID = :id"))
                                {
                                    subQuery.Connection = db;
                                    subQuery.Parameters.AddWithValue(":id", property.overrideSpellID);
                                    await subQuery.ExecuteNonQueryAsync();

                                    var subReader = await subQuery.ExecuteReaderAsync();

                                    if (subReader.HasRows)
                                    {
                                        while (subReader.Read())
                                        {
                                            var externalSpellDescParser = new SpellDescParser(subReader.GetString(subReader.GetOrdinal("Description_lang")));
                                            externalSpellDescParser.Parse();

                                            var externalSB = new StringBuilder();
                                            externalSpellDescParser.root.Format(externalSB, (int)property.overrideSpellID, dataSupplier);

                                            result.Description = result.Description.Replace("$@spelldesc" + property.overrideSpellID, externalSB.ToString());
                                        }
                                    }
                                    else
                                    {
                                        result.Description = "ERROR: Spell description for override spell " + property.overrideSpellID + " was not found!";
                                    }
                                }
                            }
                        }


                        if (nameSubtext != string.Empty)
                        {
                            result.SubText = nameSubtext;
                        }
                    }
                }
            }

            using (var query = new SQLiteCommand("SELECT SpellIconFileDataID FROM SpellMisc WHERE SpellID = :id"))
            {
                query.Connection = db;
                query.Parameters.AddWithValue(":id", spellID);
                await query.ExecuteNonQueryAsync();

                var reader = await query.ExecuteReaderAsync();

                if (!reader.HasRows)
                {
                    result.IconFileDataID = 134400;
                }

                while (reader.Read())
                {
                    result.IconFileDataID = reader.GetInt32(0);
                }
            }

            return(Ok(result));
        }
Beispiel #20
0
        public async Task <IActionResult> GetSpellTooltip(int spellID, string build, byte level = 60, sbyte difficulty = -1, short mapID = -1)
        {
            // If difficulty is -1 fall back to Normal

            var result = new TTSpell();

            result.SpellID = spellID;

            var spellNameDB = await dbcManager.GetOrLoad("SpellName", build);

            if (spellNameDB.TryGetValue(spellID, out DBCDRow spellNameRow))
            {
                var spellName = (string)spellNameRow["Name_lang"];
                if (!string.IsNullOrWhiteSpace(spellName))
                {
                    result.Name = spellName;
                }
            }

            var spellDB = await dbcManager.GetOrLoad("Spell", build);

            if (spellDB.TryGetValue(spellID, out var spellRow))
            {
                var dataSupplier = new SpellDataSupplier(dbcManager, build, level, difficulty, mapID);

                if ((string)spellRow["Description_lang"] != string.Empty)
                {
                    var spellDescParser = new SpellDescParser((string)spellRow["Description_lang"]);
                    spellDescParser.Parse();

                    var sb = new StringBuilder();
                    spellDescParser.root.Format(sb, spellID, dataSupplier);

                    result.Description = sb.ToString();

                    // Check for PropertyType.SpellDescription nodes and feed those into separate parsers (make sure to add a recursion limit :) )
                    foreach (var node in spellDescParser.root.nodes)
                    {
                        if (node is Property property && property.propertyType == PropertyType.SpellDescription && property.overrideSpellID != null)
                        {
                            if (spellDB.TryGetValue((int)property.overrideSpellID, out var externalSpellRow))
                            {
                                var externalSpellDescParser = new SpellDescParser((string)externalSpellRow["Description_lang"]);
                                externalSpellDescParser.Parse();

                                var externalSB = new StringBuilder();
                                externalSpellDescParser.root.Format(externalSB, (int)property.overrideSpellID, dataSupplier);

                                result.Description = result.Description.Replace("$@spelldesc" + property.overrideSpellID, externalSB.ToString());
                            }
                        }
                    }
                }

                if ((string)spellRow["NameSubtext_lang"] != string.Empty)
                {
                    result.SubText = (string)spellRow["NameSubtext_lang"];
                }
            }

            var spellMiscRow = dbcManager.FindRecords("spellMisc", build, "SpellID", spellID, true).Result;

            if (spellMiscRow.Count == 0)
            {
                result.IconFileDataID = 134400;
            }
            else
            {
                result.IconFileDataID = (int)spellMiscRow[0]["SpellIconFileDataID"];
            }

            return(Ok(result));
        }