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