diff --git a/MikScrollingBattleText/Fonts/BlackCastleMF.ttf b/MikScrollingBattleText/Fonts/BlackCastleMF.ttf new file mode 100644 index 0000000..b3489ef Binary files /dev/null and b/MikScrollingBattleText/Fonts/BlackCastleMF.ttf differ diff --git a/MikScrollingBattleText/Fonts/FuturaBold.ttf b/MikScrollingBattleText/Fonts/FuturaBold.ttf new file mode 100644 index 0000000..576fc07 Binary files /dev/null and b/MikScrollingBattleText/Fonts/FuturaBold.ttf differ diff --git a/MikScrollingBattleText/Fonts/exocet.ttf b/MikScrollingBattleText/Fonts/exocet.ttf new file mode 100644 index 0000000..dcd7a49 Binary files /dev/null and b/MikScrollingBattleText/Fonts/exocet.ttf differ diff --git a/MikScrollingBattleText/Fonts/mailrays.TTF b/MikScrollingBattleText/Fonts/mailrays.TTF new file mode 100644 index 0000000..9403154 Binary files /dev/null and b/MikScrollingBattleText/Fonts/mailrays.TTF differ diff --git a/MikScrollingBattleText/Fonts/pepsi.ttf b/MikScrollingBattleText/Fonts/pepsi.ttf new file mode 100644 index 0000000..e30291b Binary files /dev/null and b/MikScrollingBattleText/Fonts/pepsi.ttf differ diff --git a/MikScrollingBattleText/Libs/AceLibrary/AceLibrary.lua b/MikScrollingBattleText/Libs/AceLibrary/AceLibrary.lua new file mode 100644 index 0000000..ede12fd --- /dev/null +++ b/MikScrollingBattleText/Libs/AceLibrary/AceLibrary.lua @@ -0,0 +1,711 @@ +--[[ +Name: AceLibrary +Revision: $Rev: 11109 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Iriel (iriel@vigilance-committee.org) + Tekkub (tekkub@gmail.com) + Revision: $Rev: 11109 $ +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceLibrary +SVN: http://svn.wowace.com/root/trunk/Ace2/AceLibrary +Description: Versioning library to handle other library instances, upgrading, + and proper access. + It also provides a base for libraries to work off of, providing + proper error tools. It is handy because all the errors occur in the + file that called it, not in the library file itself. +Dependencies: None +]] + +local ACELIBRARY_MAJOR = "AceLibrary" +local ACELIBRARY_MINOR = "$Revision: 11109 $" + +-- CHANGE DEBUG TO ``false`` ON RELEASE ------------------- +local DEBUG = true +-- CHANGE DEBUG TO ``false`` ON RELEASE ------------------- + +local _G = getfenv(0) +local previous = _G[ACELIBRARY_MAJOR] +if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end + +-- @table AceLibrary +-- @brief System to handle all versioning of libraries. +local AceLibrary = {} +local AceLibrary_mt = {} +setmetatable(AceLibrary, AceLibrary_mt) + +local tmp +local function error(self, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + if type(self) ~= "table" then + _G.error(string.format("Bad argument #1 to `error' (table expected, got %s)", type(self)), 2) + end + if not tmp then + tmp = {} + else + for k in pairs(tmp) do tmp[k] = nil end + table.setn(tmp, 0) + end + + tmp.n = 0 + table.insert(tmp, a1) + table.insert(tmp, a2) + table.insert(tmp, a3) + table.insert(tmp, a4) + table.insert(tmp, a5) + table.insert(tmp, a6) + table.insert(tmp, a7) + table.insert(tmp, a8) + table.insert(tmp, a9) + table.insert(tmp, a10) + table.insert(tmp, a11) + table.insert(tmp, a12) + table.insert(tmp, a13) + table.insert(tmp, a14) + table.insert(tmp, a15) + table.insert(tmp, a16) + table.insert(tmp, a17) + table.insert(tmp, a18) + table.insert(tmp, a19) + table.insert(tmp, a20) + + local stack = debugstack() + if not message then + local _,_,second = string.find(stack, "\n(.-)\n") + message = "error raised! " .. second + else + for i = 1,table.getn(tmp) do + tmp[i] = tostring(tmp[i]) + end + for i = 1,10 do + table.insert(tmp, "nil") + end + message = string.format(message, unpack(tmp)) + end + + if getmetatable(self) and getmetatable(self).__tostring then + message = string.format("%s: %s", tostring(self), message) + elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then + message = string.format("%s: %s", self:GetLibraryVersion(), message) + elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then + message = string.format("%s: %s", self.class:GetLibraryVersion(), message) + end + + local first = string.gsub(stack, "\n.*", "") + local file = string.gsub(first, ".*\\(.*).lua:%d+: .*", "%1") + file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") + + local i = 0 + for s in string.gfind(stack, "\n([^\n]*)") do + i = i + 1 + if not string.find(s, file .. "%.lua:%d+:") then + file = string.gsub(s, "^.*\\(.*).lua:%d+: .*", "%1") + file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") + break + end + end + local j = 0 + for s in string.gfind(stack, "\n([^\n]*)") do + j = j + 1 + if j > i and not string.find(s, file .. "%.lua:%d+:") then + _G.error(message, j + 1) + return + end + end + _G.error(message, 2) + return +end + +local function assert(self, condition, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + if not condition then + if not message then + local stack = debugstack() + local _,_,second = string.find(stack, "\n(.-)\n") + message = "assertion failed! " .. second + end + error(self, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + return + end + return condition +end + +local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5) + if type(num) ~= "number" then + error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num)) + elseif type(kind) ~= "string" then + error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind)) + end + local errored = false + arg = type(arg) + if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then + local _,_,func = string.find(debugstack(), "`argCheck'.-([`<].-['>])") + if not func then + _,_,func = string.find(debugstack(), "([`<].-['>])") + end + if kind5 then + error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg) + elseif kind4 then + error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg) + elseif kind3 then + error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg) + elseif kind2 then + error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg) + else + error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg) + end + end +end + +local function pcall(self, func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 = _G.pcall(func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + if not a1 then + error(self, string.gsub(a2, ".-%.lua:%d-: ", "")) + else + return a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 + end +end + +local recurse = {} +local function addToPositions(t, major) + if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then + rawset(t, recurse, true) + AceLibrary.positions[t] = major + for k,v in pairs(t) do + if type(v) == "table" and not rawget(v, recurse) then + addToPositions(v, major) + end + if type(k) == "table" and not rawget(k, recurse) then + addToPositions(k, major) + end + end + local mt = getmetatable(t) + if mt and not rawget(mt, recurse) then + addToPositions(mt, major) + end + rawset(t, recurse, nil) + end +end + +local function svnRevisionToNumber(text) + if type(text) == "string" then + if string.find(text, "^%$Revision: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$Revision: (%d+) %$$", "%1"))) + elseif string.find(text, "^%$Rev: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$Rev: (%d+) %$$", "%1"))) + elseif string.find(text, "^%$LastChangedRevision: (%d+) %$$") then + return tonumber((string.gsub(text, "^%$LastChangedRevision: (%d+) %$$", "%1"))) + end + elseif type(text) == "number" then + return text + end + return nil +end + +local crawlReplace +do + local recurse = {} + local function func(t, to, from) + if recurse[t] then + return + end + recurse[t] = true + local mt = getmetatable(t) + setmetatable(t, nil) + rawset(t, to, rawget(t, from)) + rawset(t, from, nil) + for k,v in pairs(t) do + if v == from then + t[k] = to + elseif type(v) == "table" then + if not recurse[v] then + func(v, to, from) + end + end + + if type(k) == "table" then + if not recurse[k] then + func(k, to, from) + end + end + end + setmetatable(t, mt) + if mt then + if mt == from then + setmetatable(t, to) + elseif not recurse[mt] then + func(mt, to, from) + end + end + end + function crawlReplace(t, to, from) + func(t, to, from) + for k in pairs(recurse) do + recurse[k] = nil + end + end +end + +-- @function destroyTable +-- @brief remove all the contents of a table +-- @param t table to destroy +local function destroyTable(t) + setmetatable(t, nil) + for k,v in pairs(t) do t[k] = nil end + table.setn(t, 0) +end + +local function isFrame(frame) + return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function" +end + +local new, del +do + local tables = setmetatable({}, {__mode = "k"}) + + function new() + local t = next(tables) + if t then + tables[t] = nil + return t + else + return {} + end + end + + function del(t, depth) + if depth and depth > 0 then + for k,v in pairs(t) do + if type(v) == "table" and not isFrame(v) then + del(v, depth - 1) + end + end + end + destroyTable(t) + tables[t] = true + end +end + +-- @function copyTable +-- @brief Create a shallow copy of a table and return it. +-- @param from The table to copy from +-- @return A shallow copy of the table +local function copyTable(from) + local to = new() + for k,v in pairs(from) do to[k] = v end + table.setn(to, table.getn(from)) + setmetatable(to, getmetatable(from)) + return to +end + +-- @function deepTransfer +-- @brief Fully transfer all data, keeping proper previous table +-- backreferences stable. +-- @param to The table with which data is to be injected into +-- @param from The table whose data will be injected into the first +-- @param saveFields If available, a shallow copy of the basic data is saved +-- in here. +-- @param list The account of table references +-- @param list2 The current status on which tables have been traversed. +local deepTransfer +do + -- @function examine + -- @brief Take account of all the table references to be shared + -- between the to and from tables. + -- @param to The table with which data is to be injected into + -- @param from The table whose data will be injected into the first + -- @param list An account of the table references + local function examine(to, from, list, major) + list[from] = to + for k,v in pairs(from) do + if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then + if from[k] == to[k] then + list[from[k]] = to[k] + elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then + list[from[k]] = from[k] + elseif not list[from[k]] then + examine(to[k], from[k], list, major) + end + end + end + return list + end + + function deepTransfer(to, from, saveFields, major, list, list2) + setmetatable(to, nil) + local createdList + if not list then + createdList = true + list = new() + list2 = new() + examine(to, from, list, major) + end + list2[to] = to + for k,v in pairs(to) do + if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then + if saveFields then + saveFields[k] = v + end + to[k] = nil + elseif v ~= _G then + if saveFields then + saveFields[k] = copyTable(v) + end + end + end + for k in pairs(from) do + if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then + if not list2[to[k]] then + deepTransfer(to[k], from[k], nil, major, list, list2) + end + to[k] = list[to[k]] or list2[to[k]] + else + rawset(to, k, from[k]) + end + end + table.setn(to, table.getn(from)) + setmetatable(to, getmetatable(from)) + local mt = getmetatable(to) + if mt then + if list[mt] then + setmetatable(to, list[mt]) + elseif mt.__index and list[mt.__index] then + mt.__index = list[mt.__index] + end + end + destroyTable(from) + if createdList then + del(list) + del(list2) + end + end +end + +-- @method IsNewVersion +-- @brief Obtain whether the supplied version would be an upgrade to the +-- current version. This allows for bypass code in library +-- declaration. +-- @param major A string representing the major version +-- @param minor An integer or an svn revision string representing the minor version +-- @return whether the supplied version would be newer than what is +-- currently available. +function AceLibrary:IsNewVersion(major, minor) + argCheck(self, major, 2, "string") + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 3, "number") + local data = self.libs[major] + if not data then + return true + end + return data.minor < minor +end + +-- @method HasInstance +-- @brief Returns whether an instance exists. This allows for optional support of a library. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return Whether an instance exists. +function AceLibrary:HasInstance(major, minor) + argCheck(self, major, 2, "string") + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 3, "number") + if not self.libs[major] then + return + end + return self.libs[major].minor == minor + end + return self.libs[major] and true +end + +-- @method GetInstance +-- @brief Returns the library with the given major/minor version. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return The library with the given major/minor version. +function AceLibrary:GetInstance(major, minor) + argCheck(self, major, 2, "string") + + local data = self.libs[major] + if not data then + _G.error(string.format("Cannot find a library instance of %s.", major), 2) + return + end + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 2, "number") + if data.minor ~= minor then + _G.error(string.format("Cannot find a library instance of %s, minor version %d.", major, minor), 2) + return + end + end + return data.instance +end + +-- Syntax sugar. AceLibrary("FooBar-1.0") +AceLibrary_mt.__call = AceLibrary.GetInstance + +local donothing + +local AceEvent + +-- @method Register +-- @brief Registers a new version of a given library. +-- @param newInstance the library to register +-- @param major the major version of the library +-- @param minor the minor version of the library +-- @param activateFunc (optional) A function to be called when the library is +-- fully activated. Takes the arguments +-- (newInstance [, oldInstance, oldDeactivateFunc]). If +-- oldInstance is given, you should probably call +-- oldDeactivateFunc(oldInstance). +-- @param deactivateFunc (optional) A function to be called by a newer library's +-- activateFunc. +-- @param externalFunc (optional) A function to be called whenever a new +-- library is registered. +function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc) + argCheck(self, newInstance, 2, "table") + argCheck(self, major, 3, "string") + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(string.format("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate", minor), 2) + end + end + argCheck(self, minor, 4, "number") + if math.floor(minor) ~= minor or minor < 0 then + error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor) + end + argCheck(self, activateFunc, 5, "function", "nil") + argCheck(self, deactivateFunc, 6, "function", "nil") + argCheck(self, externalFunc, 7, "function", "nil") + if not deactivateFunc then + if not donothing then + donothing = function() end + end + deactivateFunc = donothing + end + local data = self.libs[major] + if not data then + -- This is new + local instance = copyTable(newInstance) + crawlReplace(instance, instance, newInstance) + destroyTable(newInstance) + if AceLibrary == newInstance then + self = instance + AceLibrary = instance + end + self.libs[major] = { + instance = instance, + minor = minor, + deactivateFunc = deactivateFunc, + externalFunc = externalFunc, + } + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + addToPositions(instance, major) + if activateFunc then + activateFunc(instance, nil, nil) -- no old version, so explicit nil + end + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + externalFunc(instance, k, data.instance) + end + end + end + + for k,data in pairs(self.libs) do + if k ~= major and data.externalFunc then + data.externalFunc(data.instance, major, instance) + end + end + if major == "AceEvent-2.0" then + AceEvent = instance + end + if AceEvent then + AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance) + end + + return instance + end + local instance = data.instance + if minor <= data.minor then + if DEBUG then + -- This one is already obsolete, raise an error. + error(string.format("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end", major, data.minor, minor, major, minor), 2) + return + end + return instance + end + -- This is an update + local oldInstance = new() + + addToPositions(newInstance, major) + local isAceLibrary = (AceLibrary == newInstance) + local old_error, old_assert, old_argCheck, old_pcall + if isAceLibrary then + self = instance + AceLibrary = instance + + old_error = instance.error + old_assert = instance.assert + old_argCheck = instance.argCheck + old_pcall = instance.pcall + + self.error = error + self.assert = assert + self.argCheck = argCheck + self.pcall = pcall + end + deepTransfer(instance, newInstance, oldInstance, major) + crawlReplace(instance, instance, newInstance) + local oldDeactivateFunc = data.deactivateFunc + data.minor = minor + data.deactivateFunc = deactivateFunc + data.externalFunc = externalFunc + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + if isAceLibrary then + for _,v in pairs(self.libs) do + local i = type(v) == "table" and v.instance + if type(i) == "table" then + if not rawget(i, 'error') or i.error == old_error then + rawset(i, 'error', error) + end + if not rawget(i, 'assert') or i.assert == old_assert then + rawset(i, 'assert', assert) + end + if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then + rawset(i, 'argCheck', argCheck) + end + if not rawget(i, 'pcall') or i.pcall == old_pcall then + rawset(i, 'pcall', pcall) + end + end + end + end + if activateFunc then + activateFunc(instance, oldInstance, oldDeactivateFunc) + else + oldDeactivateFunc(oldInstance) + end + del(oldInstance) + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + externalFunc(instance, k, data.instance) + end + end + end + + return instance +end + +local iter +function AceLibrary:IterateLibraries() + if not iter then + local function iter(t, k) + k = next(t, k) + if not k then + return nil + else + return k, t[k].instance + end + end + end + return iter, self.libs, nil +end + +-- @function Activate +-- @brief The activateFunc for AceLibrary itself. Called when +-- AceLibrary properly registers. +-- @param self Reference to AceLibrary +-- @param oldLib (optional) Reference to an old version of AceLibrary +-- @param oldDeactivate (optional) Function to deactivate the old lib +local function activate(self, oldLib, oldDeactivate) + if not self.libs then + if oldLib then + self.libs = oldLib.libs + end + if not self.libs then + self.libs = {} + end + end + if not self.positions then + if oldLib then + self.positions = oldLib.positions + end + if not self.positions then + self.positions = setmetatable({}, { __mode = "k" }) + end + end + + -- Expose the library in the global environment + _G[ACELIBRARY_MAJOR] = self + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +if not previous then + previous = AceLibrary +end +if not previous.libs then + previous.libs = {} +end +AceLibrary.libs = previous.libs +if not previous.positions then + previous.positions = setmetatable({}, { __mode = "k" }) +end +AceLibrary.positions = previous.positions +AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate) diff --git a/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua b/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua new file mode 100644 index 0000000..c18076a --- /dev/null +++ b/MikScrollingBattleText/Libs/AceLocale-2.2/AceLocale-2.2.lua @@ -0,0 +1,537 @@ +--[[ +Name: AceLocale-2.2 +Revision: $Rev: 15291 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceLocale-2.2 +SVN: http://svn.wowace.com/root/trunk/Ace2/AceLocale-2.2 +Description: Localization library for addons to use to handle proper + localization and internationalization. +Dependencies: AceLibrary +]] + +local MAJOR_VERSION = "AceLocale-2.2" +local MINOR_VERSION = "$Revision: 15291 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local AceLocale = {} + +local DEFAULT_LOCALE = "enUS" +local _G = getfenv(0) + +local BASE_TRANSLATIONS, DEBUGGING, TRANSLATIONS, BASE_LOCALE, TRANSLATION_TABLES, REVERSE_TRANSLATIONS, STRICTNESS, DYNAMIC_LOCALES, CURRENT_LOCALE, NAME + +local rawget = rawget +local rawset = rawset +local type = type + +local newRegistries = {} +local scheduleClear + +local lastSelf +local __index = function(self, key) + lastSelf = self + local value = (rawget(self, TRANSLATIONS) or AceLocale.prototype)[key] + rawset(self, key, value) + return value +end + +local __newindex = function(self, k, v) + if type(v) ~= "function" and type(k) ~= "table" then + AceLocale.error(self, "Cannot change the values of an AceLocale instance.") + end + rawset(self, k, v) +end + +local __tostring = function(self) + if type(rawget(self, 'GetLibraryVersion')) == "function" then + return self:GetLibraryVersion() + else + return "AceLocale(" .. self[NAME] .. ")" + end +end + +local function clearCache(self) + if not rawget(self, BASE_TRANSLATIONS) then + return + end + + local cache = self[BASE_TRANSLATIONS] + rawset(self, REVERSE_TRANSLATIONS, nil) + + for k in pairs(self) do + if rawget(cache, k) ~= nil then + self[k] = nil + end + end + rawset(self, 'tmp', true) + self.tmp = nil +end + +local function refixInstance(instance) + if getmetatable(instance) then + setmetatable(instance, nil) + end + local translations = instance[TRANSLATIONS] + if translations then + if getmetatable(translations) then + setmetatable(translations, nil) + end + local baseTranslations = instance[BASE_TRANSLATIONS] + if getmetatable(baseTranslations) then + setmetatable(baseTranslations, nil) + end + if translations == baseTranslations or instance[STRICTNESS] then + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring + }) + + setmetatable(translations, { + __index = AceLocale.prototype + }) + else + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring + }) + + setmetatable(translations, { + __index = baseTranslations, + }) + + setmetatable(baseTranslations, { + __index = AceLocale.prototype, + }) + end + else + setmetatable(instance, { + __index = __index, + __newindex = __newindex, + __tostring = __tostring, + }) + end + clearCache(instance) + newRegistries[instance] = true + scheduleClear() + return instance +end + +function AceLocale:new(name) + self:argCheck(name, 2, "string") + + if self.registry[name] and type(rawget(self.registry[name], 'GetLibraryVersion')) ~= "function" then + return self.registry[name] + end + + AceLocale.registry[name] = refixInstance({ + [STRICTNESS] = false, + [NAME] = name, + }) + newRegistries[AceLocale.registry[name]] = true + return AceLocale.registry[name] +end + +AceLocale.prototype = { class = AceLocale } + +function AceLocale.prototype:EnableDebugging() + if rawget(self, BASE_TRANSLATIONS) then + AceLocale.error(self, "Cannot enable debugging after a translation has been registered.") + end + rawset(self, DEBUGGING, true) +end + +function AceLocale.prototype:EnableDynamicLocales(override) + AceLocale.argCheck(self, override, 2, "boolean", "nil") + if not override and rawget(self, BASE_TRANSLATIONS) then + AceLocale.error(self, "Cannot enable dynamic locales after a translation has been registered.") + end + if not rawget(self, DYNAMIC_LOCALES) then + rawset(self, DYNAMIC_LOCALES, true) + if rawget(self, BASE_LOCALE) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + self[TRANSLATION_TABLES][self[BASE_LOCALE]] = self[BASE_TRANSLATIONS] + self[TRANSLATION_TABLES][self[CURRENT_LOCALE]] = self[TRANSLATIONS] + end + end +end + +function AceLocale.prototype:RegisterTranslations(locale, func) + AceLocale.argCheck(self, locale, 2, "string") + AceLocale.argCheck(self, func, 3, "function") + + if locale == rawget(self, BASE_LOCALE) then + AceLocale.error(self, "Cannot provide the same locale more than once. %q provided twice.", locale) + end + + if rawget(self, BASE_TRANSLATIONS) and GetLocale() ~= locale then + if rawget(self, DEBUGGING) or rawget(self, DYNAMIC_LOCALES) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + if self[TRANSLATION_TABLES][locale] then + AceLocale.error(self, "Cannot provide the same locale more than once. %q provided twice.", locale) + end + local t = func() + func = nil + if type(t) ~= "table" then + AceLocale.error(self, "Bad argument #3 to `RegisterTranslations'. function did not return a table. (expected table, got %s)", type(t)) + end + self[TRANSLATION_TABLES][locale] = t + t = nil + end + func = nil + return + end + local t = func() + func = nil + if type(t) ~= "table" then + AceLocale.error(self, "Bad argument #3 to `RegisterTranslations'. function did not return a table. (expected table, got %s)", type(t)) + end + + rawset(self, TRANSLATIONS, t) + if not rawget(self, BASE_TRANSLATIONS) then + rawset(self, BASE_TRANSLATIONS, t) + rawset(self, BASE_LOCALE, locale) + for key,value in pairs(t) do + if value == true then + t[key] = key + end + end + else + for key, value in pairs(self[TRANSLATIONS]) do + if not rawget(self[BASE_TRANSLATIONS], key) then + AceLocale.error(self, "Improper translation exists. %q is likely misspelled for locale %s.", key, locale) + end + if value == true then + AceLocale.error(self, "Can only accept true as a value on the base locale. %q is the base locale, %q is not.", rawget(self, BASE_LOCALE), locale) + end + end + end + rawset(self, CURRENT_LOCALE, locale) + refixInstance(self) + if rawget(self, DEBUGGING) or rawget(self, DYNAMIC_LOCALES) then + if not rawget(self, TRANSLATION_TABLES) then + rawset(self, TRANSLATION_TABLES, {}) + end + self[TRANSLATION_TABLES][locale] = t + end + t = nil +end + +function AceLocale.prototype:SetLocale(locale) + AceLocale.argCheck(self, locale, 2, "string", "boolean") + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `SetLocale' without first calling `EnableDynamicLocales'.") + end + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `SetLocale' without first calling `RegisterTranslations'.") + end + if locale == true then + locale = GetLocale() + if not self[TRANSLATION_TABLES][locale] then + locale = self[BASE_LOCALE] + end + end + + if self[CURRENT_LOCALE] == locale then + return + end + + if not self[TRANSLATION_TABLES][locale] then + AceLocale.error(self, "Locale %q not registered.", locale) + end + + self[TRANSLATIONS] = self[TRANSLATION_TABLES][locale] + self[CURRENT_LOCALE] = locale + refixInstance(self) +end + +function AceLocale.prototype:GetLocale() + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `GetLocale' without first calling `RegisterTranslations'.") + end + return self[CURRENT_LOCALE] +end + +local function iter(t, position) + return (next(t, position)) +end + +function AceLocale.prototype:IterateAvailableLocales() + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `IterateAvailableLocales' without first calling `EnableDynamicLocales'.") + end + if not rawget(self, TRANSLATION_TABLES) then + AceLocale.error(self, "Cannot call `IterateAvailableLocales' without first calling `RegisterTranslations'.") + end + return iter, self[TRANSLATION_TABLES], nil +end + +function AceLocale.prototype:HasLocale(locale) + if not rawget(self, DYNAMIC_LOCALES) then + AceLocale.error(self, "Cannot call `HasLocale' without first calling `EnableDynamicLocales'.") + end + AceLocale.argCheck(self, locale, 2, "string") + return rawget(self, TRANSLATION_TABLES) and self[TRANSLATION_TABLES][locale] ~= nil +end + +function AceLocale.prototype:SetStrictness(strict) + AceLocale.argCheck(self, strict, 2, "boolean") + local mt = getmetatable(self) + if not mt then + AceLocale.error(self, "Cannot call `SetStrictness' without a metatable.") + end + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered.") + end + rawset(self, STRICTNESS, strict) + refixInstance(self) +end + +local function initReverse(self) + rawset(self, REVERSE_TRANSLATIONS, {}) + local alpha = self[TRANSLATIONS] + local bravo = self[REVERSE_TRANSLATIONS] + for base, localized in pairs(alpha) do + bravo[localized] = base + end +end + +function AceLocale.prototype:GetTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + return self[text] +end + +function AceLocale.prototype:GetStrictTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + local value = rawget(x, text) + if value == nil then + AceLocale.error(self, "Translation %q does not exist for locale %s", text, self[CURRENT_LOCALE]) + end + return value +end + +function AceLocale.prototype:GetReverseTranslation(text) + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + local translation = x[text] + if not translation then + AceLocale.error(self, "Reverse translation for %q does not exist", text) + end + return translation +end + +function AceLocale.prototype:GetIterator() + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + return next, x, nil +end + +function AceLocale.prototype:GetReverseIterator() + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + return next, x, nil +end + +function AceLocale.prototype:HasTranslation(text) + AceLocale.argCheck(self, text, 1, "string", "number") + local x = rawget(self, TRANSLATIONS) + if not x then + AceLocale.error(self, "No translations registered") + end + return rawget(x, text) and true +end + +function AceLocale.prototype:HasReverseTranslation(text) + local x = rawget(self, REVERSE_TRANSLATIONS) + if not x then + if not rawget(self, TRANSLATIONS) then + AceLocale.error(self, "No translations registered") + end + initReverse(self) + x = self[REVERSE_TRANSLATIONS] + end + return x[text] and true +end + +function AceLocale.prototype:Debug() + if not rawget(self, DEBUGGING) then + return + end + local words = {} + local locales = {"enUS", "deDE", "frFR", "koKR", "zhCN", "zhTW", "esES"} + local localizations = {} + DEFAULT_CHAT_FRAME:AddMessage("--- AceLocale Debug ---") + for _,locale in ipairs(locales) do + if not self[TRANSLATION_TABLES][locale] then + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q not found", locale)) + else + localizations[locale] = self[TRANSLATION_TABLES][locale] + end + end + local localeDebug = {} + for locale, localization in pairs(localizations) do + localeDebug[locale] = {} + for word in pairs(localization) do + if type(localization[word]) == "table" then + if type(words[word]) ~= "table" then + words[word] = {} + end + for bit in pairs(localization[word]) do + if type(localization[word][bit]) == "string" then + words[word][bit] = true + end + end + elseif type(localization[word]) == "string" then + words[word] = true + end + end + end + for word in pairs(words) do + if type(words[word]) == "table" then + for bit in pairs(words[word]) do + for locale, localization in pairs(localizations) do + if not rawget(localization, word) or not localization[word][bit] then + localeDebug[locale][word .. "::" .. bit] = true + end + end + end + else + for locale, localization in pairs(localizations) do + if not rawget(localization, word) then + localeDebug[locale][word] = true + end + end + end + end + for locale, t in pairs(localeDebug) do + if not next(t) then + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q complete", locale)) + else + DEFAULT_CHAT_FRAME:AddMessage(string.format("Locale %q missing:", locale)) + for word in pairs(t) do + DEFAULT_CHAT_FRAME:AddMessage(string.format(" %q", word)) + end + end + end + DEFAULT_CHAT_FRAME:AddMessage("--- End AceLocale Debug ---") +end + +setmetatable(AceLocale.prototype, { + __index = function(self, k) + if type(k) ~= "table" and k ~= 0 and k ~= "GetLibraryVersion" and k ~= "error" and k ~= "assert" and k ~= "argCheck" and k ~= "pcall" then -- HACK: remove "GetLibraryVersion" and such later. + AceLocale.error(lastSelf or self, "Translation %q does not exist.", k) + end + return nil + end +}) + +local function activate(self, oldLib, oldDeactivate) + AceLocale = self + + self.frame = oldLib and oldLib.frame or CreateFrame("Frame") + self.registry = oldLib and oldLib.registry or {} + self.BASE_TRANSLATIONS = oldLib and oldLib.BASE_TRANSLATIONS or {} + self.DEBUGGING = oldLib and oldLib.DEBUGGING or {} + self.TRANSLATIONS = oldLib and oldLib.TRANSLATIONS or {} + self.BASE_LOCALE = oldLib and oldLib.BASE_LOCALE or {} + self.TRANSLATION_TABLES = oldLib and oldLib.TRANSLATION_TABLES or {} + self.REVERSE_TRANSLATIONS = oldLib and oldLib.REVERSE_TRANSLATIONS or {} + self.STRICTNESS = oldLib and oldLib.STRICTNESS or {} + self.NAME = oldLib and oldLib.NAME or {} + self.DYNAMIC_LOCALES = oldLib and oldLib.DYNAMIC_LOCALES or {} + self.CURRENT_LOCALE = oldLib and oldLib.CURRENT_LOCALE or {} + + BASE_TRANSLATIONS = self.BASE_TRANSLATIONS + DEBUGGING = self.DEBUGGING + TRANSLATIONS = self.TRANSLATIONS + BASE_LOCALE = self.BASE_LOCALE + TRANSLATION_TABLES = self.TRANSLATION_TABLES + REVERSE_TRANSLATIONS = self.REVERSE_TRANSLATIONS + STRICTNESS = self.STRICTNESS + NAME = self.NAME + DYNAMIC_LOCALES = self.DYNAMIC_LOCALES + CURRENT_LOCALE = self.CURRENT_LOCALE + + + local GetTime = GetTime + local timeUntilClear = GetTime() + 5 + scheduleClear = function() + if next(newRegistries) then + self.frame:Show() + timeUntilClear = GetTime() + 5 + end + end + + if not self.registry then + self.registry = {} + else + for name, instance in pairs(self.registry) do + local name = name + local mt = getmetatable(instance) + setmetatable(instance, nil) + instance[NAME] = name + local strict + if instance[STRICTNESS] ~= nil then + strict = instance[STRICTNESS] + elseif instance[TRANSLATIONS] ~= instance[BASE_TRANSLATIONS] then + if getmetatable(instance[TRANSLATIONS]).__index == oldLib.prototype then + strict = true + end + end + instance[STRICTNESS] = strict and true or false + refixInstance(instance) + end + end + + self.frame:SetScript("OnEvent", scheduleClear) + self.frame:SetScript("OnUpdate", function() -- (this, elapsed) + if timeUntilClear - GetTime() <= 0 then + self.frame:Hide() + for k in pairs(newRegistries) do + clearCache(k) + newRegistries[k] = nil + k = nil + end + end + end) + self.frame:UnregisterAllEvents() + self.frame:RegisterEvent("ADDON_LOADED") + self.frame:RegisterEvent("PLAYER_ENTERING_WORLD") + self.frame:Show() + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(AceLocale, MAJOR_VERSION, MINOR_VERSION, activate) diff --git a/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua b/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua new file mode 100644 index 0000000..7d9d2ca --- /dev/null +++ b/MikScrollingBattleText/Libs/BabbleSpell-2.2/Babble-Spell-2.2.lua @@ -0,0 +1,4134 @@ +--[[ +Name: Babble-Spell-2.2 +Revision: $Rev: 15059 $ +Author(s): ckknight (ckknight@gmail.com) +Website: http://ckknight.wowinterface.com/ +Documentation: http://wiki.wowace.com/index.php/Babble-Spell-2.2 +SVN: http://svn.wowace.com/root/trunk/Babble-2.2/Babble-Spell-2.2 +Description: A library to provide localizations for spells. +Dependencies: AceLibrary, AceLocale-2.2 +]] + +local MAJOR_VERSION = "Babble-Spell-2.2" +local MINOR_VERSION = tonumber(string.sub("$Revision: 15059 $", 12, -3)) + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:HasInstance("AceLocale-2.2") then error(MAJOR_VERSION .. " requires AceLocale-2.2") end + +local _, x = AceLibrary("AceLocale-2.2"):GetLibraryVersion() +MINOR_VERSION = MINOR_VERSION * 100000 + x + +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local BabbleSpell = AceLibrary("AceLocale-2.2"):new(MAJOR_VERSION) + +-- uncomment below for debug information +-- BabbleSpell:EnableDebugging() + +BabbleSpell:RegisterTranslations("enUS", function() + return { + ["Abolish Disease"] = true, + ["Abolish Poison Effect"] = true, + ["Abolish Poison"] = true, + ["Activate MG Turret"] = true, + ["Adrenaline Rush"] = true, + ["Aftermath"] = true, + ["Aggression"] = true, + ["Aimed Shot"] = true, + ["Alchemy"] = true, + ["Ambush"] = true, + ["Amplify Curse"] = true, + ["Amplify Magic"] = true, + ["Ancestral Fortitude"] = true, + ["Ancestral Healing"] = true, + ["Ancestral Knowledge"] = true, + ["Ancestral Spirit"] = true, + ["Anger Management"] = true, + ["Anticipation"] = true, + ["Aquatic Form"] = true, + ["Arcane Brilliance"] = true, + ["Arcane Concentration"] = true, + ["Arcane Explosion"] = true, + ["Arcane Focus"] = true, + ["Arcane Instability"] = true, + ["Arcane Intellect"] = true, + ["Arcane Meditation"] = true, + ["Arcane Mind"] = true, + ["Arcane Missiles"] = true, + ["Arcane Power"] = true, + ["Arcane Resistance"] = true, + ["Arcane Shot"] = true, + ["Arcane Subtlety"] = true, + ["Arctic Reach"] = true, + ["Armorsmith"] = true, + ["Aspect of the Beast"] = true, + ["Aspect of the Cheetah"] = true, + ["Aspect of the Hawk"] = true, + ["Aspect of the Monkey"] = true, + ["Aspect of the Pack"] = true, + ["Aspect of the Wild"] = true, + ["Astral Recall"] = true, + ["Attack"] = true, + ["Attacking"] = true, + ["Auto Shot"] = true, + ["Axe Specialization"] = true, + ["Backstab"] = true, + ["Bane"] = true, + ["Banish"] = true, + ["Barkskin Effect"] = true, + ["Barkskin"] = true, + ["Barrage"] = true, + ["Bash"] = true, + ["Basic Campfire"] = true, + ["Battle Shout"] = true, + ["Battle Stance Passive"] = true, + ["Battle Stance"] = true, + ["Bear Form"] = true, + ["Beast Lore"] = true, + ["Beast Slaying"] = true, + ["Beast Training"] = true, + ["Benediction"] = true, + ["Berserker Rage"] = true, + ["Berserker Stance Passive"] = true, + ["Berserker Stance"] = true, + ["Berserking"] = true, + ["Bestial Discipline"] = true, + ["Bestial Swiftness"] = true, + ["Bestial Wrath"] = true, + ["Bite"] = true, + ["Black Arrow"] = true, + ["Blackout"] = true, + ["Blacksmithing"] = true, + ["Blade Flurry"] = true, + ["Blast Wave"] = true, + ["Blessed Recovery"] = true, + ["Blessing of Freedom"] = true, + ["Blessing of Kings"] = true, + ["Blessing of Light"] = true, + ["Blessing of Might"] = true, + ["Blessing of Protection"] = true, + ["Blessing of Sacrifice"] = true, + ["Blessing of Salvation"] = true, + ["Blessing of Sanctuary"] = true, + ["Blessing of Wisdom"] = true, + ["Blind"] = true, + ["Blinding Powder"] = true, + ["Blink"] = true, + ["Blizzard"] = true, + ["Block"] = true, + ["Blood Craze"] = true, + ["Blood Frenzy"] = true, + ["Blood Fury"] = true, + ["Blood Pact"] = true, + ["Bloodrage"] = true, + ["Bloodthirst"] = true, + ["Booming Voice"] = true, + ["Bow Specialization"] = true, + ["Bows"] = true, + ["Bright Campfire"] = true, + ["Brutal Impact"] = true, + ["Burning Soul"] = true, + ["Call Pet"] = true, + ["Call of Flame"] = true, + ["Call of Thunder"] = true, + ["Camouflage"] = true, + ["Cannibalize"] = true, + ["Cat Form"] = true, + ["Cataclysm"] = true, + ["Chain Heal"] = true, + ["Chain Lightning"] = true, + ["Challenging Roar"] = true, + ["Challenging Shout"] = true, + ["Charge Rage Bonus Effect"] = true, + ["Charge"] = true, + ["Charge Stun"] = true, + ["Cheap Shot"] = true, + ["Chilled"] = true, + ["Claw"] = true, + ["Cleanse"] = true, + ["Clearcasting"] = true, + ["Cleave"] = true, + ["Clever Traps"] = true, + ["Closing"] = true, + ["Cloth"] = true, + ["Coarse Sharpening Stone"] = true, + ["Cobra Reflexes"] = true, + ["Cold Blood"] = true, + ["Cold Snap"] = true, + ["Combat Endurance"] = true, + ["Combustion"] = true, + ["Command"] = true, + ["Concentration Aura"] = true, + ["Concussion Blow"] = true, + ["Concussion"] = true, + ["Concussive Shot"] = true, + ["Cone of Cold"] = true, + ["Conflagrate"] = true, + ["Conjure Food"] = true, + ["Conjure Mana Agate"] = true, + ["Conjure Mana Citrine"] = true, + ["Conjure Mana Jade"] = true, + ["Conjure Mana Ruby"] = true, + ["Conjure Water"] = true, + ["Consecrated Sharpening Stone"] = true, + ["Consecration"] = true, + ["Consume Shadows"] = true, + ["Convection"] = true, + ["Conviction"] = true, + ["Cooking"] = true, + ["Corruption"] = true, + ["Counterattack"] = true, + ["Counterspell"] = true, + ["Counterspell - Silenced"] = true, + ["Cower"] = true, + ["Create Firestone"] = true, + ["Create Firestone (Major)"] = true, + ["Create Firestone (Greater)"] = true, + ["Create Firestone (Lesser)"] = true, + ["Create Healthstone"] = true, + ["Create Healthstone (Major)"] = true, + ["Create Healthstone (Greater)"] = true, + ["Create Healthstone (Lesser)"] = true, + ["Create Healthstone (Minor)"] = true, + ["Create Soulstone"] = true, + ["Create Soulstone (Major)"] = true, + ["Create Soulstone (Greater)"] = true, + ["Create Soulstone (Lesser)"] = true, + ["Create Soulstone (Minor)"] = true, + ["Create Spellstone"] = true, + ["Create Spellstone (Major)"] = true, + ["Create Spellstone (Greater)"] = true, + ["Crippling Poison II"] = true, + ["Crippling Poison"] = true, + ["Critical Mass"] = true, + ["Crossbows"] = true, + ["Cruelty"] = true, + ["Cultivation"] = true, + ["Cure Disease"] = true, + ["Cure Poison"] = true, + ["Curse of Agony"] = true, + ["Curse of Doom Effect"] = true, + ["Curse of Doom"] = true, + ["Curse of Exhaustion"] = true, + ["Curse of Idiocy"] = true, + ["Curse of Recklessness"] = true, + ["Curse of Shadow"] = true, + ["Curse of Tongues"] = true, + ["Curse of Weakness"] = true, + ["Curse of the Elements"] = true, + ["Dagger Specialization"] = true, + ["Daggers"] = true, + ["Dampen Magic"] = true, + ["Dark Pact"] = true, + ["Darkness"] = true, + ["Dash"] = true, + ["Deadly Poison II"] = true, + ["Deadly Poison III"] = true, + ["Deadly Poison IV"] = true, + ["Deadly Poison V"] = true, + ["Deadly Poison"] = true, + ["Death Coil"] = true, + ["Death Wish"] = true, + ["Deep Wounds"] = true, + ["Defense"] = true, + ["Defensive Stance Passive"] = true, + ["Defensive Stance"] = true, + ["Defensive State 2"] = true, + ["Defensive State"] = true, + ["Defiance"] = true, + ["Deflection"] = true, + ["Demon Armor"] = true, + ["Demon Skin"] = true, + ["Demonic Embrace"] = true, + ["Demonic Sacrifice"] = true, + ["Demoralizing Roar"] = true, + ["Demoralizing Shout"] = true, + ["Dense Sharpening Stone"] = true, + ["Desperate Prayer"] = true, + ["Destructive Reach"] = true, + ["Detect Greater Invisibility"] = true, + ["Detect Invisibility"] = true, + ["Detect Lesser Invisibility"] = true, + ["Detect Magic"] = true, + ["Detect Traps"] = true, + ["Detect"] = true, + ["Deterrence"] = true, + ["Devastation"] = true, + ["Devotion Aura"] = true, + ["Devour Magic Effect"] = true, + ["Devour Magic"] = true, + ["Devouring Plague"] = true, + ["Diplomacy"] = true, + ["Dire Bear Form"] = true, + ["Disarm Trap"] = true, + ["Disarm"] = true, + ["Disease Cleansing Totem"] = true, + ["Disenchant"] = true, + ["Disengage"] = true, + ["Dismiss Pet"] = true, + ["Dispel Magic"] = true, + ["Distract"] = true, + ["Distracting Shot"] = true, + ["Dive"] = true, + ["Divine Favor"] = true, + ["Divine Fury"] = true, + ["Divine Intellect"] = true, + ["Divine Intervention"] = true, + ["Divine Protection"] = true, + ["Divine Shield"] = true, + ["Divine Spirit"] = true, + ["Divine Strength"] = true, + ["Dodge"] = true, + ["Dragonscale Leatherworking"] = true, + ["Drain Life"] = true, + ["Drain Mana"] = true, + ["Drain Soul"] = true, + ["Drink"] = true, + ["Dual Wield Specialization"] = true, + ["Dual Wield"] = true, + ["Duel"] = true, + ["Eagle Eye"] = true, + ["Earth Shock"] = true, + ["Earthbind Totem"] = true, + ["Efficiency"] = true, + ["Elemental Focus"] = true, + ["Elemental Fury"] = true, + ["Elemental Leatherworking"] = true, + ["Elemental Mastery"] = true, + ["Elemental Sharpening Stone"] = true, + ["Elune's Grace"] = true, + ["Elusiveness"] = true, + ["Emberstorm"] = true, + ["Enamored Water Spirit"] = true, + ["Enchanting"] = true, + ["Endurance Training"] = true, + ["Endurance"] = true, + ["Engineering Specialization"] = true, + ["Engineering"] = true, + ["Enrage"] = true, + ["Enriched Manna Biscuit"] = true, + ["Enslave Demon"] = true, + ["Entangling Roots"] = true, + ["Entrapment"] = true, + ["Escape Artist"] = true, + ["Evasion"] = true, + ["Eventide"] = true, + ["Eviscerate"] = true, + ["Evocation"] = true, + ["Execute"] = true, + ["Exorcism"] = true, + ["Expansive Mind"] = true, + ["Explosive Trap Effect"] = true, + ["Explosive Trap"] = true, + ["Expose Armor"] = true, + ["Eye for an Eye"] = true, + ["Eye of Kilrogg"] = true, + ["Eyes of the Beast"] = true, + ["Fade"] = true, + ["Faerie Fire"] = true, + ["Faerie Fire (Feral)"] = true, + ["Far Sight"] = true, + ["Fear Ward"] = true, + ["Fear"] = true, + ["Feed Pet"] = true, + ["Feedback"] = true, + ["Feign Death"] = true, + ["Feint"] = true, + ["Fel Concentration"] = true, + ["Fel Domination"] = true, + ["Fel Intellect"] = true, + ["Fel Stamina"] = true, + ["Felfire"] = true, + ["Feline Grace"] = true, + ["Feline Swiftness"] = true, + ["Feral Aggression"] = true, + ["Feral Charge"] = true, + ["Feral Instinct"] = true, + ["Ferocious Bite"] = true, + ["Ferocity"] = true, + ["Fetish"] = true, + ["Find Herbs"] = true, + ["Find Minerals"] = true, + ["Find Treasure"] = true, + ["Fire Blast"] = true, + ["Fire Nova Totem"] = true, + ["Fire Power"] = true, + ["Fire Resistance Aura"] = true, + ["Fire Resistance Totem"] = true, + ["Fire Resistance"] = true, + ["Fire Shield"] = true, + ["Fire Vulnerability"] = true, + ["Fire Ward"] = true, + ["Fireball"] = true, + ["Firebolt"] = true, + ["First Aid"] = true, + ["Fishing Poles"] = true, + ["Fishing"] = true, + ["Fist Weapon Specialization"] = true, + ["Fist Weapons"] = true, + ["Flame Shock"] = true, + ["Flame Throwing"] = true, + ["Flamestrike"] = true, + ["Flamethrower"] = true, + ["Flametongue Totem"] = true, + ["Flametongue Weapon"] = true, + ["Flare"] = true, + ["Flash Heal"] = true, + ["Flash of Light"] = true, + ["Flurry"] = true, + ["Focused Casting"] = true, + ["Food"] = true, + ["Forbearance"] = true, + ["Force of Will"] = true, + ["Freezing Trap Effect"] = true, + ["Freezing Trap"] = true, + ["Frenzied Regeneration"] = true, + ["Frenzy"] = true, + ["Frost Armor"] = true, + ["Frost Channeling"] = true, + ["Frost Nova"] = true, + ["Frost Resistance Aura"] = true, + ["Frost Resistance Totem"] = true, + ["Frost Resistance"] = true, + ["Frost Shock"] = true, + ["Frost Trap"] = true, + ["Frost Trap Aura"] = true, + ["Frost Ward"] = true, + ["Frostbite"] = true, + ["Frostbolt"] = true, + ["Frostbrand Weapon"] = true, + ["Furious Howl"] = true, + ["Furor"] = true, + ["Garrote"] = true, + ["Generic"] = true, + ["Ghost Wolf"] = true, + ["Ghostly Strike"] = true, + ["Gift of Nature"] = true, + ["Gift of the Wild"] = true, + ["Gouge"] = true, + ["Grace of Air Totem"] = true, + ["Great Stamina"] = true, + ["Greater Blessing of Kings"] = true, + ["Greater Blessing of Light"] = true, + ["Greater Blessing of Might"] = true, + ["Greater Blessing of Salvation"] = true, + ["Greater Blessing of Sanctuary"] = true, + ["Greater Blessing of Wisdom"] = true, + ["Greater Heal"] = true, + ["Grim Reach"] = true, + ["Grounding Totem"] = true, + ["Grovel"] = true, + ["Growl"] = true, + ["Guardian's Favor"] = true, + ["Gun Specialization"] = true, + ["Guns"] = true, + ["Hammer of Justice"] = true, + ["Hand of Justice"] = true, + ["Hammer of Wrath"] = true, + ["Hamstring"] = true, + ["Harass"] = true, + ["Hardiness"] = true, + ["Hawk Eye"] = true, + ["Heal"] = true, + ["Healing Focus"] = true, + ["Healing Light"] = true, + ["Healing Stream Totem"] = true, + ["Healing Touch"] = true, + ["Healing Wave"] = true, + ["Healing Way"] = true, + ["Health Funnel"] = true, + ["Heart of the Wild"] = true, + ["Heavy Sharpening Stone"] = true, + ["Hellfire Effect"] = true, + ["Hellfire"] = true, + ["Hemorrhage"] = true, + ["Herb Gathering"] = true, + ["Herbalism"] = true, + ["Heroic Strike"] = true, + ["Hex of Weakness"] = true, + ["Hibernate"] = true, + ["Holy Fire"] = true, + ["Holy Light"] = true, + ["Holy Nova"] = true, + ["Holy Power"] = true, + ["Holy Reach"] = true, + ["Holy Shield"] = true, + ["Holy Shock"] = true, + ["Holy Specialization"] = true, + ["Holy Wrath"] = true, + ["Honorless Target"] = true, + ["Horse Riding"] = true, + ["Howl of Terror"] = true, + ["Humanoid Slaying"] = true, + ["Hunter's Mark"] = true, + ["Hurricane"] = true, + ["Ice Armor"] = true, + ["Ice Barrier"] = true, + ["Ice Block"] = true, + ["Ice Shards"] = true, + ["Ignite"] = true, + ["Illumination"] = true, + ["Immolate"] = true, + ["Immolation Trap Effect"] = true, + ["Immolation Trap"] = true, + ["Impact"] = true, + ["Impale"] = true, + ["Improved Ambush"] = true, + ["Improved Arcane Explosion"] = true, + ["Improved Arcane Missiles"] = true, + ["Improved Arcane Shot"] = true, + ["Improved Aspect of the Hawk"] = true, + ["Improved Aspect of the Monkey"] = true, + ["Improved Backstab"] = true, + ["Improved Battle Shout"] = true, + ["Improved Berserker Rage"] = true, + ["Improved Blessing of Might"] = true, + ["Improved Blessing of Wisdom"] = true, + ["Improved Blizzard"] = true, + ["Improved Bloodrage"] = true, + ["Improved Chain Heal"] = true, + ["Improved Chain Lightning"] = true, + ["Improved Challenging Shout"] = true, + ["Improved Charge"] = true, + ["Improved Cheap Shot"] = true, + ["Improved Cleave"] = true, + ["Improved Concentration Aura"] = true, + ["Improved Concussive Shot"] = true, + ["Improved Cone of Cold"] = true, + ["Improved Corruption"] = true, + ["Improved Counterspell"] = true, + ["Improved Curse of Agony"] = true, + ["Improved Curse of Exhaustion"] = true, + ["Improved Curse of Weakness"] = true, + ["Improved Dampen Magic"] = true, + ["Improved Deadly Poison"] = true, + ["Improved Demoralizing Shout"] = true, + ["Improved Devotion Aura"] = true, + ["Improved Disarm"] = true, + ["Improved Distract"] = true, + ["Improved Drain Life"] = true, + ["Improved Drain Mana"] = true, + ["Improved Drain Soul"] = true, + ["Improved Enrage"] = true, + ["Improved Enslave Demon"] = true, + ["Improved Entangling Roots"] = true, + ["Improved Evasion"] = true, + ["Improved Eviscerate"] = true, + ["Improved Execute"] = true, + ["Improved Expose Armor"] = true, + ["Improved Eyes of the Beast"] = true, + ["Improved Fade"] = true, + ["Improved Feign Death"] = true, + ["Improved Fire Blast"] = true, + ["Improved Fire Nova Totem"] = true, + ["Improved Fire Ward"] = true, + ["Improved Fireball"] = true, + ["Improved Firebolt"] = true, + ["Improved Firestone"] = true, + ["Improved Flamestrike"] = true, + ["Improved Flametongue Weapon"] = true, + ["Improved Flash of Light"] = true, + ["Improved Frost Nova"] = true, + ["Improved Frost Ward"] = true, + ["Improved Frostbolt"] = true, + ["Improved Frostbrand Weapon"] = true, + ["Improved Garrote"] = true, + ["Improved Ghost Wolf"] = true, + ["Improved Gouge"] = true, + ["Improved Grace of Air Totem"] = true, + ["Improved Grounding Totem"] = true, + ["Improved Hammer of Justice"] = true, + ["Improved Hamstring"] = true, + ["Improved Healing Stream Totem"] = true, + ["Improved Healing Touch"] = true, + ["Improved Healing Wave"] = true, + ["Improved Healing"] = true, + ["Improved Health Funnel"] = true, + ["Improved Healthstone"] = true, + ["Improved Heroic Strike"] = true, + ["Improved Hunter's Mark"] = true, + ["Improved Immolate"] = true, + ["Improved Imp"] = true, + ["Improved Inner Fire"] = true, + ["Improved Instant Poison"] = true, + ["Improved Intercept"] = true, + ["Improved Intimidating Shout"] = true, + ["Improved Judgement"] = true, + ["Improved Kick"] = true, + ["Improved Kidney Shot"] = true, + ["Improved Lash of Pain"] = true, + ["Improved Lay on Hands"] = true, + ["Improved Lesser Healing Wave"] = true, + ["Improved Life Tap"] = true, + ["Improved Lightning Bolt"] = true, + ["Improved Lightning Shield"] = true, + ["Improved Magma Totem"] = true, + ["Improved Mana Burn"] = true, + ["Improved Mana Shield"] = true, + ["Improved Mana Spring Totem"] = true, + ["Improved Mark of the Wild"] = true, + ["Improved Mend Pet"] = true, + ["Improved Mind Blast"] = true, + ["Improved Moonfire"] = true, + ["Improved Nature's Grasp"] = true, + ["Improved Overpower"] = true, + ["Improved Power Word: Fortitude"] = true, + ["Improved Power Word: Shield"] = true, + ["Improved Prayer of Healing"] = true, + ["Improved Psychic Scream"] = true, + ["Improved Pummel"] = true, + ["Improved Regrowth"] = true, + ["Improved Reincarnation"] = true, + ["Improved Rejuvenation"] = true, + ["Improved Rend"] = true, + ["Improved Renew"] = true, + ["Improved Retribution Aura"] = true, + ["Improved Revenge"] = true, + ["Improved Revive Pet"] = true, + ["Improved Righteous Fury"] = true, + ["Improved Rockbiter Weapon"] = true, + ["Improved Rupture"] = true, + ["Improved Sap"] = true, + ["Improved Scorch"] = true, + ["Improved Scorpid Sting"] = true, + ["Improved Seal of Righteousness"] = true, + ["Improved Seal of the Crusader"] = true, + ["Improved Searing Pain"] = true, + ["Improved Searing Totem"] = true, + ["Improved Serpent Sting"] = true, + ["Improved Shadow Bolt"] = true, + ["Improved Shadow Word: Pain"] = true, + ["Improved Shield Bash"] = true, + ["Improved Shield Block"] = true, + ["Improved Shield Wall"] = true, + ["Improved Shred"] = true, + ["Improved Sinister Strike"] = true, + ["Improved Slam"] = true, + ["Improved Slice and Dice"] = true, + ["Improved Spellstone"] = true, + ["Improved Sprint"] = true, + ["Improved Starfire"] = true, + ["Improved Stoneclaw Totem"] = true, + ["Improved Stoneskin Totem"] = true, + ["Improved Strength of Earth Totem"] = true, + ["Improved Succubus"] = true, + ["Improved Sunder Armor"] = true, + ["Improved Taunt"] = true, + ["Improved Thorns"] = true, + ["Improved Thunder Clap"] = true, + ["Improved Tranquility"] = true, + ["Improved Vampiric Embrace"] = true, + ["Improved Vanish"] = true, + ["Improved Voidwalker"] = true, + ["Improved Windfury Weapon"] = true, + ["Improved Wing Clip"] = true, + ["Improved Wrath"] = true, + ["Incinerate"] = true, + ["Inferno"] = true, + ["Initiative"] = true, + ["Inner Fire"] = true, + ["Inner Focus"] = true, + ["Innervate"] = true, + ["Insect Swarm"] = true, + ["Inspiration"] = true, + ["Instant Poison II"] = true, + ["Instant Poison III"] = true, + ["Instant Poison IV"] = true, + ["Instant Poison V"] = true, + ["Instant Poison VI"] = true, + ["Instant Poison"] = true, + ["Intensity"] = true, + ["Intercept"] = true, + ["Intercept Stun"] = true, + ["Intimidating Shout"] = true, + ["Intimidation"] = true, + ["Iron Will"] = true, + ["Judgement of Command"] = true, + ["Judgement of Justice"] = true, + ["Judgement of Light"] = true, + ["Judgement of Righteousness"] = true, + ["Judgement of Wisdom"] = true, + ["Judgement of the Crusader"] = true, + ["Judgement"] = true, + ["Kick"] = true, + ["Kick - Silenced"] = true, + ["Kidney Shot"] = true, + ["Killer Instinct"] = true, + ["Kodo Riding"] = true, + ["Lash of Pain"] = true, + ["Last Stand"] = true, + ["Lasting Judgement"] = true, + ["Lay on Hands"] = true, + ["Leader of the Pack"] = true, + ["Leather"] = true, + ["Leatherworking"] = true, + ["Lesser Heal"] = true, + ["Lesser Healing Wave"] = true, + ["Lesser Invisibility"] = true, + ["Lethal Shots"] = true, + ["Lethality"] = true, + ["Levitate"] = true, + ["Libram"] = true, + ["Life Tap"] = true, + ["Lightning Bolt"] = true, + ["Lightning Breath"] = true, + ["Lightning Mastery"] = true, + ["Lightning Reflexes"] = true, + ["Lightning Shield"] = true, + ["Lightwell Renew"] = true, + ["Lightwell"] = true, + ["Lockpicking"] = true, + ["Long Daze"] = true, + ["Mace Specialization"] = true, + ["Mace Stun Effect"] = true, + ["Mage Armor"] = true, + ["Magma Totem"] = true, + ["Mail"] = true, + ["Malice"] = true, + ["Mana Burn"] = true, + ["Mana Shield"] = true, + ["Mana Spring Totem"] = true, + ["Mana Tide Totem"] = true, + ["Mangle"] = true, + ["Mark of the Wild"] = true, + ["Martyrdom"] = true, + ["Master Demonologist"] = true, + ["Master Summoner"] = true, + ["Master of Deception"] = true, + ["Maul"] = true, + ["Mechanostrider Piloting"] = true, + ["Meditation"] = true, + ["Melee Specialization"] = true, + ["Mend Pet"] = true, + ["Mental Agility"] = true, + ["Mental Strength"] = true, + ["Mind Blast"] = true, + ["Mind Control"] = true, + ["Mind Flay"] = true, + ["Mind Soothe"] = true, + ["Mind Vision"] = true, + ["Mind-numbing Poison II"] = true, + ["Mind-numbing Poison III"] = true, + ["Mind-numbing Poison"] = true, + ["Mining"] = true, + ["Mocking Blow"] = true, + ["Mongoose Bite"] = true, + ["Monster Slaying"] = true, + ["Moonfire"] = true, + ["Moonfury"] = true, + ["Moonglow"] = true, + ["Moonkin Aura"] = true, + ["Moonkin Form"] = true, + ["Mortal Shots"] = true, + ["Mortal Strike"] = true, + ["Multi-Shot"] = true, + ["Murder"] = true, + ["Natural Armor"] = true, + ["Natural Shapeshifter"] = true, + ["Natural Weapons"] = true, + ["Nature Resistance Totem"] = true, + ["Nature Resistance"] = true, + ["Nature's Focus"] = true, + ["Nature's Grace"] = true, + ["Nature's Grasp"] = true, + ["Nature's Reach"] = true, + ["Nature's Swiftness"] = true, + ["Nightfall"] = true, + ["Omen of Clarity"] = true, + ["One-Handed Axes"] = true, + ["One-Handed Maces"] = true, + ["One-Handed Swords"] = true, + ["One-Handed Weapon Specialization"] = true, + ["Opening - No Text"] = true, + ["Opening"] = true, + ["Opportunity"] = true, + ["Overpower"] = true, + ["Paranoia"] = true, + ["Parry"] = true, + ["Pathfinding"] = true, + ["Perception"] = true, + ["Permafrost"] = true, + ["Pet Aggression"] = true, + ["Pet Hardiness"] = true, + ["Pet Recovery"] = true, + ["Pet Resistance"] = true, + ["Phase Shift"] = true, + ["Pick Lock"] = true, + ["Pick Pocket"] = true, + ["Piercing Howl"] = true, + ["Piercing Ice"] = true, + ["Plate Mail"] = true, + ["Poison Cleansing Totem"] = true, + ["Poisons"] = true, + ["Polearm Specialization"] = true, + ["Polearms"] = true, + ["Polymorph"] = true, + ["Polymorph: Pig"] = true, + ["Polymorph: Turtle"] = true, + ["Portal: Darnassus"] = true, + ["Portal: Ironforge"] = true, + ["Portal: Orgrimmar"] = true, + ["Portal: Stormwind"] = true, + ["Portal: Thunder Bluff"] = true, + ["Portal: Undercity"] = true, + ["Pounce Bleed"] = true, + ["Pounce"] = true, + ["Power Infusion"] = true, + ["Power Word: Fortitude"] = true, + ["Power Word: Shield"] = true, + ["Prayer of Fortitude"] = true, + ["Prayer of Healing"] = true, + ["Prayer of Shadow Protection"] = true, + ["Prayer of Spirit"] = true, + ["Precision"] = true, + ["Predatory Strikes"] = true, + ["Premeditation"] = true, + ["Preparation"] = true, + ["Presence of Mind"] = true, + ["Primal Fury"] = true, + ["Prowl"] = true, + ["Psychic Scream"] = true, + ["Pummel"] = true, + ["Purge"] = true, + ["Purification"] = true, + ["Purify"] = true, + ["Pursuit of Justice"] = true, + ["Pyroblast"] = true, + ["Pyroclasm"] = true, + ["Quick Shots"] = true, + ["Quickness"] = true, + ["Rain of Fire"] = true, + ["Rake"] = true, + ["Ram Riding"] = true, + ["Ranged Weapon Specialization"] = true, + ["Rapid Concealment"] = true, + ["Rapid Fire"] = true, + ["Raptor Riding"] = true, + ["Raptor Strike"] = true, + ["Ravage"] = true, + ["Readiness"] = true, + ["Rebirth"] = true, + ["Reckless Charge"] = true, + ["Recklessness"] = true, + ["Reckoning"] = true, + ["Redemption"] = true, + ["Redoubt"] = true, + ["Reflection"] = true, + ["Regeneration"] = true, + ["Regrowth"] = true, + ["Reincarnation"] = true, + ["Rejuvenation"] = true, + ["Relentless Strikes"] = true, + ["Remorseless"] = true, + ["Remorseless Attacks"] = true, + ["Remove Curse"] = true, + ["Remove Insignia"] = true, + ["Remove Lesser Curse"] = true, + ["Rend"] = true, + ["Renew"] = true, + ["Repentance"] = true, + ["Resurrection"] = true, + ["Retaliation"] = true, + ["Retribution Aura"] = true, + ["Revenge Stun"] = true, + ["Revenge"] = true, + ["Reverberation"] = true, + ["Revive Pet"] = true, + ["Righteous Fury"] = true, + ["Rip"] = true, + ["Riposte"] = true, + ["Ritual of Doom Effect"] = true, + ["Ritual of Doom"] = true, + ["Ritual of Summoning"] = true, + ["Rockbiter Weapon"] = true, + ["Rogue Passive"] = true, + ["Rough Sharpening Stone"] = true, + ["Ruin"] = true, + ["Rupture"] = true, + ["Ruthlessness"] = true, + ["Sacrifice"] = true, + ["Safe Fall"] = true, + ["Sanctity Aura"] = true, + ["Sap"] = true, + ["Savage Fury"] = true, + ["Savage Strikes"] = true, + ["Scare Beast"] = true, + ["Scatter Shot"] = true, + ["Scorch"] = true, + ["Scorpid Poison"] = true, + ["Scorpid Sting"] = true, + ["Screech"] = true, + ["Seal Fate"] = true, + ["Seal of Command"] = true, + ["Seal of Justice"] = true, + ["Seal of Light"] = true, + ["Seal of Righteousness"] = true, + ["Seal of Wisdom"] = true, + ["Seal of the Crusader"] = true, + ["Searing Light"] = true, + ["Searing Pain"] = true, + ["Searing Totem"] = true, + ["Seduction"] = true, + ["Sense Demons"] = true, + ["Sense Undead"] = true, + ["Sentry Totem"] = true, + ["Serpent Sting"] = true, + ["Setup"] = true, + ["Shackle Undead"] = true, + ["Shadow Affinity"] = true, + ["Shadow Bolt"] = true, + ["Shadow Focus"] = true, + ["Shadow Mastery"] = true, + ["Shadow Protection"] = true, + ["Shadow Reach"] = true, + ["Shadow Resistance Aura"] = true, + ["Shadow Resistance"] = true, + ["Shadow Trance"] = true, + ["Shadow Vulnerability"] = true, + ["Shadow Ward"] = true, + ["Shadow Weaving"] = true, + ["Shadow Word: Pain"] = true, + ["Shadowburn"] = true, + ["Shadowform"] = true, + ["Shadowguard"] = true, + ["Shadowmeld Passive"] = true, + ["Shadowmeld"] = true, + ["Sharpened Claws"] = true, + ["Shatter"] = true, + ["Sheep"] = true, + ["Shell Shield"] = true, + ["Shield Bash"] = true, + ["Shield Bash - Silenced"] = true, + ["Shield Block"] = true, + ["Shield Slam"] = true, + ["Shield Specialization"] = true, + ["Shield Wall"] = true, + ["Shield"] = true, + ["Shoot Bow"] = true, + ["Shoot Crossbow"] = true, + ["Shoot Gun"] = true, + ["Shoot"] = true, + ["Shred"] = true, + ["Silence"] = true, + ["Silent Resolve"] = true, + ["Sinister Strike"] = true, + ["Siphon Life"] = true, + ["Skinning"] = true, + ["Slam"] = true, + ["Sleep"] = true, + ["Slice and Dice"] = true, + ["Slow Fall"] = true, + ["Smelting"] = true, + ["Smite"] = true, + ["Solid Sharpening Stone"] = true, + ["Soothe Animal"] = true, + ["Soothing Kiss"] = true, + ["Soul Fire"] = true, + ["Soul Link"] = true, + ["Soul Siphon"] = true, + ["Soulstone Resurrection"] = true, + ["Spell Lock"] = true, + ["Spell Warding"] = true, + ["Spirit Bond"] = true, + ["Spirit Tap"] = true, + ["Spirit of Redemption"] = true, + ["Spiritual Focus"] = true, + ["Spiritual Guidance"] = true, + ["Spiritual Healing"] = true, + ["Sprint"] = true, + ["Starfire"] = true, + ["Starfire Stun"] = true, + ["Starshards"] = true, + ["Staves"] = true, + ["Stealth"] = true, + ["Stoneclaw Totem"] = true, + ["Stoneform"] = true, + ["Stoneskin Totem"] = true, + ["Stormstrike"] = true, + ["Strength of Earth Totem"] = true, + ["Stuck"] = true, + ["Subtlety"] = true, + ["Suffering"] = true, + ["Summon Charger"] = true, + ["Summon Dreadsteed"] = true, + ["Summon Felhunter"] = true, + ["Summon Felsteed"] = true, + ["Summon Imp"] = true, + ["Summon Succubus"] = true, + ["Summon Voidwalker"] = true, + ["Summon Warhorse"] = true, + ["Sunder Armor"] = true, + ["Suppression"] = true, + ["Surefooted"] = true, + ["Survivalist"] = true, + ["Sweeping Strikes"] = true, + ["Swiftmend"] = true, + ["Swipe"] = true, + ["Sword Specialization"] = true, + ["Tactical Mastery"] = true, + ["Tainted Blood"] = true, + ["Tailoring"] = true, + ["Tame Beast"] = true, + ["Tamed Pet Passive"] = true, + ["Taunt"] = true, + ["Teleport: Darnassus"] = true, + ["Teleport: Ironforge"] = true, + ["Teleport: Moonglade"] = true, + ["Teleport: Orgrimmar"] = true, + ["Teleport: Stormwind"] = true, + ["Teleport: Thunder Bluff"] = true, + ["Teleport: Undercity"] = true, + ["The Human Spirit"] = true, + ["Thick Hide"] = true, + ["Thorns"] = true, + ["Throw"] = true, + ["Throwing Specialization"] = true, + ["Throwing Weapon Specialization"] = true, + ["Thrown"] = true, + ["Thunder Clap"] = true, + ["Thundering Strikes"] = true, + ["Thunderstomp"] = true, + ["Tidal Focus"] = true, + ["Tidal Mastery"] = true, + ["Tiger Riding"] = true, + ["Tiger's Fury"] = true, + ["Torment"] = true, + ["Totem"] = true, + ["Totemic Focus"] = true, + ["Touch of Weakness"] = true, + ["Toughness"] = true, + ["Track Beasts"] = true, + ["Track Demons"] = true, + ["Track Dragonkin"] = true, + ["Track Elementals"] = true, + ["Track Giants"] = true, + ["Track Hidden"] = true, + ["Track Humanoids"] = true, + ["Track Undead"] = true, + ["Tranquil Air Totem"] = true, + ["Tranquil Spirit"] = true, + ["Tranquility"] = true, + ["Tranquilizing Shot"] = true, + ["Trap Mastery"] = true, + ["Travel Form"] = true, + ["Tremor Totem"] = true, + ["Tribal Leatherworking"] = true, + ["Trueshot Aura"] = true, + ["Turn Undead"] = true, + ["Two-Handed Axes and Maces"] = true, + ["Two-Handed Axes"] = true, + ["Two-Handed Maces"] = true, + ["Two-Handed Swords"] = true, + ["Two-Handed Weapon Specialization"] = true, + ["Unarmed"] = true, + ["Unbreakable Will"] = true, + ["Unbridled Wrath Effect"] = true, + ["Unbridled Wrath"] = true, + ["Undead Horsemanship"] = true, + ["Underwater Breathing"] = true, + ["Unending Breath"] = true, + ["Unholy Power"] = true, + ["Unleashed Fury"] = true, + ["Unyielding Faith"] = true, + ["Vampiric Embrace"] = true, + ["Vanish"] = true, + ["Vanished"] = true, + ["Vengeance"] = true, + ["Vigor"] = true, + ["Vile Poisons"] = true, + ["Vindication"] = true, + ["Viper Sting"] = true, + ["Volley"] = true, + ["Wand Specialization"] = true, + ["Wands"] = true, + ["War Stomp"] = true, + ["Water Breathing"] = true, + ["Water Walking"] = true, + ["Weakened Soul"] = true, + ["Weaponsmith"] = true, + ["Whirlwind"] = true, + ["Will of the Forsaken"] = true, + ["Windfury Totem"] = true, + ["Windfury Weapon"] = true, + ["Windwall Totem"] = true, + ["Wing Clip"] = true, + ["Winter's Chill"] = true, + ["Wisp Spirit"] = true, + ["Wolf Riding"] = true, + ["Wound Poison II"] = true, + ["Wound Poison III"] = true, + ["Wound Poison IV"] = true, + ["Wound Poison"] = true, + ["Wrath"] = true, + ["Wyvern Sting"] = true, + } +end) + +BabbleSpell:RegisterTranslations("deDE", function() + return { + ["Abolish Disease"] = "Krankheit aufheben", + ["Abolish Poison Effect"] = "Vergiftung aufheben - Effekt", + ["Abolish Poison"] = "Vergiftung aufheben", + ["Activate MG Turret"] = "MG-Turm aktivieren", + ["Adrenaline Rush"] = "Adrenalinrausch", + ["Aftermath"] = "Nachwirkung", + ["Aggression"] = "Aggression", + ["Aimed Shot"] = "Gezielter Schuss", + ["Alchemy"] = "Alchimie", + ["Ambush"] = "Hinterhalt", + ["Amplify Curse"] = "Fluch verst\195\164rken", + ["Amplify Magic"] = "Magie verst\195\164rken", + ["Ancestral Fortitude"] = "Seelenstrke der Ahnen", + ["Ancestral Healing"] = "Heilung der Ahnen", + ["Ancestral Knowledge"] = "Wissen der Ahnen", + ["Ancestral Spirit"] = "Geist der Ahnen", + ["Anger Management"] = "Aggressionskontrolle", + ["Anticipation"] = "Vorahnung", + ["Aquatic Form"] = "Wassergestalt", + ["Arcane Brilliance"] = "Arkane Brillanz", + ["Arcane Concentration"] = "Arkane Konzentration", + ["Arcane Explosion"] = "Arkane Explosion", + ["Arcane Focus"] = "Arkaner Fokus", + ["Arcane Instability"] = "Arkane Instabilit\195\164t", + ["Arcane Intellect"] = "Arkane Intelligenz", + ["Arcane Meditation"] = "Arkane Meditation", + ["Arcane Mind"] = "Arkaner Geist", + ["Arcane Missiles"] = "Arkane Geschosse", + ["Arcane Power"] = "Arkane Macht", + ["Arcane Resistance"] = "Arkanwiderstand", + ["Arcane Shot"] = "Arkaner Schuss", + ["Arcane Subtlety"] = "Arkanes Feingef\195\188hl", + ["Arctic Reach"] = "Arktische Reichweite", + ["Armorsmith"] = "R\195\188stungsschmied", + ["Aspect of the Beast"] = "Aspekt des Wildtiers", + ["Aspect of the Cheetah"] = "Aspekt des Geparden", + ["Aspect of the Hawk"] = "Aspekt des Falken", + ["Aspect of the Monkey"] = "Aspekt des Affen", + ["Aspect of the Pack"] = "Aspekt des Rudels", + ["Aspect of the Wild"] = "Aspekt der Wildnis", + ["Astral Recall"] = "Astraler R\195\188ckruf", + ["Attack"] = "Angreifen", + ["Attacking"] = "Angreifen", + ["Auto Shot"] = "Autom. Schuss", + ["Axe Specialization"] = "Axt-Spezialisierung", + ["Backstab"] = "Meucheln", + ["Bane"] = "Dunkle Macht", + ["Banish"] = "Verbannen", + ["Barkskin Effect"] = "Baumrindeneffekt", + ["Barkskin"] = "Baumrinde", + ["Barrage"] = "Sperrfeuer", + ["Bash"] = "Hieb", + ["Basic Campfire"] = "Einfaches Lagerfeuer", + ["Battle Shout"] = "Schlachtruf", + ["Battle Stance Passive"] = "Kampfhaltung Passiv", + ["Battle Stance"] = "Kampfhaltung", + ["Bear Form"] = "B\195\164rengestalt", + ["Beast Lore"] = "Wildtierkunde", + ["Beast Slaying"] = "Wildtierschl\195\164chter", + ["Beast Training"] = "Wildtierausbildung", + ["Benediction"] = "Segnung", + ["Berserker Rage"] = "Berserkerwut", + ["Berserker Stance Passive"] = "Berserkerhaltung - Passiv", + ["Berserker Stance"] = "Berserkerhaltung", + ["Berserking"] = "Berserker", + ["Bestial Discipline"] = "Wildtierdisziplin", + ["Bestial Swiftness"] = "Erh\195\182hte Tiergeschwindigkeit", + ["Bestial Wrath"] = "Zorn des Wildtiers", + ["Bite"] = "Bei\195\159en", + ["Black Arrow"] = "Schwarzer Pfeil", + ["Blackout"] = "Verdunkelung", + ["Blacksmithing"] = "Schmiedekunst", + ["Blade Flurry"] = "Klingenwirbel", + ["Blast Wave"] = "Druckwelle", + ["Blessed Recovery"] = "Gesegnete Erholung", + ["Blessing of Freedom"] = "Segen der Freiheit", + ["Blessing of Kings"] = "Segen der K\195\182nige", + ["Blessing of Light"] = "Segen des Lichts", + ["Blessing of Might"] = "Segen der Macht", + ["Blessing of Protection"] = "Segen des Schutzes", + ["Blessing of Sacrifice"] = "Segen der Opferung", + ["Blessing of Salvation"] = "Segen der Rettung", + ["Blessing of Sanctuary"] = "Segen des Refugiums", + ["Blessing of Wisdom"] = "Segen der Weisheit", + ["Blind"] = "Blenden", + ["Blinding Powder"] = "Blendungspulver", + ["Blink"] = "Blinzeln", + ["Blizzard"] = "Blizzard", + ["Block"] = "Blocken", + ["Blood Craze"] = "Blutwahnsinn", + ["Blood Frenzy"] = "Blutraserei", + ["Blood Fury"] = "Kochendes Blut", + ["Blood Pact"] = "Blutpakt", + ["Bloodrage"] = "Blutrausch", + ["Bloodthirst"] = "Blutdurst", + ["Booming Voice"] = "Donnernde Stimme", + ["Bow Specialization"] = "Bogenspezialisierung", + ["Bows"] = "Bogen", + ["Bright Campfire"] = "Helles Lagerfeuer", + ["Brutal Impact"] = "Brutaler Hieb", + ["Burning Soul"] = "Brennende Seele", + ["Call Pet"] = "Tier rufen", + ["Call of Flame"] = "Ruf der Flamme", + ["Call of Thunder"] = "Ruf des Donners", + ["Camouflage"] = "Tarnung", + ["Cannibalize"] = "Kannibalismus", + ["Cat Form"] = "Katzengestalt", + ["Cataclysm"] = "Katastrophe", + ["Chain Heal"] = "Kettenheilung", + ["Chain Lightning"] = "Kettenblitzschlag", + ["Challenging Roar"] = "Herausforderndes Gebr\195\188ll", + ["Challenging Shout"] = "Herausforderungsruf", + ["Charge Rage Bonus Effect"] = "Wut-Aufladung-Bonus-Effekt", + ["Charge"] = "Sturmangriff", + ["Charge Stun"] = "Sturmangriffsbetubung", + ["Cheap Shot"] = "Fieser Trick", + ["Chilled"] = "K\195\164lte", + ["Claw"] = "Klaue", + ["Cleanse"] = "Reinigung des Glaubens", + ["Clearcasting"] = "Freizaubern", + ["Cleave"] = "Spalten", + ["Clever Traps"] = "Falleneffizienz", + ["Closing"] = "Schlie\195\159en", + ["Cloth"] = "Stoff", + ["Cobra Reflexes"] = "Kobrareflexe", + ["Cold Blood"] = "Kaltbl\195\188tigkeit", + ["Cold Snap"] = "K\195\164lteeinbruch", + ["Combat Endurance"] = "Durchhalteverm\195\182gen des K\195\164mpfers", + ["Combustion"] = "Verbrennung", + ["Command"] = "Befehlsgewalt", + ["Concentration Aura"] = "Aura der Konzentration", + ["Concussion Blow"] = "Ersch\195\188tternder Schlag", + ["Concussion"] = "Ersch\195\188tterung", + ["Concussive Shot"] = "Ersch\195\188tternder Schuss", + ["Cone of Cold"] = "K\195\164ltekegel", + ["Conflagrate"] = "Feuersbrunst", + ["Conjure Food"] = "Essen herbeizaubern", + ["Conjure Mana Agate"] = "Mana-Achat herbeizaubern", + ["Conjure Mana Citrine"] = "Mana-Citrin herbeizaubern", + ["Conjure Mana Jade"] = "Mana-Jadestein herbeizaubern", + ["Conjure Mana Ruby"] = "Mana-Rubin herbeizaubern", + ["Conjure Water"] = "Wasser herbeizaubern", + ["Consecration"] = "Weihe", + ["Consume Shadows"] = "Schatten verzehren", + ["Convection"] = "Konvektion", + ["Conviction"] = "\195\156berzeugung", + ["Cooking"] = "Kochkunst", + ["Corruption"] = "Verderbnis", + ["Counterattack"] = "Gegenangriff", + ["Counterspell"] = "Gegenzauber", + ["Counterspell - Silenced"] = "Gegenzauber - zum Schweigen gebracht", + ["Cower"] = "Ducken", + ["Create Firestone"] = "Feuerstein herstellen", + ["Create Firestone (Major)"] = "Feuerstein herstellen (Gro\195\159er)", + ["Create Firestone (Greater)"] = "Feuerstein herstellen (Gr\195\182\sser)", + ["Create Firestone (Lesser)"] = "Feuerstein herstellen (Kleiner)", + ["Create Healthstone"] = "Gesundheitsstein herstellen", + ["Create Healthstone (Major)"] = "Gesundheitsstein herstellen (Gro\195\159er)", + ["Create Healthstone (Greater)"] = "Gesundheitsstein herstellen (Gr\195\182\sser)", + ["Create Healthstone (Lesser)"] = "Gesundheitsstein herstellen (Kleiner)", + ["Create Healthstone (Minor)"] = "Gesundheitsstein herstellen (Klein)", + ["Create Soulstone"] = "Seelenstein herstellen", + ["Create Soulstone (Major)"] = "Seelenstein herstellen (Gro\195\159er)", + ["Create Soulstone (Greater)"] = "Seelenstein herstellen (Gr\195\182\sser)", + ["Create Soulstone (Lesser)"] = "Seelenstein herstellen (Kleiner)", + ["Create Soulstone (Minor)"] = "Seelenstein herstellen (Klein)", + ["Create Spellstone"] = "Zauberstein herstellen", + ["Create Spellstone (Major)"] = "Zauberstein herstellen (Gro\195\159er)", + ["Create Spellstone (Greater)"] = "Zauberstein herstellen (Gr\195\182\sser)", + ["Crippling Poison II"] = "Verkr\195\188ppelndes Gift II", + ["Crippling Poison"] = "Verkr\195\188ppelndes Gift", + ["Critical Mass"] = "Kritische Masse", + ["Crossbows"] = "Armbr\195\188ste", + ["Cruelty"] = "Grausamkeit", + ["Cultivation"] = "Gr\195\188ner Daumen", + ["Cure Disease"] = "Krankheit heilen", + ["Cure Poison"] = "Vergiftung heilen", + ["Curse of Agony"] = "Fluch der Pein", + ["Curse of Doom Effect"] = "Fluch der Verdammnis'-Effekt", + ["Curse of Doom"] = "Fluch der Verdammnis", + ["Curse of Exhaustion"] = "Fluch der Ersch\195\182pfung", + ["Curse of Idiocy"] = "Fluch der Torheit", + ["Curse of Recklessness"] = "Fluch der Tollk\195\188hnheit", + ["Curse of Shadow"] = "Fluch der Schatten", + ["Curse of Tongues"] = "Fluch der Sprachen", + ["Curse of Weakness"] = "Fluch der Schw\195\164che", + ["Curse of the Elements"] = "Fluch der Elemente", + ["Dagger Specialization"] = "Dolch-Spezialisierung", + ["Daggers"] = "Dolche", + ["Dampen Magic"] = "Magie d\195\164mpfen", + ["Dark Pact"] = "Dunkler Pakt", + ["Darkness"] = "Dunkelheit", + ["Dash"] = "Spurt", + ["Deadly Poison II"] = "T\195\182dliches Gift II", + ["Deadly Poison III"] = "T\195\182dliches Gift III", + ["Deadly Poison IV"] = "T\195\182dliches Gift IV", + ["Deadly Poison V"] = "T\195\182dliches Gift V", + ["Deadly Poison"] = "T\195\182dliches Gift", + ["Death Coil"] = "Todesmantel", + ["Death Wish"] = "Todeswunsch", + ["Deep Wounds"] = "Tiefe Wunden", + ["Defense"] = "Verteidigung", + ["Defensive Stance Passive"] = "Verteidigungshaltung - Passiv", + ["Defensive Stance"] = "Verteidigungshaltung", + ["Defensive State 2"] = "Verteidigungsstatus 2", + ["Defensive State"] = "Verteidigungsstatus", + ["Defiance"] = "Trotz", + ["Deflection"] = "Abwehr", + ["Demon Armor"] = "D\195\164monenr\195\188stung", + ["Demon Skin"] = "D\195\164monenhaut", + ["Demonic Embrace"] = "D\195\164monische Umarmung", + ["Demonic Sacrifice"] = "D\195\164monische Opferung", + ["Demoralizing Roar"] = "Demoralisierendes Gebr\195\188ll", + ["Demoralizing Shout"] = "Demoralisierungsruf", + ["Desperate Prayer"] = "Verzweifeltes Gebet", + ["Destructive Reach"] = "Zerst\195\182rerische Reichweite", + ["Detect Greater Invisibility"] = "Gro\195\159e Unsichtbarkeit entdecken", + ["Detect Invisibility"] = "Unsichtbarkeit entdecken", + ["Detect Lesser Invisibility"] = "Geringe Unsichtbarkeit entdecken", + ["Detect Magic"] = "Magie entdecken", + ["Detect Traps"] = "Fallen entdecken", + ["Detect"] = "Entdecken", + ["Deterrence"] = "Abschreckung", + ["Devastation"] = "Verw\195\188stung", + ["Devotion Aura"] = "Aura der Hingabe", + ["Devour Magic Effect"] = "Magie verschlingen' - Effekt", + ["Devour Magic"] = "Magie verschlingen", + ["Devouring Plague"] = "Verschlingende Seuche", + ["Diplomacy"] = "Diplomatie", + ["Dire Bear Form"] = "Terrorb\195\164rengestalt", + ["Disarm Trap"] = "Falle entsch\195\164rfen", + ["Disarm"] = "Entwaffnen", + ["Disease Cleansing Totem"] = "Totem der Krankheitsreinigung", + ["Disenchant"] = "Entzaubern", + ["Disengage"] = "R\195\188ckzug", + ["Dismiss Pet"] = "Tier freigeben", + ["Dispel Magic"] = "Magiebannung", + ["Distract"] = "Ablenken", + ["Distracting Shot"] = "Ablenkender Schuss", + ["Dive"] = "Sturzflug", + ["Divine Favor"] = "G\195\182ttliche Gunst", + ["Divine Fury"] = "G\195\182ttlicher Furor", + ["Divine Intellect"] = "G\195\182ttliche Weisheit", + ["Divine Intervention"] = "G\195\182ttliches Eingreifen", + ["Divine Protection"] = "G\195\182ttlicher Schutz", + ["Divine Shield"] = "Gottesschild", + ["Divine Spirit"] = "G\195\182ttlicher Willen", + ["Divine Strength"] = "G\195\182ttliche St\195\164rke", + ["Dodge"] = "Ausweichen", + ["Dragonscale Leatherworking"] = "Drachenschuppenlederverarbeitung", + ["Drain Life"] = "Blutsauger", + ["Drain Mana"] = "Mana entziehen", + ["Drain Soul"] = "Seelendieb", + ["Drink"] = "Trinken", + ["Dual Wield Specialization"] = "Beidh\195\164ndigkeits-Spezialisierung", + ["Dual Wield"] = "Beidh\195\164ndigkeit", + ["Duel"] = "Duell", + ["Eagle Eye"] = "Adlerauge", + ["Earth Shock"] = "Erdschock", + ["Earthbind Totem"] = "Totem der Erdbindung", + ["Efficiency"] = "Effizienz", + ["Elemental Focus"] = "Elementarfokus", + ["Elemental Fury"] = "Elementarfuror", + ["Elemental Leatherworking"] = "Elementarlederverarbeitung", + ["Elemental Mastery"] = "Elementarbeherrschung", + ["Elune's Grace"] = "Elunes Anmut", + ["Elusiveness"] = "Fl\195\188chtigkeit", + ["Emberstorm"] = "Glutsturm", + ["Enamored Water Spirit"] = "Entzckter Wassergeist", + ["Enchanting"] = "Verzauberkunst", + ["Endurance Training"] = "Belastbarkeit-Ausbildung", + ["Endurance"] = "Durchhalteverm\195\182gen", + ["Engineering Specialization"] = "Technologist", + ["Engineering"] = "Ingenieurskunst", + ["Enrage"] = "Wutanfall", + ["Enriched Manna Biscuit"] = "Angereicherter Manakeks", + ["Enslave Demon"] = "D\195\164monensklave", + ["Entangling Roots"] = "Wucherwurzeln", + ["Entrapment"] = "Einfangen", + ["Escape Artist"] = "Entfesselungsk\195\188nstler", + ["Evasion"] = "Entrinnen", + ["Eventide"] = "Abendzeit", + ["Eviscerate"] = "Ausweiden", + ["Evocation"] = "Hervorrufung", + ["Execute"] = "Hinrichten", + ["Exorcism"] = "Exorzismus", + ["Expansive Mind"] = "Wacher Geist", + ["Explosive Trap Effect"] = "Sprengfalle'-Effekt", + ["Explosive Trap"] = "Sprengfalle", + ["Expose Armor"] = "R\195\188stung schw\195\164chen", + ["Eye for an Eye"] = "Auge um Auge", + ["Eye of Kilrogg"] = "Auge von Kilrogg", + ["Eyes of the Beast"] = "Augen des Wildtiers", + ["Fade"] = "Verblassen", + ["Faerie Fire"] = "Feenfeuer", + ["Faerie Fire (Feral)"] = "Feenfeuer (Tiergestalt)", + ["Far Sight"] = "Fernsicht", + ["Fear Ward"] = "Furchtzauberschutz", + ["Fear"] = "Furcht", + ["Feed Pet"] = "Tier f\195\188ttern", + ["Feedback"] = "R\195\188ckkopplung", + ["Feign Death"] = "Totstellen", + ["Feint"] = "Finte", + ["Fel Concentration"] = "Teufelskonzentration", + ["Fel Domination"] = "Teufelsbeherrschung", + ["Fel Intellect"] = "Teufelsintelligenz", + ["Fel Stamina"] = "Teufelsausdauer", + ["Felfire"] = "Teufelsfeuer", + ["Feline Grace"] = "Katzenhafte Anmut", + ["Feline Swiftness"] = "Katzenhafte Schnelligkeit", + ["Feral Aggression"] = "Wilde Aggression", + ["Feral Charge"] = "Wilde Attacke", + ["Feral Instinct"] = "Instinkt der Wildnis", + ["Ferocious Bite"] = "Wilder Biss", + ["Ferocity"] = "Wildheit", + ["Fetish"] = "Fetisch", + ["Find Herbs"] = "Kr\195\164utersuche", + ["Find Minerals"] = "Mineraliensuche", + ["Find Treasure"] = "Schatzsucher", + ["Fire Blast"] = "Feuerschlag", + ["Fire Nova Totem"] = "Totem der Feuernova", + ["Fire Power"] = "Feuermacht", + ["Fire Resistance Aura"] = "Aura des Feuerwiderstands", + ["Fire Resistance Totem"] = "Totem des Feuerwiderstands", + ["Fire Resistance"] = "Feuerwiderstand", + ["Fire Shield"] = "Feuerschild", + ["Fire Vulnerability"] = "Feuerverwundbarkeit", + ["Fire Ward"] = "Feuerzauberschutz", + ["Fireball"] = "Feuerball", + ["Firebolt"] = "Feuerblitz", + ["First Aid"] = "Erste Hilfe", + ["Fishing Poles"] = "Angeln", + ["Fishing"] = "Angeln", + ["Fist Weapon Specialization"] = "Faustwaffen-Spezialisierung", + ["Fist Weapons"] = "Faustwaffen", + ["Flame Shock"] = "Flammenschock", + ["Flame Throwing"] = "Flammenwerfen", + ["Flamestrike"] = "Flammensto\195\159", + ["Flamethrower"] = "Flammenwerfer", + ["Flametongue Totem"] = "Totem der Flammenzunge", + ["Flametongue Weapon"] = "Waffe der Flammenzunge", + ["Flare"] = "Leuchtfeuer", + ["Flash Heal"] = "Blitzheilung", + ["Flash of Light"] = "Lichtblitz", + ["Flurry"] = "Schlaghagel", + ["Focused Casting"] = "Fokussiertes Zauberwirken", + ["Food"] = "Essen", + ["Forbearance"] = "Vorahnung", + ["Force of Will"] = "Macht des Willens", + ["Freezing Trap Effect"] = "Eisk?tefalle", + ["Freezing Trap"] = "Eisk\195\164ltefalle", + ["Frenzied Regeneration"] = "Rasende Regeneration", + ["Frenzy"] = "Raserei", + ["Frost Armor"] = "Frostr\195\188stung", + ["Frost Channeling"] = "Frost-Kanalisierung", + ["Frost Nova"] = "Frostnova", + ["Frost Resistance Aura"] = "Aura des Frostwiderstands", + ["Frost Resistance Totem"] = "Totem des Frostwiderstands", + ["Frost Resistance"] = "Frostwiderstand", + ["Frost Shock"] = "Frostschock", + ["Frost Trap"] = "Frostfalle", + ["Frost Trap Aura"] = "Frostfalle-Aura", + ["Frost Ward"] = "Frostzauberschutz", + ["Frostbite"] = "Erfrierung", + ["Frostbolt"] = "Frostblitz", + ["Frostbrand Weapon"] = "Waffe des Frostbrands", + ["Furious Howl"] = "Wutgeheul", + ["Furor"] = "Furor", + ["Garrote"] = "Erdrosseln", + ["Generic"] = "Allgemein", + ["Ghost Wolf"] = "Geisterwolf", + ["Ghostly Strike"] = "Geisterhafter Sto\195\159", + ["Gift of Nature"] = "Geschenk der Natur", + ["Gift of the Wild"] = "Gabe der Wildnis", + ["Gouge"] = "Solarplexus", + ["Grace of Air Totem"] = "Totem der luftgleichen Anmut", + ["Great Stamina"] = "Gro\195\159e Ausdauer", + ["Greater Blessing of Kings"] = "Gro\195\159er Segen der K\195\182nige", + ["Greater Blessing of Light"] = "Gro\195\159er Segen des Lichts", + ["Greater Blessing of Might"] = "Gro\195\159er Segen der Macht", + ["Greater Blessing of Salvation"] = "Gro\195\159er Segen der Rettung", + ["Greater Blessing of Sanctuary"] = "Gro\195\159er Segen des Refugiums", + ["Greater Blessing of Wisdom"] = "Gro\195\159er Segen der Weisheit", + ["Greater Heal"] = "Gro\195\159e Heilung", + ["Grim Reach"] = "Grimmige Reichweite", + ["Grounding Totem"] = "Totem der Erdung", + ["Grovel"] = "Kriechen", + ["Growl"] = "Knurren", + ["Guardian's Favor"] = "Gunst des H\195\188ters", + ["Gun Specialization"] = "Schusswaffenspezialisierung", + ["Guns"] = "Schusswaffen", + ["Hammer of Justice"] = "Hammer der Gerechtigkeit", + ["Hammer of Wrath"] = "Hammer des Zorns", + ["Hamstring"] = "Kniesehne", + ["Harass"] = "Bel\195\164stigen", + ["Hardiness"] = "Z\195\164higkeit", + ["Hawk Eye"] = "Falkenauge", + ["Heal"] = "Heilen", + ["Healing Focus"] = "Heilfokus", + ["Healing Light"] = "Heilendes Licht", + ["Healing Stream Totem"] = "Totem des heilenden Flusses", + ["Healing Touch"] = "Heilende Ber\195\188hrung", + ["Healing Wave"] = "Welle der Heilung", +-- ["Healing Way"] = true, + ["Health Funnel"] = "Lebenslinie", + ["Heart of the Wild"] = "Herz der Wildnis", + ["Hellfire Effect"] = "H\195\182llenfeuer - Effekt", + ["Hellfire"] = "H\195\182llenfeuer", + ["Hemorrhage"] = "Blutsturz", + ["Herbalism"] = "Kr\195\164utersammeln", + ["Heroic Strike"] = "Heldenhafter Sto\195\159", + ["Hex of Weakness"] = "Verhexung der Schw\195\164che", + ["Hibernate"] = "Winterschlaf", + ["Holy Fire"] = "Heiliges Feuer", + ["Holy Light"] = "Heiliges Licht", + ["Holy Nova"] = "Heilige Nova", + ["Holy Power"] = "Heilige Macht", + ["Holy Reach"] = "Heilige Reichweite", + ["Holy Shield"] = "Heiliger Schild", + ["Holy Shock"] = "Heiliger Schock", + ["Holy Specialization"] = "Macht des Glaubens", + ["Holy Wrath"] = "Heiliger Zorn", + ["Honorless Target"] = "Ehrenloses Ziel", + ["Horse Riding"] = "Pferdreiten", + ["Howl of Terror"] = "Schreckgeheul", + ["Humanoid Slaying"] = "Humanoident\195\182ten", + ["Hunter's Mark"] = "Mal des J\195\164gers", + ["Hurricane"] = "Hurrikan", + ["Ice Armor"] = "Eisr\195\188stung", + ["Ice Barrier"] = "Eis-Barriere", + ["Ice Block"] = "Eisblock", + ["Ice Shards"] = "Eissplitter", + ["Ignite"] = "Entz\195\188nden", + ["Illumination"] = "Illumination", + ["Immolate"] = "Feuerbrand", + ["Immolation Trap Effect"] = "Feuerbrandfalle", + ["Immolation Trap"] = "Feuerbrandfalle", + ["Impact"] = "Einschlag", + ["Impale"] = "Durchbohren", + ["Improved Ambush"] = "Verbesserter Hinterhalt", + ["Improved Arcane Explosion"] = "Verbesserte Arkane Explosion", + ["Improved Arcane Missiles"] = "Verbesserte arkane Geschosse", + ["Improved Arcane Shot"] = "Verbesserter Arkaner Schuss", + ["Improved Aspect of the Hawk"] = "Verbesserter Aspekt des Falken", + ["Improved Aspect of the Monkey"] = "Verbesserter Aspekt des Affen", + ["Improved Backstab"] = "Verbessertes Meucheln", + ["Improved Battle Shout"] = "Verbesserter Schlachtruf", + ["Improved Berserker Rage"] = "Verbesserte Berserkerwut", + ["Improved Blessing of Might"] = "Verbesserter Segen der Macht", + ["Improved Blessing of Wisdom"] = "Verbesserter Segen der Weisheit", + ["Improved Blizzard"] = "Verbesserter Blizzard", + ["Improved Bloodrage"] = "Verbesserter Blutrausch", + ["Improved Chain Heal"] = "Verbesserte Kettenheilung", + ["Improved Chain Lightning"] = "Verbesserter Kettenblitzschlag", + ["Improved Challenging Shout"] = "Verbesserter Herausforderungsruf", + ["Improved Charge"] = "Verbesserter Sturmangriff", + ["Improved Cheap Shot"] = "Verbesserter Fieser Trick", + ["Improved Cleave"] = "Verbessertes Spalten", + ["Improved Concentration Aura"] = "Verbesserte Aura der Konzentration", + ["Improved Concussive Shot"] = "Verbesserter Ersch\195\188tternder Schuss", + ["Improved Cone of Cold"] = "Verbesserter K\195\164ltekegel", + ["Improved Corruption"] = "Verbesserte Verderbnis", + ["Improved Counterspell"] = "Verbesserter Gegenzauber", + ["Improved Curse of Agony"] = "Verbesserter Fluch der Pein", + ["Improved Curse of Exhaustion"] = "Verbesserter Fluch der Ersch\195\182pfung", + ["Improved Curse of Weakness"] = "Verbesserter Fluch der Schw\195\164che", + ["Improved Dampen Magic"] = "Verbesserter Magied\195\164mpfer", + ["Improved Deadly Poison"] = "Verbessertes t\195\182dliches Gift", + ["Improved Demoralizing Shout"] = "Verbesserter Demoralisierender Ruf", + ["Improved Devotion Aura"] = "Verbesserte Aura der Hingabe", + ["Improved Disarm"] = "Verbessertes Entwaffnen", + ["Improved Distract"] = "Verbessertes Ablenken", + ["Improved Drain Life"] = "Verbesserter Blutsauger", + ["Improved Drain Mana"] = "Verbessertes Mana entziehen", + ["Improved Drain Soul"] = "Verbesserter Seelendieb", + ["Improved Enrage"] = "Verbesserter Wutanfall", + ["Improved Enslave Demon"] = "Verbesserter D\195\164monensklave", + ["Improved Entangling Roots"] = "Verbesserte Wucherwurzeln", + ["Improved Evasion"] = "Verbessertes Entrinnen", + ["Improved Eviscerate"] = "Verbessertes Ausweiden", + ["Improved Execute"] = "Verbessertes Hinrichten", + ["Improved Expose Armor"] = "Verbessertes R\195\188stung schw\195\164chen", + ["Improved Eyes of the Beast"] = "Verbesserte Augen des Wildtiers", + ["Improved Fade"] = "Verbessertes Verblassen", + ["Improved Feign Death"] = "Verbessertes Totstellen", + ["Improved Fire Blast"] = "Verbesserter Feuerschlag", + ["Improved Fire Nova Totem"] = "Verbessertes Totem der Feuernova", + ["Improved Fire Ward"] = "Verbesserter Feuerzauberschutz", + ["Improved Fireball"] = "Verbesserter Feuerball", + ["Improved Firebolt"] = "Verbesserter Feuerblitz", + ["Improved Firestone"] = "Verbesserter Feuerstein", + ["Improved Flamestrike"] = "Verbesserter Flammensto\195\159", + ["Improved Flametongue Weapon"] = "Verbesserte Waffe der Flammenzunge", + ["Improved Flash of Light"] = "Verbesserter Lichtblitz", + ["Improved Frost Nova"] = "Verbesserte Frostnova", + ["Improved Frost Ward"] = "Verbesserter Frostzauberschutz", + ["Improved Frostbolt"] = "Verbesserter Frostblitz", + ["Improved Frostbrand Weapon"] = "Verbesserte Waffe des Frostbrands", + ["Improved Garrote"] = "Verbessertes Erdrosseln", + ["Improved Ghost Wolf"] = "Verbesserter Geisterwolf", + ["Improved Gouge"] = "Verbesserter Solarplexus", + ["Improved Grace of Air Totem"] = "Verbessertes Totem der luftgleichen Anmut", + ["Improved Grounding Totem"] = "Verbessertes Totem der Erdung", + ["Improved Hammer of Justice"] = "Verbesserter Hammer der Gerechtigkeit", + ["Improved Hamstring"] = "Verbesserte Kniesehne", + ["Improved Healing Stream Totem"] = "Verbessertes Totem des heilenden Flusses", + ["Improved Healing Touch"] = "Verbesserte Heilende Ber\195\188hrung", + ["Improved Healing Wave"] = "Verbesserte Welle der Heilung", + ["Improved Healing"] = "Verbesserte Heilung", + ["Improved Health Funnel"] = "Verbesserte Lebenslinie", + ["Improved Healthstone"] = "Verbesserter Gesundheitsstein", + ["Improved Heroic Strike"] = "Verbesserter Heldenhafter Sto\195\159", + ["Improved Hunter's Mark"] = "Verbessertes Mal des J\195\164gers", + ["Improved Immolate"] = "Verbesserter Feuerbrand", + ["Improved Imp"] = "Verbesserter Wichtel", + ["Improved Inner Fire"] = "Verbessertes Inneres Feuer", + ["Improved Instant Poison"] = "Verbessertes sofort wirkendes Gift", + ["Improved Intercept"] = "Verbessertes Abfangen", + ["Improved Intimidating Shout"] = "Verbesserter Drohruf", + ["Improved Judgement"] = "Verbessertes Richturteil", + ["Improved Kick"] = "Verbesserter Tritt", + ["Improved Kidney Shot"] = "Verbesserter Nierenhieb", + ["Improved Lash of Pain"] = "Verbesserte Schmerzenspeitsche", + ["Improved Lay on Hands"] = "Verbesserte Handauflegung", + ["Improved Lesser Healing Wave"] = "Verbesserte Geringe Welle der Heilung", + ["Improved Life Tap"] = "Verbesserter Aderlass", + ["Improved Lightning Bolt"] = "Verbesserter Blitzschlag", + ["Improved Lightning Shield"] = "Verbesserter Blitzschlag-Schild", + ["Improved Magma Totem"] = "Verbessertes Totem der gl\195\188henden Magma", + ["Improved Mana Burn"] = "Verbesserter Manabrand", + ["Improved Mana Shield"] = "Verbesserter Manaschild", + ["Improved Mana Spring Totem"] = "Verbessertes Totem der Manaquelle", + ["Improved Mark of the Wild"] = "Verbessertes Mal der Wildnis", + ["Improved Mend Pet"] = "Verbessertes Tier heilen", + ["Improved Mind Blast"] = "Verbesserter Gedankenschlag", + ["Improved Moonfire"] = "Verbessertes Mondfeuer", + ["Improved Nature's Grasp"] = "Verbesserter Griff der Natur", + ["Improved Overpower"] = "Verbessertes \195\156berw\195\164ltigen", + ["Improved Power Word: Fortitude"] = "Verbessertes Machtwort: Seelenst\195\164rke", + ["Improved Power Word: Shield"] = "Verbessertes Machtwort: Schild", + ["Improved Prayer of Healing"] = "Verbessertes Gebet der Heilung", + ["Improved Psychic Scream"] = "Verbesserter Psychischer Schrei", + ["Improved Pummel"] = "Verbessertes Zuschlagen", + ["Improved Regrowth"] = "Verbessertes Nachwachsen", + ["Improved Reincarnation"] = "Verbesserte Reinkarnation", + ["Improved Rejuvenation"] = "Verbesserte Verj\195\188ngung", + ["Improved Rend"] = "Verbessertes Verwunden", + ["Improved Renew"] = "Verbesserte Erneuerung", + ["Improved Retribution Aura"] = "Verbesserte Aura der Vergeltung", + ["Improved Revenge"] = "Verbesserte Rache", + ["Improved Revive Pet"] = "Verbessertes Tier wiederbeleben", + ["Improved Righteous Fury"] = "Verbesserter Zorn der Gerechtigkeit", + ["Improved Rockbiter Weapon"] = "Verbesserte Felsbei\195\159erwaffe", + ["Improved Rupture"] = "Verbesserte Blutung", + ["Improved Sap"] = "Verbesserte Kopfnuss", + ["Improved Scorch"] = "Verbessertes Versengen", + ["Improved Scorpid Sting"] = "Verbesserter Skorpidstich", + ["Improved Seal of Righteousness"] = "Verbessertes Siegel der Rechtschaffenheit", + ["Improved Seal of the Crusader"] = "Verbessertes Siegel des Kreuzfahrers", + ["Improved Searing Pain"] = "Verbesserter Sengender Schmerz", + ["Improved Searing Totem"] = "Verbessertes Totem der Verbrennung", + ["Improved Serpent Sting"] = "Verbesserter Schlangenbiss", + ["Improved Shadow Bolt"] = "Verbesserter Schattenblitz", + ["Improved Shadow Word: Pain"] = "Verbessertes Schattenwort: Schmerz", + ["Improved Shield Bash"] = "Verbesserter Schildhieb", + ["Improved Shield Block"] = "Verbesserter Schildblock", + ["Improved Shield Wall"] = "Verbesserter Schildwall", + ["Improved Shred"] = "Verbessertes Schreddern", + ["Improved Sinister Strike"] = "Verbesserter Finsterer Sto\195\159", + ["Improved Slam"] = "Verbessertes Zerschmettern", + ["Improved Slice and Dice"] = "Verbessertes Zerh\195\164ckseln", + ["Improved Spellstone"] = "Verbesserter Zauberstein", + ["Improved Sprint"] = "Verbessertes Sprinten", + ["Improved Starfire"] = "Verbessertes Sternenfeuer", + ["Improved Stoneclaw Totem"] = "Verbessertes Totem der Steinklaue", + ["Improved Stoneskin Totem"] = "Verbessertes Totem der Steinhaut", + ["Improved Strength of Earth Totem"] = "Verbessertes Totem der Erdst\195\164rke", + ["Improved Succubus"] = "Verbesserter Sukkubus", + ["Improved Sunder Armor"] = "Verbessertes R\195\188stung zerrei\195\159en", + ["Improved Taunt"] = "Verbesserter Spott", + ["Improved Thorns"] = "Verbesserte Dornen", + ["Improved Thunder Clap"] = "Verbesserter Donnerknall", + ["Improved Tranquility"] = "Verbesserte Gelassenheit", + ["Improved Vampiric Embrace"] = "Verbesserte Vampirumarmung", + ["Improved Vanish"] = "Verbessertes Verschwinden", + ["Improved Voidwalker"] = "Verbesserter Leerwandler", + ["Improved Windfury Weapon"] = "Verbesserte Waffe des Windfurors", + ["Improved Wing Clip"] = "Verbessertes Zurechtstutzen", + ["Improved Wrath"] = "Verbesserter Zorn", + ["Incinerate"] = "Verbrennen", + ["Inferno"] = "Inferno", + ["Initiative"] = "Initiative", + ["Inner Fire"] = "Inneres Feuer", + ["Inner Focus"] = "Innerer Fokus", + ["Innervate"] = "Anregen", + ["Insect Swarm"] = "Insektenschwarm", + ["Inspiration"] = "Inspiration", + ["Instant Poison II"] = "Sofort wirkendes Gift II", + ["Instant Poison III"] = "Sofort wirkendes Gift III", + ["Instant Poison IV"] = "Sofort wirkendes Gift IV", + ["Instant Poison V"] = "Sofort wirkendes Gift V", + ["Instant Poison VI"] = "Sofort wirkendes Gift VI", + ["Instant Poison"] = "Sofort wirkendes Gift", + ["Intensity"] = "Intensit\195\164t", + ["Intercept"] = "Abfangen", + ["Intercept Stun"] = "Betubung abfangen", + ["Intimidating Shout"] = "Drohruf", + ["Intimidation"] = "Einsch\195\188chterung", + ["Iron Will"] = "Eiserner Wille", + ["Judgement of Command"] = "Richturteil des Befehls", + ["Judgement of Justice"] = "Richturteil der Gerechtigkeit", + ["Judgement of Light"] = "Richturteil des Lichts", + ["Judgement of Righteousness"] = "Richturteil der Rechtschaffenheit", + ["Judgement of Wisdom"] = "Richturteil der Weisheit", + ["Judgement of the Crusader"] = "Richturteil des Kreuzfahrers", + ["Judgement"] = "Richturteil", + ["Kick"] = "Tritt", + ["Kick - Silenced"] = "Tritt - zum Schweigen gebracht", + ["Kidney Shot"] = "Nierenhieb", + ["Killer Instinct"] = "T\195\182tungstrieb", + ["Kodo Riding"] = "Kodoreiten", + ["Lash of Pain"] = "Schmerzenspeitsche", + ["Last Stand"] = "Letztes Gefecht", + ["Lasting Judgement"] = "Dauerhaftes Richturteil", + ["Lay on Hands"] = "Handauflegung", + ["Leader of the Pack"] = "Rudelf\195\188hrer", + ["Leather"] = "Leder", + ["Leatherworking"] = "Lederverarbeitung", + ["Lesser Heal"] = "Geringes Heilen", + ["Lesser Healing Wave"] = "Geringe Welle der Heilung", + ["Lesser Invisibility"] = "Geringe Unsichtbarkeit", + ["Lethal Shots"] = "T\195\182dliche Sch\195\188sse", + ["Lethality"] = "T\195\182dlichkeit", + ["Levitate"] = "Levitieren", + ["Libram"] = "Buchband", + ["Life Tap"] = "Aderlass", + ["Lightning Bolt"] = "Blitzschlag", + ["Lightning Breath"] = "Blitzschlagatem", + ["Lightning Mastery"] = "Blitzschlagbeherrschung", + ["Lightning Reflexes"] = "Blitzartige Reflexe", + ["Lightning Shield"] = "Blitzschlagschild", + ["Lightwell Renew"] = "Erneuerung des Lichtbrunnens", + ["Lightwell"] = "Brunnen des Lichts", + ["Lockpicking"] = "Schlossknacken", + ["Long Daze"] = "Lange Benommenheit", + ["Mace Specialization"] = "Streitkolben-Spezialisierung", + ["Mace Stun Effect"] = "Streitkolbenbet\195\164ubung-Effekt", + ["Mage Armor"] = "Magische R\195\188stung", + ["Magma Totem"] = "Totem der gl\195\188henden Magma", + ["Mail"] = "Panzer", + ["Malice"] = "T\195\188cke", + ["Mana Burn"] = "Manabrand", + ["Mana Shield"] = "Manaschild", + ["Mana Spring Totem"] = "Totem der Manaquelle", + ["Mana Tide Totem"] = "Totem der Manaflut", + ["Mangle"] = "Fleddern", + ["Mark of the Wild"] = "Mal der Wildnis", + ["Martyrdom"] = "M\195\164rtyrertum", + ["Master Demonologist"] = "Meister der D\195\164monologie", + ["Master Summoner"] = "Meister der Beschw\195\182rung", + ["Master of Deception"] = "Meister der T\195\164uschung", + ["Maul"] = "Zermalmen", + ["Mechanostrider Piloting"] = "Roboschreiter-Lenken", + ["Meditation"] = "Meditation", + ["Melee Specialization"] = "Nahkampf-Spezialisierung", + ["Mend Pet"] = "Tier heilen", + ["Mental Agility"] = "Mentale Beweglichkeit", + ["Mental Strength"] = "Mentale St\195\164rke", + ["Mind Blast"] = "Gedankenschlag", + ["Mind Control"] = "Gedankenkontrolle", + ["Mind Flay"] = "Gedankenschinden", + ["Mind Soothe"] = "Gedankenbes\195\164nftigung", + ["Mind Vision"] = "Gedankensicht", + ["Mind-numbing Poison II"] = "Gedankenbenebelndes Gift II", + ["Mind-numbing Poison III"] = "Gedankenbenebelndes Gift III", + ["Mind-numbing Poison"] = "Gedankenbenebelndes Gift", + ["Mining"] = "Bergbau", + ["Mocking Blow"] = "Sp\195\182ttischer Schlag", + ["Mongoose Bite"] = "Mungobiss", + ["Monster Slaying"] = "Monstert\195\182ten", + ["Moonfire"] = "Mondfeuer", + ["Moonfury"] = "Mondfuror", + ["Moonglow"] = "Mondschein", + ["Moonkin Aura"] = "Aura des Moonkin", + ["Moonkin Form"] = "Moonkingestalt", + ["Mortal Shots"] = "Todbringende Sch\195\188sse", + ["Mortal Strike"] = "T\195\182dlicher Sto\195\159", + ["Multi-Shot"] = "Mehrfachschuss", + ["Murder"] = "Mord", + ["Natural Armor"] = "Nat\195\188rliche R\195\188stung", + ["Natural Shapeshifter"] = "Schnellwandlung", + ["Natural Weapons"] = "Waffenbalance", + ["Nature Resistance Totem"] = "Totem des Naturwiderstands", + ["Nature Resistance"] = "Naturwiderstand", + ["Nature's Focus"] = "Naturfokus", + ["Nature's Grace"] = "Anmut der Natur", + ["Nature's Grasp"] = "Griff der Natur", + ["Nature's Reach"] = "Reichweite der Natur", + ["Nature's Swiftness"] = "Schnelligkeit der Natur", + ["Nightfall"] = "Einbruch der Nacht", + ["Omen of Clarity"] = "Omen der Klarsicht", + ["One-Handed Axes"] = "Einhand\195\164xte", + ["One-Handed Maces"] = "Einhandstreitkolben", + ["One-Handed Swords"] = "Einhandschwerter", + ["One-Handed Weapon Specialization"] = "Einhandwaffen-Spezialisierung", + ["Opening - No Text"] = "\195\150ffnen - Kein Text", + ["Opening"] = "\195\150ffnen", + ["Opportunity"] = "G\195\188nstige Gelegenheit", + ["Overpower"] = "\195\156berw\195\164ltigen", + ["Paranoia"] = "Paranoia", + ["Parry"] = "Parieren", + ["Pathfinding"] = "Orientierung", + ["Perception"] = "Wachsamkeit", + ["Permafrost"] = "Dauerfrost", + ["Pet Aggression"] = "Tieraggression", + ["Pet Hardiness"] = "Tier-Widerstandskraft", + ["Pet Recovery"] = "Tiererholung", + ["Pet Resistance"] = "Tier-Widerstand", + ["Phase Shift"] = "Phasenverschiebung", + ["Pick Lock"] = "Schloss knacken", + ["Pick Pocket"] = "Taschendiebstahl", + ["Piercing Howl"] = "Durchdringendes Heulen", + ["Piercing Ice"] = "Stechendes Eis", + ["Plate Mail"] = "Plattenpanzer", + ["Poison Cleansing Totem"] = "Totem der Giftreinigung", + ["Poisons"] = "Gifte", + ["Polearm Specialization"] = "Stangenwaffen-Spezialisierung", + ["Polearms"] = "Stangenwaffen", + ["Polymorph"] = "Verwandlung", + ["Polymorph: Pig"] = "Verwandlung: Schwein", + ["Polymorph: Turtle"] = "Verwandlung: Schildkr\195\182te", + ["Portal: Darnassus"] = "Portal: Darnassus", + ["Portal: Ironforge"] = "Portal: Ironforge", + ["Portal: Orgrimmar"] = "Portal: Orgrimmar", + ["Portal: Stormwind"] = "Portal: Stormwind", + ["Portal: Thunder Bluff"] = "Portal: Thunder Bluff", + ["Portal: Undercity"] = "Portal: Undercity", + ["Pounce Bleed"] = "Anspringblutung", + ["Pounce"] = "Anspringen", + ["Power Infusion"] = "Seele der Macht", + ["Power Word: Fortitude"] = "Machtwort: Seelenst\195\164rke", + ["Power Word: Shield"] = "Machtwort: Schild", + ["Prayer of Fortitude"] = "Gebet der Seelenst\195\164rke", + ["Prayer of Healing"] = "Gebet der Heilung", + ["Prayer of Shadow Protection"] = "Gebet des Schattenschutzes", + ["Prayer of Spirit"] = "Gebet der Willenskraft", + ["Precision"] = "Pr\195\164zision", + ["Predatory Strikes"] = "Raubtierschl\195\164ge", + ["Premeditation"] = "Konzentration", + ["Preparation"] = "Vorbereitung", + ["Presence of Mind"] = "Geistesgegenwart", + ["Primal Fury"] = "Urfuror", + ["Prowl"] = "Schleichen", + ["Psychic Scream"] = "Psychischer Schrei", + ["Pummel"] = "Zuschlagen", + ["Purge"] = "Reinigen", + ["Purification"] = "L\195\164uterung", + ["Purify"] = "L\195\164utern", + ["Pursuit of Justice"] = "Streben nach Gerechtigkeit", + ["Pyroblast"] = "Pyroschlag", + ["Pyroclasm"] = "Feuerschwall", + ["Quick Shots"] = "Schnelle Schüsse", + ["Quickness"] = "Schnelligkeit", + ["Rain of Fire"] = "Feuerregen", + ["Rake"] = "Krallenhieb", + ["Ram Riding"] = "Widderreiten", + ["Ranged Weapon Specialization"] = "Distanzwaffen-Spezialisierung", + ["Rapid Concealment"] = "Schnelles Verstecken", + ["Rapid Fire"] = "Schnellfeuer", + ["Raptor Riding"] = "Raptorreiten", + ["Raptor Strike"] = "Raptorsto\195\159", + ["Ravage"] = "Verheeren", + ["Readiness"] = "Bereitschaft", + ["Rebirth"] = "Wiedergeburt", + ["Reckless Charge"] = "Tollk?nes St?men", + ["Recklessness"] = "Tollk\195\188hnheit", + ["Reckoning"] = "Abrechnung", + ["Redemption"] = "Erl\195\182sung", + ["Redoubt"] = "Verschanzen", + ["Reflection"] = "Reflexion", + ["Regeneration"] = "Regeneration", + ["Regrowth"] = "Nachwachsen", + ["Reincarnation"] = "Reinkarnation", + ["Rejuvenation"] = "Verj\195\188ngung", + ["Relentless Strikes"] = "Unerbittliche St\195\182\195\159e", + ["Remorseless"] = "Gnadenlos", + ["Remorseless Attacks"] = "Gnadenlose Angriffe", + ["Remove Curse"] = "Fluch aufheben", + ["Remove Insignia"] = "Abzeichen entfernen", + ["Remove Lesser Curse"] = "Geringen Fluch aufheben", + ["Rend"] = "Verwunden", + ["Renew"] = "Erneuerung", + ["Repentance"] = "Bu\195\159e", + ["Resurrection"] = "Auferstehung", + ["Retaliation"] = "Gegenschlag", + ["Retribution Aura"] = "Aura der Vergeltung", + ["Revenge Stun"] = "Rachebet\195\164ubung", + ["Revenge"] = "Rache", + ["Reverberation"] = "Nachklingen", + ["Revive Pet"] = "Tier wiederbeleben", + ["Righteous Fury"] = "Zorn der Gerechtigkeit", + ["Rip"] = "Zerfetzen", + ["Riposte"] = "Riposte", + ["Ritual of Doom Effect"] = "Ritual der Verdammnis'-Effekt", + ["Ritual of Doom"] = "Ritual der Verdammnis", + ["Ritual of Summoning"] = "Ritual der Beschw\195\182rung", + ["Rockbiter Weapon"] = "Felsbei\195\159erwaffe", + ["Rogue Passive"] = "Schurke Passiv", + ["Ruin"] = "Verderben", + ["Rupture"] = "Blutung", + ["Ruthlessness"] = "Skrupellosigkeit", + ["Sacrifice"] = "Opferung", + ["Safe Fall"] = "Sicheres Fallen", + ["Sanctity Aura"] = "Aura der Heiligkeit", + ["Sap"] = "Kopfnuss", + ["Savage Fury"] = "Ungez\195\164hmte Wut", + ["Savage Strikes"] = "Wilde Schl\195\164ge", + ["Scare Beast"] = "Wildtier \195\164ngstigen", + ["Scatter Shot"] = "Streuschuss", + ["Scorch"] = "Versengen", + ["Scorpid Poison"] = "Skorpidgift", + ["Scorpid Sting"] = "Skorpidstich", + ["Screech"] = "Schrei", + ["Seal Fate"] = "Schicksal besiegeln", + ["Seal of Command"] = "Siegel des Befehls", + ["Seal of Justice"] = "Siegel der Gerechtigkeit", + ["Seal of Light"] = "Siegel des Lichts", + ["Seal of Righteousness"] = "Siegel der Rechtschaffenheit", + ["Seal of Wisdom"] = "Siegel der Weisheit", + ["Seal of the Crusader"] = "Siegel des Kreuzfahrers", + ["Searing Light"] = "Sengendes Licht", + ["Searing Pain"] = "Sengender Schmerz", + ["Searing Totem"] = "Totem der Verbrennung", + ["Seduction"] = "Verf\195\188hrung", + ["Sense Demons"] = "D\195\164monen sp\195\188ren", + ["Sense Undead"] = "Untote sp\195\188ren", + ["Sentry Totem"] = "Totem des Wachens", + ["Serpent Sting"] = "Schlangenbiss", + ["Setup"] = "Reinlegen", + ["Shackle Undead"] = "Untote fesseln", + ["Shadow Affinity"] = "Schattenaffinit\195\164t", + ["Shadow Bolt"] = "Schattenblitz", + ["Shadow Focus"] = "Schattenfokus", + ["Shadow Mastery"] = "Schattenbeherrschung", + ["Shadow Protection"] = "Schattenschutz", + ["Shadow Reach"] = "Schattenreichweite", + ["Shadow Resistance Aura"] = "Aura des Schattenwiderstands", + ["Shadow Resistance"] = "Schattenwiderstand", + ["Shadow Trance"] = "Schattentrance", + ["Shadow Vulnerability"] = "Schattenverwundbarkeit", + ["Shadow Ward"] = "Schattenzauberschutz", + ["Shadow Weaving"] = "Schattenwirken", + ["Shadow Word: Pain"] = "Schattenwort: Schmerz", + ["Shadowburn"] = "Schattenbrand", + ["Shadowform"] = "Schattengestalt", + ["Shadowguard"] = "Schattenschild", + ["Shadowmeld Passive"] = "Schattenmimik Passiv", + ["Shadowmeld"] = "Schattenhaftigkeit", + ["Sharpened Claws"] = "Gesch\195\164rfte Klauen", + ["Shatter"] = "Zertr\195\188mmern", + ["Shell Shield"] = "Panzerschild", + ["Shield Bash"] = "Schildhieb", + ["Shield Bash - Silenced"] = "Schildhieb - zum Schweigen gebracht", + ["Shield Block"] = "Schildblock", + ["Shield Slam"] = "Schildschlag", + ["Shield Specialization"] = "Schild-Spezialisierung", + ["Shield Wall"] = "Schildwall", + ["Shield"] = "Schild", + ["Shoot Bow"] = "Bogenschuss", + ["Shoot Crossbow"] = "Armbrust abschie\195\159en", + ["Shoot Gun"] = "Schusswaffe abfeuern", + ["Shoot"] = "Schie\195\159en", + ["Shred"] = "Schreddern", + ["Silence"] = "Stille", + ["Silent Resolve"] = "Schweigsame Entschlossenheit", + ["Sinister Strike"] = "Finsterer Sto\195\159", + ["Siphon Life"] = "Lebensentzug", + ["Skinning"] = "K\195\188rschnerei", + ["Slam"] = "Zerschmettern", + ["Sleep"] = "Schlaf", + ["Slice and Dice"] = "Zerh\195\164ckseln", + ["Slow Fall"] = "Langsamer Fall", + ["Smelting"] = "Verh\195\188ttung", + ["Smite"] = "G\195\182ttliche Pein", + ["Soothe Animal"] = "Tier bes\195\164nftigen", + ["Soothing Kiss"] = "Bes\195\164nftigender Kuss", + ["Soul Fire"] = "Seelenfeuer", + ["Soul Link"] = "Seelenverbindung", + ["Soul Siphon"] = "Seelen-Siphon", + ["Soulstone Resurrection"] = "Seelenstein-Auferstehung", + ["Spell Lock"] = "Zaubersperre", + ["Spell Warding"] = "Zauberschutz", + ["Spirit Bond"] = "Geistbande", + ["Spirit Tap"] = "Willensentzug", + ["Spirit of Redemption"] = "Geist der Erl\195\182sung", + ["Spiritual Focus"] = "Spiritueller Fokus", + ["Spiritual Guidance"] = "Geistige F\195\188hrung", + ["Spiritual Healing"] = "Spirituelle Heilung", + ["Sprint"] = "Sprinten", + ["Starfire"] = "Sternenfeuer", + ["Starfire Stun"] = "Sternenfeuer-Betubung", + ["Starshards"] = "Sternensplitter", + ["Staves"] = "St\195\164be", + ["Stealth"] = "Verstohlenheit", + ["Stoneclaw Totem"] = "Totem der Steinklaue", + ["Stoneform"] = "Steingestalt", + ["Stoneskin Totem"] = "Totem der Steinhaut", + ["Stormstrike"] = "Sturmschlag", + ["Strength of Earth Totem"] = "Totem der Erdst\195\164rke", + ["Stuck"] = "Feststecken", + ["Subtlety"] = "Feingef\195\188hl", + ["Suffering"] = "Leiden", + ["Summon Charger"] = "Streitross beschw\195\182ren", + ["Summon Dreadsteed"] = "Schreckensross herbeirufen", + ["Summon Felhunter"] = "Teufelsj\195\164ger beschw\195\182ren", + ["Summon Felsteed"] = "Teufelsross beschw\195\182ren", + ["Summon Imp"] = "Wichtel beschw\195\182ren", + ["Summon Succubus"] = "Sukkubus beschw\195\182ren", + ["Summon Voidwalker"] = "Leerwandler beschw\195\182ren", + ["Summon Warhorse"] = "Schlachtross beschw\195\182ren", + ["Sunder Armor"] = "R\195\188stung zerrei\195\159en", + ["Suppression"] = "Unterdr\195\188ckung", + ["Surefooted"] = "Sicherer Stand", + ["Survivalist"] = "\195\156berlebensk\195\188nstler", + ["Sweeping Strikes"] = "Weitreichende St\195\182\195\159e", +-- ["Swiftmend"] = true, + ["Swipe"] = "Prankenhieb", + ["Sword Specialization"] = "Schwert-Spezialisierung", + ["Tactical Mastery"] = "Taktiker", + ["Tainted Blood"] = "Besudeltes Blut", + ["Tailoring"] = "Schneiderei", + ["Tame Beast"] = "Wildtier z\195\164hmen", + ["Tamed Pet Passive"] = "Gez\195\164hmtes Tier - Passiv", + ["Taunt"] = "Spott", + ["Teleport: Darnassus"] = "Teleportieren: Darnassus", + ["Teleport: Ironforge"] = "Teleportieren: Ironforge", + ["Teleport: Moonglade"] = "Teleportieren: Moonglade", + ["Teleport: Orgrimmar"] = "Teleportieren: Orgrimmar", + ["Teleport: Stormwind"] = "Teleportieren: Stormwind", + ["Teleport: Thunder Bluff"] = "Teleportieren: Thunder Bluff", + ["Teleport: Undercity"] = "Teleportieren: Undercity", + ["The Human Spirit"] = "Unbeugsamkeit", + ["Thick Hide"] = "Dickes Fell", + ["Thorns"] = "Dornen", + ["Throw"] = "Werfen", + ["Throwing Specialization"] = "Wurfwaffen-Spezialisierung", + ["Throwing Weapon Specialization"] = "Wurfwaffen-Spezialisierung", + ["Thrown"] = "Wurfwaffe", + ["Thunder Clap"] = "Donnerknall", + ["Thundering Strikes"] = "Donnernde St\195\182\195\159e", + ["Thunderstomp"] = "Donnerstampfer", + ["Tidal Focus"] = "Gezeitenfokus", + ["Tidal Mastery"] = "Gezeitenbeherrschung", + ["Tiger Riding"] = "Tigerreiten", + ["Tiger's Fury"] = "Tigerfuror", + ["Torment"] = "Qual", + ["Totem"] = "Totem", + ["Totemic Focus"] = "Totemfokus", + ["Touch of Weakness"] = "Ber\195\188hrung der Schw\195\164che", + ["Toughness"] = "Z\195\164higkeit", + ["Track Beasts"] = "Wildtiere aufsp\195\188ren", + ["Track Demons"] = "D\195\164monen aufsp\195\188ren", + ["Track Dragonkin"] = "Drachkin aufsp\195\188ren", + ["Track Elementals"] = "Elementare aufsp\195\188ren", + ["Track Giants"] = "Riesen aufsp\195\188ren", + ["Track Hidden"] = "Verborgenes aufsp\195\188ren", + ["Track Humanoids"] = "Humanoide aufsp\195\188ren", + ["Track Undead"] = "Untote aufsp\195\188ren", + ["Tranquil Air Totem"] = "Totem der beruhigenden Winde", + ["Tranquil Spirit"] = "Gelassener Geist", + ["Tranquility"] = "Gelassenheit", + ["Tranquilizing Shot"] = "Einlullender Schuss", + ["Trap Mastery"] = "Fallenbeherrschung", + ["Travel Form"] = "Reisegestalt", + ["Tremor Totem"] = "Totem des Erdsto\195\159es", + ["Tribal Leatherworking"] = "Stammeslederverarbeitung", + ["Trueshot Aura"] = "Aura des Volltreffers", + ["Turn Undead"] = "Untote vertreiben", + ["Two-Handed Axes and Maces"] = "Zweihand\195\164xte und -Streitkolben", + ["Two-Handed Axes"] = "Zweihand\195\164xte", + ["Two-Handed Maces"] = "Zweihandstreitkolben", + ["Two-Handed Swords"] = "Zweihandschwerter", + ["Two-Handed Weapon Specialization"] = "Zweihandwaffen-Spezialisierung", + ["Unarmed"] = "Unbewaffnet", + ["Unbreakable Will"] = "Unbezwingbarer Wille", + ["Unbridled Wrath Effect"] = "Entfesselter Zorn'-Effekt", + ["Unbridled Wrath"] = "Entfesselter Zorn", + ["Undead Horsemanship"] = "Untotenreitkunst", + ["Underwater Breathing"] = "Unterwasseratmung", + ["Unending Breath"] = "Unendlicher Atem", + ["Unholy Power"] = "Unheilige Macht", + ["Unleashed Fury"] = "Entfesselter Zorn", + ["Unyielding Faith"] = "Unumst\195\182\195\159licher Glaube", + ["Vampiric Embrace"] = "Vampirumarmung", + ["Vanish"] = "Verschwinden", + ["Vanished"] = "Verschwunden", + ["Vengeance"] = "Rache", + ["Vigor"] = "Lebenskraft", + ["Vile Poisons"] = "\195\156ble Gifte", + ["Vindication"] = "Rechtschaffene Schw\195\164chung", + ["Viper Sting"] = "Vipernbiss", + ["Volley"] = "Salve", + ["Wand Specialization"] = "Zauberstab-Spezialisierung", + ["Wands"] = "Zauberst\195\164be", + ["War Stomp"] = "Kriegsdonner", + ["Water Breathing"] = "Wasseratmung", + ["Water Walking"] = "Wasserwandeln", + ["Weakened Soul"] = "Geschwächte Seele", + ["Weaponsmith"] = "Waffenschmied", + ["Whirlwind"] = "Wirbelwind", + ["Will of the Forsaken"] = "Wille der Verlassenen", + ["Windfury Totem"] = "Totem des Windzorns", + ["Windfury Weapon"] = "Waffe des Windfurors", + ["Windwall Totem"] = "Totem der Windmauer", + ["Wing Clip"] = "Zurechtstutzen", + ["Winter's Chill"] = "Winterk\195\164lte", + ["Wisp Spirit"] = "Irrwisch-Geist", + ["Wolf Riding"] = "Wolfreiten", + ["Wound Poison II"] = "Wundgift II", + ["Wound Poison III"] = "Wundgift III", + ["Wound Poison IV"] = "Wundgift IV", + ["Wound Poison"] = "Wundgift", + ["Wrath"] = "Zorn", + ["Wyvern Sting"] = "Stich des Fl\195\188geldrachen" + } +end) + +BabbleSpell:RegisterTranslations("frFR", function() + return { + ["Abolish Disease"] = "Abolir maladie", + ["Abolish Poison Effect"] = "Effet Abolir le poison", + ["Abolish Poison"] = "Abolir le poison", + ["Activate MG Turret"] = "Activation de la tourelle de mitrailleuse", + ["Adrenaline Rush"] = "Pouss\195\169e d'adr\195\169naline", + ["Aftermath"] = "Cons\195\169quences", + ["Aggression"] = "Agressivit\195\169", + ["Aimed Shot"] = "Vis\195\169e", + ["Alchemy"] = "Alchimie", + ["Ambush"] = "Embuscade", + ["Amplify Curse"] = "Mal\195\169diction amplifi\195\169e", + ["Amplify Magic"] = "Amplification de la magie", + ["Ancestral Fortitude"] = "Robustesse des anciens", + ["Ancestral Healing"] = "Gu\195\169rison des anciens", + ["Ancestral Knowledge"] = "Connaissance ancestrale", + ["Ancestral Spirit"] = "Esprit ancestral", + ["Anger Management"] = "Ma\195\174trise de la Rage", + ["Anticipation"] = "Anticipation", + ["Aquatic Form"] = "Forme aquatique", + ["Arcane Brilliance"] = "Illumination des arcanes", + ["Arcane Concentration"] = "Concentration des arcanes", + ["Arcane Explosion"] = "Explosion des arcanes", + ["Arcane Focus"] = "Focalisation des arcanes", + ["Arcane Instability"] = "Instabilit\195\169 des arcanes", + ["Arcane Intellect"] = "Intelligence des arcanes", + ["Arcane Meditation"] = "M\195\169ditation des arcanes", + ["Arcane Mind"] = "Esprit des arcanes", + ["Arcane Missiles"] = "Projectiles des arcanes", + ["Arcane Power"] = "Pouvoir des arcanes", + ["Arcane Resistance"] = "R\195\169sistance aux Arcanes", + ["Arcane Shot"] = "Tir des arcanes", + ["Arcane Subtlety"] = "Subtilit\195\169 des arcanes", + ["Arctic Reach"] = "Allonge arctique", + ["Armorsmith"] = "Fabricant d'armures", + ["Aspect of the Beast"] = "Aspect de la b\195\170te", + ["Aspect of the Cheetah"] = "Aspect du gu\195\169pard", + ["Aspect of the Hawk"] = "Aspect du faucon", + ["Aspect of the Monkey"] = "Aspect du singe", + ["Aspect of the Pack"] = "Aspect de la meute", + ["Aspect of the Wild"] = "Aspect de la nature", + ["Astral Recall"] = "Rappel astral", + ["Attack"] = "Attaque", + ["Attacking"] = "Attaque", + ["Auto Shot"] = "Tir automatique", + ["Axe Specialization"] = "Sp\195\169cialisation Hache", + ["Backstab"] = "Attaque sournoise", + ["Bane"] = "Fl\195\169au", + ["Banish"] = "Bannir", + ["Barkskin Effect"] = "Effet Ecorce", + ["Barkskin"] = "Ecorce", + ["Barrage"] = "Barrage", + ["Bash"] = "Sonner", + ["Basic Campfire"] = "Feu de camp basique", + ["Battle Shout"] = "Cri de guerre", + ["Battle Stance Passive"] = "Posture de combat", + ["Battle Stance"] = "Posture de combat", + ["Bear Form"] = "Forme d'ours", + ["Beast Lore"] = "Connaissance des b\195\170tes", + ["Beast Slaying"] = "Tueur de b\195\170tes", + ["Beast Training"] = "Apprivoisement", + ["Benediction"] = "B\195\169n\195\169diction", + ["Berserker Rage"] = "Rage berserker", + ["Berserker Stance Passive"] = "Posture berserker", + ["Berserker Stance"] = "Posture berserker", + ["Berserking"] = "Berserker", + ["Bestial Discipline"] = "Discipline bestiale", + ["Bestial Swiftness"] = "Rapidit\195\169 bestiale", + ["Bestial Wrath"] = "Courroux bestial", + ["Bite"] = "Morsure", + ["Black Arrow"] = "Fl\195\168che noire", + ["Blackout"] = "Aveuglement", + ["Blacksmithing"] = "Forge", + ["Blade Flurry"] = "D\195\169luge de lames", + ["Blast Wave"] = "Vague explosive", + ["Blessed Recovery"] = "R\195\169tablissement b\195\169ni", + ["Blessing of Freedom"] = "B\195\169n\195\169diction de libert\195\169", + ["Blessing of Kings"] = "B\195\169n\195\169diction des rois", + ["Blessing of Light"] = "B\195\169n\195\169diction de lumi\195\168re", + ["Blessing of Might"] = "B\195\169n\195\169diction de puissance", + ["Blessing of Protection"] = "B\195\169n\195\169diction de protection", + ["Blessing of Sacrifice"] = "B\195\169n\195\169diction de sacrifice", + ["Blessing of Salvation"] = "B\195\169n\195\169diction de salut", + ["Blessing of Sanctuary"] = "B\195\169n\195\169diction du sanctuaire", + ["Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse", + ["Blind"] = "C\195\169cit\195\169", + ["Blinding Powder"] = "Poudre aveuglante", + ["Blink"] = "Transfert", + ["Blizzard"] = "Blizzard", + ["Block"] = "Bloquer", + ["Blood Craze"] = "Folie sanguinaire", + ["Blood Frenzy"] = "Fr\195\169n\195\169sie sanglante", + ["Blood Fury"] = "Fureur sanguinaire", + ["Blood Pact"] = "Pacte de sang", + ["Bloodrage"] = "Rage sanguinaire", + ["Bloodthirst"] = "Sanguinaire", + ["Booming Voice"] = "Voix tonitruante", + ["Bow Specialization"] = "Sp\195\169cialisation Arc", + ["Bows"] = "Arcs", + ["Bright Campfire"] = "Feu de camp \195\169clatant", + ["Brutal Impact"] = "Impact brutal", + ["Burning Soul"] = "Ame ardente", + ["Call Pet"] = "Appel du familier", + ["Call of Flame"] = "Appel des flammes", + ["Call of Thunder"] = "Appel de la foudre", + ["Camouflage"] = "Dissimulation", + ["Cannibalize"] = "Cannibalisme", + ["Cat Form"] = "Forme de f\195\169lin", + ["Cataclysm"] = "Cataclysme", + ["Chain Heal"] = "Salve de gu\195\169rison", + ["Chain Lightning"] = "Cha\195\174ne d'\195\169clairs", + ["Challenging Roar"] = "Rugissement provocateur", + ["Challenging Shout"] = "Cri de d\195\169fi", + ["Charge Rage Bonus Effect"] = "Effet Bonus de Rage de la Charge", + ["Charge"] = "Charge", + ["Charge Stun"] = "Charge \195\169tourdissante", + ["Cheap Shot"] = "Coup bas", + ["Chilled"] = "Transi", + ["Claw"] = "Griffe", + ["Cleanse"] = "Epuration", + ["Clearcasting"] = "Id\195\169es claires", + ["Cleave"] = "Encha\195\174nement", + ["Clever Traps"] = "Pi\195\168ges astucieux", + ["Closing"] = "Fermeture", + ["Cloth"] = "Tissu", + ["Cobra Reflexes"] = "R\195\169flexes du cobra", + ["Cold Blood"] = "Sang froid", + ["Cold Snap"] = "Morsure de glace", + ["Combat Endurance"] = "Endurance de combat", + ["Combustion"] = "Combustion", + ["Command"] = "Commande", + ["Concentration Aura"] = "Aura de concentration", + ["Concussion Blow"] = "Bourrasque", + ["Concussion"] = "Commotion", + ["Concussive Shot"] = "Trait de choc", + ["Cone of Cold"] = "C\195\180ne de froid", + ["Conflagrate"] = "Conflagration", + ["Conjure Food"] = "Invocation de nourriture", + ["Conjure Mana Agate"] = "Invocation d'une agate de mana", + ["Conjure Mana Citrine"] = "Invocation d'une citrine de mana", + ["Conjure Mana Jade"] = "Invocation d'une jade de mana", + ["Conjure Mana Ruby"] = "Invocation d'un rubis de mana", + ["Conjure Water"] = "Invocation d'eau", + ["Consecration"] = "Cons\195\169cration", + ["Consume Shadows"] = "Consumer les ombres", + ["Convection"] = "Convection", + ["Conviction"] = "Conviction", + ["Cooking"] = "Cuisine", + ["Corruption"] = "Corruption", + ["Counterattack"] = "Contre-attaque", + ["Counterspell"] = "Contresort", + ["Counterspell - Silenced"] = "Contresort - Silencieux", + ["Cower"] = "D\195\169robade", + ["Create Firestone"] = "Cr\195\169ation de Pierre de feu", + ["Create Healthstone"] = "Cr\195\169ation de Pierre de soins", + ["Create Soulstone"] = "Cr\195\169ation de Pierre d'\195\162me", + ["Create Spellstone"] = "Cr\195\169ation de Pierre de sort", + ["Crippling Poison II"] = "Poison affaiblissant II", + ["Crippling Poison"] = "Poison affaiblissant", + ["Critical Mass"] = "Masse critique", + ["Crossbows"] = "Arbal\195\168tes", + ["Cruelty"] = "Cruaut\195\169", + ["Cultivation"] = "Culture", + ["Cure Disease"] = "Gu\195\169rison des maladies", + ["Cure Poison"] = "Gu\195\169rison du poison", + ["Curse of Agony"] = "Mal\195\169diction d'agonie", + ["Curse of Doom Effect"] = "Effet Mal\195\169diction funeste", + ["Curse of Doom"] = "Mal\195\169diction funeste", + ["Curse of Exhaustion"] = "Mal\195\169diction de fatigue", + ["Curse of Idiocy"] = "Mal\195\169diction d'idiotie", + ["Curse of Recklessness"] = "Mal\195\169diction de t\195\169m\195\169rit\195\169", + ["Curse of Shadow"] = "Mal\195\169diction de l'ombre", + ["Curse of Tongues"] = "Mal\195\169diction des langages", + ["Curse of Weakness"] = "Mal\195\169diction de faiblesse", + ["Curse of the Elements"] = "Mal\195\169diction des \195\169l\195\169ments", + ["Dagger Specialization"] = "Sp\195\169cialisation Dague", + ["Daggers"] = "Dagues", + ["Dampen Magic"] = "Att\195\169nuation de la magie", + ["Dark Pact"] = "Pacte noir", + ["Darkness"] = "T\195\169n\195\168bres", + ["Dash"] = "C\195\169l\195\169rit\195\169", + ["Deadly Poison II"] = "Poison mortel II", + ["Deadly Poison III"] = "Poison mortel III", + ["Deadly Poison IV"] = "Poison mortel IV", + ["Deadly Poison V"] = "Poison mortel V", + ["Deadly Poison"] = "Poison mortel", + ["Death Coil"] = "Voile mortel", + ["Death Wish"] = "Souhait mortel", + ["Deep Wounds"] = "Blessure profonde", + ["Defense"] = "D\195\169fense", + ["Defensive Stance Passive"] = "Posture d\195\169fensive", + ["Defensive Stance"] = "Posture d\195\169fensive", + ["Defensive State 2"] = "Posture d\195\169fensive 2", + ["Defensive State"] = "Posture d\195\169fensive", + ["Defiance"] = "D\195\169fi", + ["Deflection"] = "D\195\169viation", + ["Demon Armor"] = "Armure d\195\169moniaque", + ["Demon Skin"] = "Peau de d\195\169mon", + ["Demonic Embrace"] = "Baiser d\195\169moniaque", + ["Demonic Sacrifice"] = "Sacrifice d\195\169moniaque", + ["Demoralizing Roar"] = "Rugissement d\195\169moralisant", + ["Demoralizing Shout"] = "Cri d\195\169moralisant", + ["Desperate Prayer"] = "Pri\195\168re du d\195\169sespoir", + ["Destructive Reach"] = "Allonge de destruction", + ["Detect Greater Invisibility"] = "D\195\169tection de l'invisibilit\195\169 sup\195\169rieure", + ["Detect Invisibility"] = "D\195\169tection de l'invisibilit\195\169", + ["Detect Lesser Invisibility"] = "D\195\169tection de l'invisibilit\195\169 inf\195\169rieure", + ["Detect Magic"] = "D\195\169tection de la magie", + ["Detect Traps"] = "D\195\169tection des pi\195\168ges", + ["Detect"] = "D\195\169tection", + ["Deterrence"] = "Dissuasion", + ["Devastation"] = "D\195\169vastation", + ["Devotion Aura"] = "Aura de d\195\169votion", + ["Devour Magic Effect"] = "Effet festin magique", + ["Devour Magic"] = "Festin magique", + ["Devouring Plague"] = "Peste d\195\169vorante", + ["Diplomacy"] = "Diplomatie", + ["Dire Bear Form"] = "Forme d'ours redoutable", + ["Disarm Trap"] = "D\195\169sarmement de pi\195\168ge", + ["Disarm"] = "D\195\169sarmement", + ["Disease Cleansing Totem"] = "Totem de Purification des maladies", + ["Disenchant"] = "D\195\169senchanter", + ["Disengage"] = "D\195\169sengagement", + ["Dismiss Pet"] = "Renvoyer le familier", + ["Dispel Magic"] = "Dissipation de la magie", + ["Distract"] = "Distraction", + ["Distracting Shot"] = "Trait provocateur", + ["Dive"] = "Plongeon", + ["Divine Favor"] = "Faveur divine", + ["Divine Fury"] = "Fureur divine", + ["Divine Intellect"] = "Intelligence divine", + ["Divine Intervention"] = "Intervention divine", + ["Divine Protection"] = "Protection divine", + ["Divine Shield"] = "Bouclier divin", + ["Divine Spirit"] = "Esprit divin", + ["Divine Strength"] = "Force divine", + ["Dodge"] = "Esquiver", + ["Dragonscale Leatherworking"] = "Travail du cuir d'\195\169cailles de dragon", + ["Drain Life"] = "Drain de vie", + ["Drain Mana"] = "Drain de mana", + ["Drain Soul"] = "Siphon d'\195\162me", + ["Drink"] = "Boisson", + ["Dual Wield Specialization"] = "Sp\195\169cialisation Ambidextrie", + ["Dual Wield"] = "Ambidextrie", + ["Duel"] = "Duel", + ["Eagle Eye"] = "Oeil d'aigle", + ["Earth Shock"] = "Horion de terre", + ["Earthbind Totem"] = "Totem de lien terrestre", + ["Efficiency"] = "Efficacit\195\169", + ["Elemental Focus"] = "Focalisation \195\169l\195\169mentaire", + ["Elemental Fury"] = "Fureur \195\169l\195\169mentaire", + ["Elemental Leatherworking"] = "Travail du cuir \195\169l\195\169mentaire", + ["Elemental Mastery"] = "Ma\195\174trise \195\169l\195\169mentaire", + ["Elune's Grace"] = "Gr\195\162ce d'Elune", + ["Elusiveness"] = "Insaisissable", + ["Emberstorm"] = "Temp\195\170te ardente", + ["Enamored Water Spirit"] = "Esprit de l'eau amoureux", + ["Enchanting"] = "Enchantement", + ["Endurance Training"] = "Entra\195\174nement \195\160 l'Endurance", + ["Endurance"] = "Endurance", + ["Engineering Specialization"] = "Sp\195\169cialisation", + ["Engineering"] = "Ing\195\169nieur", + ["Enrage"] = "Enrager", + ["Enriched Manna Biscuit"] = "Biscuit enrichi en manne", + ["Enslave Demon"] = "Asservir d\195\169mon", + ["Entangling Roots"] = "Sarments", + ["Entrapment"] = "Pi\195\168ge", + ["Escape Artist"] = "Ma\195\174tre de l'\195\169vasion", + ["Evasion"] = "Evasion", + ["Eventide"] = "Tomb\195\169e du jour", + ["Eviscerate"] = "Evisc\195\169ration", + ["Evocation"] = "Evocation", + ["Execute"] = "Ex\195\169cution", + ["Exorcism"] = "Exorcisme", + ["Expansive Mind"] = "Pens\195\169e expansive", + ["Explosive Trap Effect"] = "Effet Pi\195\168ge explosif", + ["Explosive Trap"] = "Pi\195\168ge explosif", + ["Expose Armor"] = "Exposer l'armure", + ["Eye for an Eye"] = "Oeil pour oeil", + ["Eye of Kilrogg"] = "Oeil de Kilrogg", + ["Eyes of the Beast"] = "Oeil de la b\195\170te", + ["Fade"] = "Oubli", + ["Faerie Fire"] = "Lucioles", + ["Faerie Fire (Feral)"] = "Lucioles (farouche)", + ["Far Sight"] = "Double vue", + ["Fear Ward"] = "Gardien de peur", + ["Fear"] = "Peur", + ["Feed Pet"] = "Nourrir le familier", + ["Feedback"] = "R\195\169action", + ["Feign Death"] = "Feindre la mort", + ["Feint"] = "Feinte", + ["Fel Concentration"] = "Concentration corrompue", + ["Fel Domination"] = "Domination corrompue", + ["Fel Intellect"] = "Intelligence corrompue", + ["Fel Stamina"] = "Endurance corrompue", + ["Felfire"] = "Gangrefeu", + ["Feline Grace"] = "Gr\195\162ce f\195\169line", + ["Feline Swiftness"] = "C\195\169l\195\169rit\195\169 f\195\169line", + ["Feral Aggression"] = "Agressivit\195\169 farouche", + ["Feral Charge"] = "Charge farouche", + ["Feral Instinct"] = "Instinct farouche", + ["Ferocious Bite"] = "Morsure f\195\169roce", + ["Ferocity"] = "Ferocit\195\169", + ["Fetish"] = "F\195\169tiche", + ["Find Herbs"] = "D\195\169couverte d'herbes", + ["Find Minerals"] = "D\195\169couverte de gisements", + ["Find Treasure"] = "D\195\169couverte de tr\195\169sors", + ["Fire Blast"] = "Trait de feu", + ["Fire Nova Totem"] = "Totem Nova de feu", + ["Fire Power"] = "Puissance du feu", + ["Fire Resistance Aura"] = "Aura de r\195\169sistance au Feu", + ["Fire Resistance Totem"] = "Totem de r\195\169sistance au feu", + ["Fire Resistance"] = "R\195\169sistance au Feu", + ["Fire Shield"] = "Bouclier de feu", + ["Fire Vulnerability"] = "Vuln\195\169rabilit\195\169 au Feu", + ["Fire Ward"] = "Gardien de feu", + ["Fireball"] = "Boule de feu", + ["Firebolt"] = "Eclair de feu", + ["First Aid"] = "Secourisme", + ["Fishing Poles"] = "Cannes \195\160 p\195\170che", + ["Fishing"] = "P\195\170che", + ["Fist Weapon Specialization"] = "Sp\195\169cialisation Arme de pugilat", + ["Fist Weapons"] = "Armes de pugilat", + ["Flame Shock"] = "Horion de flammes", + ["Flame Throwing"] = "Jet de flammes", + ["Flamestrike"] = "Choc de flammes", + ["Flamethrower"] = "Lance-flammes", + ["Flametongue Totem"] = "Totem Langue de feu", + ["Flametongue Weapon"] = "Arme Langue de feu", + ["Flare"] = "Fus\195\169e \195\169clairante", + ["Flash Heal"] = "Soins rapides", + ["Flash of Light"] = "Eclair lumineux", + ["Flurry"] = "Rafale", + ["Focused Casting"] = "Incantation focalis\195\169e", + ["Food"] = "Nourriture", + ["Forbearance"] = "Longanimit\195\169", + ["Force of Will"] = "Force de volont\195\169", + ["Freezing Trap Effect"] = "Effet Pi?e givrant", + ["Freezing Trap"] = "Pi\195\168ge givrant", + ["Frenzied Regeneration"] = "R\195\169g\195\169n\195\169ration fr\195\169n\195\169tique", + ["Frenzy"] = "Fr\195\169n\195\169sie", + ["Frost Armor"] = "Armure de givre", + ["Frost Channeling"] = "Canalisation du givre", + ["Frost Nova"] = "Nova de givre", + ["Frost Resistance Aura"] = "Aura de r\195\169sistance au Givre", + ["Frost Resistance Totem"] = "Totem de r\195\169sistance au Givre", + ["Frost Resistance"] = "R\195\169sistance au Givre", + ["Frost Shock"] = "Horion de givre", + ["Frost Trap"] = "Pi\195\168ge de givre", + ["Frost Trap Aura"] = "Effet Pi\195\168ge de givre", + ["Frost Ward"] = "Gardien de givre", + ["Frostbite"] = "Morsure du givre", + ["Frostbolt"] = "Eclair de givre", + ["Frostbrand Weapon"] = "Arme de givre", + ["Furious Howl"] = "Hurlement furieux", + ["Furor"] = "Fureur", + ["Garrote"] = "Garrot", + ["Generic"] = "G\195\169n\195\169rique", + ["Ghost Wolf"] = "Loup fant\195\180me", + ["Ghostly Strike"] = "Frappe fantomatique", + ["Gift of Nature"] = "Don de la Nature", + ["Gift of the Wild"] = "Don du fauve", + ["Gouge"] = "Suriner", + ["Grace of Air Totem"] = "Totem de Gr\195\162ce a\195\169rienne", + ["Great Stamina"] = "Endurance sup\195\169rieure", + ["Greater Blessing of Kings"] = "B\195\169n\195\169diction des rois sup\195\169rieure", + ["Greater Blessing of Light"] = "B\195\169n\195\169diction de lumi\195\168re sup\195\169rieure", + ["Greater Blessing of Might"] = "B\195\169n\195\169diction de puissance sup\195\169rieure", + ["Greater Blessing of Salvation"] = "B\195\169n\195\169diction de salut sup\195\169rieure", + ["Greater Blessing of Sanctuary"] = "B\195\169n\195\169diction du sanctuaire sup\195\169rieure", + ["Greater Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse sup\195\169rieure", + ["Greater Heal"] = "Soins sup\195\169rieurs", + ["Grim Reach"] = "Allonge sinistre", + ["Grounding Totem"] = "Totem de Gl\195\168be", + ["Grovel"] = "Ramper", + ["Growl"] = "Grondement", + ["Guardian's Favor"] = "Faveur du Gardien", + ["Gun Specialization"] = "Sp\195\169cialisation Armes \195\160 feu", + ["Guns"] = "Armes \195\160 feu", + ["Hammer of Justice"] = "Marteau de la justice", + ["Hand of Justice"] = "Main de justice", + ["Hammer of Wrath"] = "Marteau de courroux", + ["Hamstring"] = "Brise-genou", + ["Harass"] = "Harc\195\168lement", + ["Hardiness"] = "Solidit\195\169", + ["Hawk Eye"] = "Oeil de faucon", + ["Heal"] = "Soins", + ["Healing Focus"] = "Focalisation des soins", + ["Healing Light"] = "Lumi\195\168re gu\195\169risseuse", + ["Healing Stream Totem"] = "Totem gu\195\169risseur", + ["Healing Touch"] = "Toucher gu\195\169risseur", + ["Healing Wave"] = "Vague de soins", + ["Healing Way"] = "Flots de soins", + ["Health Funnel"] = "Captation de vie", + ["Heart of the Wild"] = "C\197\147ur de fauve", + ["Hellfire Effect"] = "Effet Flammes infernales", + ["Hellfire"] = "Flammes infernales", + ["Hemorrhage"] = "H\195\169morragie", + ["Herb Gathering"] = "Cueillette", + ["Herbalism"] = "Herboristerie", + ["Heroic Strike"] = "Frappe h\195\169ro\195\175que", + ["Hex of Weakness"] = "Mal\195\169fice de faiblesse", + ["Hibernate"] = "Hibernation", + ["Holy Fire"] = "Flammes sacr\195\169es", + ["Holy Light"] = "Lumi\195\168re sacr\195\169e", + ["Holy Nova"] = "Nova sacr\195\169e", + ["Holy Power"] = "Puissance sacr\195\169e", + ["Holy Reach"] = "Allonge du Sacr\195\169", + ["Holy Shield"] = "Bouclier sacr\195\169", + ["Holy Shock"] = "Horion sacr\195\169", + ["Holy Specialization"] = "Sp\195\169cialisation", + ["Holy Wrath"] = "Col\195\168re divine", + ["Honorless Target"] = "Cible sans honneur", + ["Horse Riding"] = "Equitation", + ["Howl of Terror"] = "Hurlement de terreur", + ["Humanoid Slaying"] = "Tueur d'humano\195\175des", + ["Hunter's Mark"] = "Marque du chasseur", + ["Hurricane"] = "Ouragan", + ["Ice Armor"] = "Armure de glace", + ["Ice Barrier"] = "Barri\195\168re de glace", + ["Ice Block"] = "Parade de glace", + ["Ice Shards"] = "Eclats de glace", + ["Ignite"] = "Enflammer", + ["Illumination"] = "Illumination", + ["Immolate"] = "Immolation", + ["Immolation Trap Effect"] = "Effet Pi\195\168ge immolation", + ["Immolation Trap"] = "Pi\195\168ge d'Immolation", + ["Impact"] = "Impact", + ["Impale"] = "Empaler", + ["Improved Ambush"] = "Embuscade am\195\169lior\195\169e", + ["Improved Arcane Explosion"] = "Explosion des arcanes am\195\169lior\195\169e", + ["Improved Arcane Missiles"] = "Projectiles des arcanes am\195\169lior\195\169s", + ["Improved Arcane Shot"] = "Tir des arcanes am\195\169lior\195\169", + ["Improved Aspect of the Hawk"] = "Aspect du faucon am\195\169lior\195\169", + ["Improved Aspect of the Monkey"] = "Aspect du singe am\195\169lior\195\169", + ["Improved Backstab"] = "Attaque sournoise am\195\169lior\195\169e", + ["Improved Battle Shout"] = "Cri de guerre am\195\169lior\195\169", + ["Improved Berserker Rage"] = "Rage berserker am\195\169lior\195\169e", + ["Improved Blessing of Might"] = "B\195\169n\195\169diction de puissance am\195\169lior\195\169e", + ["Improved Blessing of Wisdom"] = "B\195\169n\195\169diction de sagesse am\195\169lior\195\169e", + ["Improved Blizzard"] = "Blizzard am\195\169lior\195\169", + ["Improved Bloodrage"] = "Rage sanguinaire am\195\169lior\195\169e", + ["Improved Chain Heal"] = "Salve de gu\195\169rison am\195\169lior\195\169e", + ["Improved Chain Lightning"] = "Cha\195\174ne d'\195\169clairs am\195\169lior\195\169e", + ["Improved Challenging Shout"] = "Cri de d\195\169fi am\195\169lior\195\169", + ["Improved Charge"] = "Charge am\195\169lior\195\169e", + ["Improved Cheap Shot"] = "Coup bas am\195\169lior\195\169", + ["Improved Cleave"] = "Encha\195\174nement am\195\169lior\195\169", + ["Improved Concentration Aura"] = "Aura de concentration am\195\169lior\195\169e", + ["Improved Concussive Shot"] = "Trait de choc am\195\169lior\195\169", + ["Improved Cone of Cold"] = "C\195\180ne de froid am\195\169lior\195\169", + ["Improved Corruption"] = "Corruption am\195\169lior\195\169e", + ["Improved Counterspell"] = "Contresort am\195\169lior\195\169", + ["Improved Curse of Agony"] = "Mal\195\169diction d'agonie am\195\169lior\195\169e", + ["Improved Curse of Exhaustion"] = "Mal\195\169diction de fatigue am\195\169lior\195\169e", + ["Improved Curse of Weakness"] = "Mal\195\169diction de faiblesse am\195\169lior\195\169e", + ["Improved Dampen Magic"] = "Att\195\169nuation de la magie am\195\169lior\195\169e", + ["Improved Deadly Poison"] = "Poison mortel am\195\169lior\195\169", + ["Improved Demoralizing Shout"] = "Cri d\195\169moralisant am\195\169lior\195\169", + ["Improved Devotion Aura"] = "Aura de d\195\169votion am\195\169lior\195\169e", + ["Improved Disarm"] = "D\195\169sarmement am\195\169lior\195\169", + ["Improved Distract"] = "Distraction am\195\169lior\195\169e", + ["Improved Drain Life"] = "Drain de vie am\195\169lior\195\169", + ["Improved Drain Mana"] = "Drain de mana am\195\169lior\195\169", + ["Improved Drain Soul"] = "Siphon d'\195\162me am\195\169lior\195\169", + ["Improved Enrage"] = "Enrager am\195\169lior\195\169", + ["Improved Enslave Demon"] = "Asservir d\195\169mon am\195\169lior\195\169", + ["Improved Entangling Roots"] = "Sarments am\195\169lior\195\169s", + ["Improved Evasion"] = "Evasion am\195\169lior\195\169e", + ["Improved Eviscerate"] = "Evisc\195\169ration am\195\169lior\195\169e", + ["Improved Execute"] = "Ex\195\169cution am\195\169lior\195\169e", + ["Improved Expose Armor"] = "Exposer l'armure am\195\169lior\195\169", + ["Improved Eyes of the Beast"] = "Oeil de la b\195\170te am\195\169lior\195\169", + ["Improved Fade"] = "Oubli am\195\169lior\195\169", + ["Improved Feign Death"] = "Feindre la mort am\195\169lior\195\169", + ["Improved Fire Blast"] = "Trait de feu am\195\169lior\195\169", + ["Improved Fire Nova Totem"] = "Totem Nova de feu am\195\169lior\195\169", + ["Improved Fire Ward"] = "Gardien de feu am\195\169lior\195\169", + ["Improved Fireball"] = "Boule de feu am\195\169lior\195\169e", + ["Improved Firebolt"] = "Eclair de feu am\195\169lior\195\169", + ["Improved Firestone"] = "Pierre de feu am\195\169lior\195\169e", + ["Improved Flamestrike"] = "Choc de flammes am\195\169lior\195\169", + ["Improved Flametongue Weapon"] = "Arme Langue de feu am\195\169lior\195\169e", + ["Improved Flash of Light"] = "Eclair lumineux am\195\169lior\195\169", + ["Improved Frost Nova"] = "Nova de givre am\195\169lior\195\169e", + ["Improved Frost Ward"] = "Gardien de givre am\195\169lior\195\169", + ["Improved Frostbolt"] = "Eclair de givre am\195\169lior\195\169", + ["Improved Frostbrand Weapon"] = "Arme de givre am\195\169lior\195\169e", + ["Improved Garrote"] = "Garrot am\195\169lior\195\169", + ["Improved Ghost Wolf"] = "Loup fant\195\180me am\195\169lior\195\169", + ["Improved Gouge"] = "Suriner am\195\169lior\195\169", + ["Improved Grace of Air Totem"] = "Totem de Gr\195\162ce a\195\169rienne am\195\169lior\195\169", + ["Improved Grounding Totem"] = "Totem de Gl\195\168be am\195\169lior\195\169", + ["Improved Hammer of Justice"] = "Marteau de la justice am\195\169lior\195\169", + ["Improved Hamstring"] = "Brise-genou am\195\169lior\195\169", + ["Improved Healing Stream Totem"] = "Totem gu\195\169risseur am\195\169lior\195\169", + ["Improved Healing Touch"] = "Toucher gu\195\169risseur am\195\169lior\195\169", + ["Improved Healing Wave"] = "Vague de soins am\195\169lior\195\169e", + ["Improved Healing"] = "Soin am\195\169lior\195\169", + ["Improved Health Funnel"] = "Captation de vie am\195\169lior\195\169e", + ["Improved Healthstone"] = "Pierre de soins am\195\169lior\195\169e", + ["Improved Heroic Strike"] = "Frappe h\195\169ro\195\175que am\195\169lior\195\169e", + ["Improved Hunter's Mark"] = "Marque du chasseur am\195\169lior\195\169e", + ["Improved Immolate"] = "Immolation am\195\169lior\195\169e", + ["Improved Imp"] = "Diablotin am\195\169lior\195\169", + ["Improved Inner Fire"] = "Feu int\195\169rieur am\195\169lior\195\169", + ["Improved Instant Poison"] = "Poison instantan\195\169 am\195\169lior\195\169", + ["Improved Intercept"] = "Interception am\195\169lior\195\169e", + ["Improved Intimidating Shout"] = "Cri d\226\128\153intimidation am\195\169lior\195\169", + ["Improved Judgement"] = "Jugement am\195\169lior\195\169", + ["Improved Kick"] = "Coup de pied am\195\169lior\195\169", + ["Improved Kidney Shot"] = "Aiguillon perfide am\195\169lior\195\169", + ["Improved Lash of Pain"] = "Fouet de la douleur am\195\169lior\195\169", + ["Improved Lay on Hands"] = "Imposition des mains am\195\169lior\195\169e", + ["Improved Lesser Healing Wave"] = "Vague de soins inf\195\169rieurs am\195\169lior\195\169e", + ["Improved Life Tap"] = "Connexion am\195\169lior\195\169e", + ["Improved Lightning Bolt"] = "Eclair am\195\169lior\195\169", + ["Improved Lightning Shield"] = "Bouclier de foudre am\195\169lior\195\169", + ["Improved Magma Totem"] = "Totem de Magma am\195\169lior\195\169", + ["Improved Mana Burn"] = "Br\195\187lure de mana am\195\169lior\195\169e", + ["Improved Mana Shield"] = "Bouclier de mana am\195\169lior\195\169", + ["Improved Mana Spring Totem"] = "Totem Fontaine de mana am\195\169lior\195\169", + ["Improved Mark of the Wild"] = "Marque du fauve am\195\169lior\195\169e", + ["Improved Mend Pet"] = "Gu\195\169rison du familier am\195\169lior\195\169e", + ["Improved Mind Blast"] = "Attaque mentale am\195\169lior\195\169e", + ["Improved Moonfire"] = "Eclat lunaire am\195\169lior\195\169", + ["Improved Nature's Grasp"] = "Emprise de la nature am\195\169lior\195\169e", + ["Improved Overpower"] = "Fulgurance am\195\169lior\195\169e", + ["Improved Power Word: Fortitude"] = "Mot de pouvoir : Robustesse am\195\169lior\195\169", + ["Improved Power Word: Shield"] = "Mot de pouvoir : Bouclier am\195\169lior\195\169", + ["Improved Prayer of Healing"] = "Pri\195\168re de soins am\195\169lior\195\169e", + ["Improved Psychic Scream"] = "Cri psychique am\195\169lior\195\169", + ["Improved Pummel"] = "Vol\195\169e de coups am\195\169lior\195\169e", + ["Improved Regrowth"] = "R\195\169tablissement am\195\169lior\195\169", + ["Improved Reincarnation"] = "R\195\169incarnation am\195\169lior\195\169e", + ["Improved Rejuvenation"] = "R\195\169cup\195\169ration am\195\169lior\195\169e", + ["Improved Rend"] = "Pourfendre am\195\169lior\195\169", + ["Improved Renew"] = "R\195\169novation am\195\169lior\195\169e", + ["Improved Retribution Aura"] = "Aura de vindicte am\195\169lior\195\169e", + ["Improved Revenge"] = "Vengeance am\195\169lior\195\169e", + ["Improved Revive Pet"] = "Ressusciter le familier am\195\169lior\195\169", + ["Improved Righteous Fury"] = "Fureur vertueuse am\195\169lior\195\169e", + ["Improved Rockbiter Weapon"] = "Arme Croque-roc am\195\169lior\195\169e", + ["Improved Rupture"] = "Rupture am\195\169lior\195\169e", + ["Improved Sap"] = "Assommer am\195\169lior\195\169", + ["Improved Scorch"] = "Br\195\187lure am\195\169lior\195\169e", + ["Improved Scorpid Sting"] = "Piq\195\187re de scorpide am\195\169lior\195\169e", + ["Improved Seal of Righteousness"] = "Sceau de pi\195\169t\195\169 am\195\169lior\195\169", + ["Improved Seal of the Crusader"] = "Sceau du Crois\195\169 am\195\169lior\195\169", + ["Improved Searing Pain"] = "Douleur br\195\187lante am\195\169lior\195\169e", + ["Improved Searing Totem"] = "Totem incendiaire am\195\169lior\195\169", + ["Improved Serpent Sting"] = "Morsure de serpent am\195\169lior\195\169e", + ["Improved Shadow Bolt"] = "Trait de l'ombre am\195\169lior\195\169", + ["Improved Shadow Word: Pain"] = "Mot de l'ombre : Douleur am\195\169lior\195\169", + ["Improved Shield Bash"] = "Coup de bouclier am\195\169lior\195\169", + ["Improved Shield Block"] = "Ma\195\174trise du blocage am\195\169lior\195\169e", + ["Improved Shield Wall"] = "Mur protecteur am\195\169lior\195\169", + ["Improved Shred"] = "Lambeau am\195\169lior\195\169", + ["Improved Sinister Strike"] = "Attaque pernicieuse am\195\169lior\195\169e", + ["Improved Slam"] = "Heurtoir am\195\169lior\195\169", + ["Improved Slice and Dice"] = "D\195\169biter am\195\169lior\195\169", + ["Improved Spellstone"] = "Pierre de sort am\195\169lior\195\169e", + ["Improved Sprint"] = "Sprint am\195\169lior\195\169", + ["Improved Starfire"] = "Feu stellaire am\195\169lior\195\169", + ["Improved Stoneclaw Totem"] = "Totem de Griffes de pierre am\195\169lior\195\169", + ["Improved Stoneskin Totem"] = "Totem de Peau de pierre am\195\169lior\195\169", + ["Improved Strength of Earth Totem"] = "Totem de Force de la Terre am\195\169lior\195\169", + ["Improved Succubus"] = "Succube am\195\169lior\195\169e", + ["Improved Sunder Armor"] = "Fracasser armure am\195\169lior\195\169", + ["Improved Taunt"] = "Provocation am\195\169lior\195\169e", + ["Improved Thorns"] = "Epines am\195\169lior\195\169es", + ["Improved Thunder Clap"] = "Coup de tonnerre am\195\169lior\195\169", + ["Improved Tranquility"] = "Tranquillit\195\169 am\195\169lior\195\169e", + ["Improved Vampiric Embrace"] = "Etreinte vampirique am\195\169lior\195\169e", + ["Improved Vanish"] = "Disparition am\195\169lior\195\169e", + ["Improved Voidwalker"] = "Marcheur du Vide am\195\169lior\195\169", + ["Improved Windfury Weapon"] = "Arme Furie-des-vents am\195\169lior\195\169e", + ["Improved Wing Clip"] = "Coupure d'ailes am\195\169lior\195\169e", + ["Improved Wrath"] = "Col\195\168re am\195\169lior\195\169e", + ["Incinerate"] = "Incin\195\169rer", + ["Inferno"] = "Inferno", + ["Initiative"] = "Initiative", + ["Inner Fire"] = "Feu int\195\169rieur", + ["Inner Focus"] = "Focalisation am\195\169lior\195\169e", + ["Innervate"] = "Innervation", + ["Insect Swarm"] = "Essaim d'insectes", + ["Inspiration"] = "Inspiration", + ["Instant Poison II"] = "Poison instantan\195\169 II", + ["Instant Poison III"] = "Poison instantan\195\169 III", + ["Instant Poison IV"] = "Poison instantan\195\169 IV", + ["Instant Poison V"] = "Poison instantan\195\169 V", + ["Instant Poison VI"] = "Poison instantan\195\169 VI", + ["Instant Poison"] = "Poison instantan\195\169", + ["Intensity"] = "Intensit\195\169", + ["Intercept"] = "Interception", + ["Intercept Stun"] = "Interception étourdissante", + ["Intimidating Shout"] = "Cri d\226\128\153intimidation", + ["Intimidation"] = "Intimidation", + ["Iron Will"] = "Volont\195\169 de fer", + ["Judgement of Command"] = "Jugement d'autorit\195\169", + ["Judgement of Justice"] = "Jugement de justice", + ["Judgement of Light"] = "Jugement de lumi\195\168re", + ["Judgement of Righteousness"] = "Jugement de pi\195\169t\195\169", + ["Judgement of Wisdom"] = "Jugement de sagesse", + ["Judgement of the Crusader"] = "Jugement du Crois\195\169", + ["Judgement"] = "Jugement", + ["Kick"] = "Coup de pied", + ["Kick - Silenced"] = "Coup de pied - Silencieux", + ["Kidney Shot"] = "Aiguillon perfide", + ["Killer Instinct"] = "Instinct du tueur", + ["Kodo Riding"] = "Monte de kodo", + ["Lash of Pain"] = "Fouet de la douleur", + ["Last Stand"] = "Dernier rempart", + ["Lasting Judgement"] = "Jugement durable", + ["Lay on Hands"] = "Imposition des mains", + ["Leader of the Pack"] = "Chef de la meute", + ["Leather"] = "Cuir", + ["Leatherworking"] = "Travail du cuir", + ["Lesser Heal"] = "Soins inf\195\169rieurs", + ["Lesser Healing Wave"] = "Vague de soins inf\195\169rieurs", + ["Lesser Invisibility"] = "Invisibilit\195\169 inf\195\169rieure", + ["Lethal Shots"] = "Coups fatals", + ["Lethality"] = "Mortalit\195\169", + ["Levitate"] = "L\195\169vitation", + ["Libram"] = "Libram", + ["Life Tap"] = "Connexion", + ["Lightning Bolt"] = "Eclair", + ["Lightning Breath"] = "Souffle de foudre", + ["Lightning Mastery"] = "Ma\195\174trise de la foudre", + ["Lightning Reflexes"] = "R\195\169flexes \195\169clairs", + ["Lightning Shield"] = "Bouclier de foudre", + ["Lightwell Renew"] = "R\195\169novation du Puits de lumi\195\168re", + ["Lightwell"] = "Puits de lumi\195\168re", + ["Lockpicking"] = "Crochetage", + ["Long Daze"] = "H\195\169b\195\169tement prolong\195\169", + ["Mace Specialization"] = "Sp\195\169cialisation Masse", + ["Mace Stun Effect"] = "Effet \195\169tourdissant de la masse", + ["Mage Armor"] = "Armure du mage", + ["Magma Totem"] = "Totem de Magma", + ["Mail"] = "Mailles", + ["Malice"] = "Malice", + ["Mana Burn"] = "Br\195\187lure de mana", + ["Mana Shield"] = "Bouclier de mana", + ["Mana Spring Totem"] = "Totem Fontaine de mana", + ["Mana Tide Totem"] = "Totem de Vague de mana", + ["Mangle"] = "Mutilation", + ["Mark of the Wild"] = "Marque du fauve", + ["Martyrdom"] = "Martyre", + ["Master Demonologist"] = "Ma\195\174tre d\195\169monologue", + ["Master Summoner"] = "Ma\195\174tre invocateur", + ["Master of Deception"] = "Ma\195\174tre des illusions", + ["Maul"] = "Mutiler", + ["Mechanostrider Piloting"] = "Pilotage de m\195\169canotrotteur", + ["Meditation"] = "M\195\169ditation", + ["Melee Specialization"] = "Sp\195\169cialisation M\195\170l\195\169e", + ["Mend Pet"] = "Gu\195\169rison du familier", + ["Mental Agility"] = "Sagacit\195\169", + ["Mental Strength"] = "Force mentale", + ["Mind Blast"] = "Attaque mentale", + ["Mind Control"] = "Contr\195\180le mental", + ["Mind Flay"] = "Fouet mental", + ["Mind Soothe"] = "Apaisement", + ["Mind Vision"] = "Vision t\195\169l\195\169pathique", + ["Mind-numbing Poison II"] = "Poison de distraction mentale II", + ["Mind-numbing Poison III"] = "Poison de distraction mentale III", + ["Mind-numbing Poison"] = "Poison de distraction mentale", + ["Mining"] = "Minage", + ["Mocking Blow"] = "Coup railleur", + ["Mongoose Bite"] = "Morsure de la mangouste", + ["Monster Slaying"] = "Tueur de monstres", + ["Moonfire"] = "Eclat lunaire", + ["Moonfury"] = "Fureur lunaire", + ["Moonglow"] = "Lueur de la lune", + ["Moonkin Aura"] = "Aura de s\195\169l\195\169nien", + ["Moonkin Form"] = "Forme de s\195\169l\195\169nien", + ["Mortal Shots"] = "Coups mortels", + ["Mortal Strike"] = "Frappe mortelle", + ["Multi-Shot"] = "Fl\195\168ches multiples", + ["Murder"] = "Meurtre", + ["Natural Armor"] = "Armure naturelle", + ["Natural Shapeshifter"] = "Changeforme naturel", + ["Natural Weapons"] = "Armes naturelles", + ["Nature Resistance Totem"] = "Totem de r\195\169sistance \195\160 la Nature", + ["Nature Resistance"] = "R\195\169sistance \195\160 la Nature", + ["Nature's Focus"] = "Focalisation de la nature", + ["Nature's Grace"] = "Gr\195\162ce de la nature", + ["Nature's Grasp"] = "Emprise de la nature", + ["Nature's Reach"] = "Allonge de la Nature", + ["Nature's Swiftness"] = "Rapidit\195\169 de la nature", + ["Nightfall"] = "Cr\195\169puscule", + ["Omen of Clarity"] = "Augure de clart\195\169", + ["One-Handed Axes"] = "Haches", + ["One-Handed Maces"] = "Masses", + ["One-Handed Swords"] = "Ep\195\169es", + ["One-Handed Weapon Specialization"] = "Sp\195\169cialisation Arme 1M", + ["Opening - No Text"] = "Ouverture - pas de texte", + ["Opening"] = "Ouverture", + ["Opportunity"] = "Opportunit\195\169", + ["Overpower"] = "Fulgurance", + ["Paranoia"] = "Parano\195\175a", + ["Parry"] = "Parade", + ["Pathfinding"] = "Science des chemins", + ["Perception"] = "Perception", + ["Permafrost"] = "Gel prolong\195\169", + ["Pet Aggression"] = "Agressivit\195\169 du familier", + ["Pet Hardiness"] = "Robustesse du familier", + ["Pet Recovery"] = "R\195\169tablissement du familier", + ["Pet Resistance"] = "R\195\169sistance du familier", + ["Phase Shift"] = "Changement de phase", + ["Pick Lock"] = "Crochetage", + ["Pick Pocket"] = "Vol \195\160 la tire", + ["Piercing Howl"] = "Hurlement per\195\167ant", + ["Piercing Ice"] = "Glace per\195\167ante", + ["Plate Mail"] = "Armure en plaques", + ["Poison Cleansing Totem"] = "Totem de Purification du poison", + ["Poisons"] = "Poisons", + ["Polearm Specialization"] = "Sp\195\169cialisation Arme d'hast", + ["Polearms"] = "Armes d'hast", + ["Polymorph"] = "M\195\169tamorphose", + ["Polymorph: Pig"] = "M\195\169tamorphose: cochon", + ["Polymorph: Turtle"] = "M\195\169tamorphose: Tortue", -- all other polymorph spells don't have a capital letter before the animal name, to test + ["Portal: Darnassus"] = "Portail : Darnassus", + ["Portal: Ironforge"] = "Portail : Ironforge", + ["Portal: Orgrimmar"] = "Portail : Orgrimmar", + ["Portal: Stormwind"] = "Portail : Stormwind", + ["Portal: Thunder Bluff"] = "Portail : Thunder Bluff", + ["Portal: Undercity"] = "Portail : Undercity", + ["Pounce Bleed"] = "Traquenard sanglant", + ["Pounce"] = "Traquenard", + ["Power Infusion"] = "Infusion de puissance", + ["Power Word: Fortitude"] = "Mot de pouvoir : Robustesse", + ["Power Word: Shield"] = "Mot de pouvoir : Bouclier", + ["Prayer of Fortitude"] = "Pri\195\168re de robustesse", + ["Prayer of Healing"] = "Pri\195\168re de soins", + ["Prayer of Shadow Protection"] = "Pri\195\168re de protection contre l'Ombre", + ["Prayer of Spirit"] = "Pri\195\168re d'Esprit", + ["Precision"] = "Pr\195\169cision", + ["Predatory Strikes"] = "Frappes de pr\195\169dateur", + ["Premeditation"] = "Pr\195\169m\195\169ditation", + ["Preparation"] = "Pr\195\169paration", + ["Presence of Mind"] = "Pr\195\169sence spirituelle", + ["Primal Fury"] = "Fureur primitive", + ["Prowl"] = "R\195\180der", + ["Psychic Scream"] = "Cri psychique", + ["Pummel"] = "Vol\195\169e de coups", + ["Purge"] = "Expiation", + ["Purification"] = "Purification", + ["Purify"] = "Purification", + ["Pursuit of Justice"] = "Poursuite de la justice", + ["Pyroblast"] = "Explosion pyrotechnique", + ["Pyroclasm"] = "Pyroclasme", + ["Quick Shots"] = "Tir rapide", + ["Quickness"] = "Rapidit\195\169", + ["Rain of Fire"] = "Pluie de feu", + ["Rake"] = "Griffure", + ["Ram Riding"] = "Monte de b\195\169lier", + ["Ranged Weapon Specialization"] = "Sp\195\169cialisation Armes \195\160 distance", + ["Rapid Concealment"] = "Dissimulation rapide", + ["Rapid Fire"] = "Tir rapide", + ["Raptor Riding"] = "Monte de raptor", + ["Raptor Strike"] = "Attaque du raptor", + ["Ravage"] = "Ravage", + ["Readiness"] = "Promptitude", + ["Rebirth"] = "Renaissance", + ["Reckless Charge"] = "Charge furieuse", + ["Recklessness"] = "T\195\169m\195\169rit\195\169", + ["Reckoning"] = "R\195\169tribution", + ["Redemption"] = "R\195\169demption", + ["Redoubt"] = "Redoute", + ["Reflection"] = "Renvoi", + ["Regeneration"] = "R\195\169g\195\169n\195\169ration", + ["Regrowth"] = "R\195\169tablissement", + ["Reincarnation"] = "R\195\169incarnation", + ["Rejuvenation"] = "R\195\169cup\195\169ration", + ["Relentless Strikes"] = "Frappes implacables", + ["Remorseless"] = "Impitoyable", + ["Remorseless Attacks"] = "Attaques impitoyables", + ["Remove Curse"] = "D\195\169livrance de la mal\195\169diction", + ["Remove Insignia"] = "Enlever l'insigne", + ["Remove Lesser Curse"] = "D\195\169livrance de la mal\195\169diction mineure", + ["Rend"] = "Pourfendre", + ["Renew"] = "R\195\169novation", + ["Repentance"] = "Repentir", + ["Resurrection"] = "R\195\169surrection", + ["Retaliation"] = "Repr\195\169sailles", + ["Retribution Aura"] = "Aura de vindicte", + ["Revenge Stun"] = "Etourdissement vengeur", + ["Revenge"] = "Vengeance", + ["Reverberation"] = "R\195\169verb\195\169ration", + ["Revive Pet"] = "Ressusciter le familier", + ["Righteous Fury"] = "Fureur vertueuse", + ["Rip"] = "D\195\169chirure", + ["Riposte"] = "Riposte", + ["Ritual of Doom Effect"] = "Effet Rituel de mal\195\169diction", + ["Ritual of Doom"] = "Rituel de mal\195\169diction", + ["Ritual of Summoning"] = "Rituel d'invocation", + ["Rockbiter Weapon"] = "Arme Croque-roc", + ["Rogue Passive"] = "Voleur", + ["Ruin"] = "Ruine", + ["Rupture"] = "Rupture", + ["Ruthlessness"] = "N\195\169m\195\169sis", + ["Sacrifice"] = "Sacrifice", + ["Safe Fall"] = "Chute amortie", + ["Sanctity Aura"] = "Aura de saintet\195\169", + ["Sap"] = "Assommer", + ["Savage Fury"] = "Furie sauvage", + ["Savage Strikes"] = "Frappes sauvages", + ["Scare Beast"] = "Effrayer une b\195\170te", + ["Scatter Shot"] = "Fl\195\168che de dispersion", + ["Scorch"] = "Br\195\187lure", + ["Scorpid Poison"] = "Poison de scorpide", + ["Scorpid Sting"] = "Piq\195\187re de scorpide", + ["Screech"] = "Hurlement", + ["Seal Fate"] = "Scelle le destin", + ["Seal of Command"] = "Sceau d'autorit\195\169", + ["Seal of Justice"] = "Sceau de justice", + ["Seal of Light"] = "Sceau de lumi\195\168re", + ["Seal of Righteousness"] = "Sceau de pi\195\169t\195\169", + ["Seal of Wisdom"] = "Sceau de sagesse", + ["Seal of the Crusader"] = "Sceau du Crois\195\169", + ["Searing Light"] = "Lumi\195\168re incendiaire", + ["Searing Pain"] = "Douleur br\195\187lante", + ["Searing Totem"] = "Totem incendiaire", + ["Seduction"] = "S\195\169duction", + ["Sense Demons"] = "D\195\169tection des d\195\169mons", + ["Sense Undead"] = "D\195\169tection des morts-vivants", + ["Sentry Totem"] = "Totem Sentinelle", + ["Serpent Sting"] = "Morsure de serpent", + ["Setup"] = "Pr\195\169paratifs", + ["Shackle Undead"] = "Entraves des morts-vivants", + ["Shadow Affinity"] = "Affinit\195\169 avec l'ombre", + ["Shadow Bolt"] = "Trait de l'ombre", + ["Shadow Focus"] = "Focalisation de l'ombre", + ["Shadow Mastery"] = "Ma\195\174trise de l'ombre", + ["Shadow Protection"] = "Protection contre l'Ombre", + ["Shadow Reach"] = "Allonge de l'Ombre", + ["Shadow Resistance Aura"] = "Aura de r\195\169sistance \195\160 l'Ombre", + ["Shadow Resistance"] = "R\195\169sistance \195\160 l'Ombre", + ["Shadow Trance"] = "Transe de l'ombre", + ["Shadow Vulnerability"] = "Vuln\195\169rabilit\195\169 \195\160 l'ombre", + ["Shadow Ward"] = "Gardien de l'ombre", + ["Shadow Weaving"] = "Tissage de l'ombre", + ["Shadow Word: Pain"] = "Mot de l'ombre\194\160: Douleur", + ["Shadowburn"] = "Br\195\187lure de l'ombre", + ["Shadowform"] = "Forme d'Ombre", + ["Shadowguard"] = "Garde de l'ombre", + ["Shadowmeld Passive"] = "Camouflage dans l'ombre", + ["Shadowmeld"] = "Camouflage dans l'ombre", + ["Sharpened Claws"] = "Griffes aiguis\195\169es", + ["Shatter"] = "Fracasser", + ["Shell Shield"] = "Carapace bouclier", + ["Shield Bash"] = "Coup de bouclier", + ["Shield Bash - Silenced"] = "Coup de bouclier - silencieux", -- seems to be the only "- Silenced" not having a Cap letter, will try to test! + ["Shield Block"] = "Ma\195\174trise du blocage", + ["Shield Slam"] = "Heurt de bouclier", + ["Shield Specialization"] = "Sp\195\169cialisation Bouclier", + ["Shield Wall"] = "Mur protecteur", + ["Shield"] = "Bouclier", + ["Shoot Bow"] = "Tir \195\160 l'arc", + ["Shoot Crossbow"] = "Tir \195\160 l\226\128\153arbal\195\168te", + ["Shoot Gun"] = "Tir avec une arme \195\160 feu", + ["Shoot"] = "Tir", + ["Shred"] = "Lambeau", + ["Silence"] = "Silence", + ["Silent Resolve"] = "R\195\169solution silencieuse", + ["Sinister Strike"] = "Attaque pernicieuse", + ["Siphon Life"] = "Siphon de vie", + ["Skinning"] = "D\195\169pe\195\167age", + ["Slam"] = "Heurtoir", + ["Sleep"] = "Sommeil", + ["Slice and Dice"] = "D\195\169biter", + ["Slow Fall"] = "Chute lente", + ["Smelting"] = "Fondre", + ["Smite"] = "Ch\195\162timent", + ["Soothe Animal"] = "Apaiser les animaux", + ["Soothing Kiss"] = "Baiser apaisant", + ["Soul Fire"] = "Feu de l'\195\162me", + ["Soul Link"] = "Lien spirituel", + ["Soul Siphon"] = "Siphon d'\195\162me", + ["Soulstone Resurrection"] = "R\195\169surrection de Pierre d'\195\162me", + ["Spell Lock"] = "Verrou magique", + ["Spell Warding"] = "Protection contre les sorts", + ["Spirit Bond"] = "Engagement spirituel", + ["Spirit Tap"] = "Connexion spirituelle", + ["Spirit of Redemption"] = "Esprit de r\195\169demption", + ["Spiritual Focus"] = "Focalisation spirituelle", + ["Spiritual Guidance"] = "Direction spirituelle", + ["Spiritual Healing"] = "Soins spirituels", + ["Sprint"] = "Sprint", + ["Starfire"] = "Feu stellaire", + ["Starfire Stun"] = "Feu stellaire \195\169tourdissant", + ["Starshards"] = "Eclats stellaires", + ["Staves"] = "B\195\162tons", + ["Stealth"] = "Camouflage", + ["Stoneclaw Totem"] = "Totem de Griffes de pierre", + ["Stoneform"] = "Forme de pierre", + ["Stoneskin Totem"] = "Totem de Peau de pierre", + ["Stormstrike"] = "Courroux naturel", + ["Strength of Earth Totem"] = "Totem de Force de la Terre", + ["Stuck"] = "Bloqu\195\169", + ["Subtlety"] = "Discr\195\169tion", + ["Suffering"] = "Souffrance", + ["Summon Charger"] = "Invocation de destrier", + ["Summon Dreadsteed"] = "Invocation d'un Destrier de l'Effroi", + ["Summon Felhunter"] = "Invocation d'un chasseur corrompu", + ["Summon Felsteed"] = "Invocation d'un palefroi corrompu", + ["Summon Imp"] = "Invocation d'un diablotin", + ["Summon Succubus"] = "Invocation d'une succube", + ["Summon Voidwalker"] = "Invocation d'un marcheur du Vide", + ["Summon Warhorse"] = "Invocation d'un cheval de guerre", + ["Sunder Armor"] = "Fracasser armure", + ["Suppression"] = "Suppression", + ["Surefooted"] = "Pied s\195\187r", + ["Survivalist"] = "Survivant", + ["Sweeping Strikes"] = "Attaques circulaires", + ["Swiftmend"] = "Prompte guérison", + ["Swipe"] = "Balayage", + ["Sword Specialization"] = "Sp\195\169cialisation Ep\195\169e", + ["Tactical Mastery"] = "Ma\195\174trise tactique", + ["Tailoring"] = "Couture", + ["Tainted Blood"] = "Corruption sanguine", + ["Tame Beast"] = "Dompte une b\195\170te", + ["Tamed Pet Passive"] = "Familier dompt\195\169", + ["Taunt"] = "Provocation", + ["Teleport: Darnassus"] = "T\195\169l\195\169portation : Darnassus", + ["Teleport: Ironforge"] = "T\195\169l\195\169portation : Ironforge", + ["Teleport: Moonglade"] = "T\195\169l\195\169portation : Reflet-de-Lune", + ["Teleport: Orgrimmar"] = "T\195\169l\195\169portation : Orgrimmar", + ["Teleport: Stormwind"] = "T\195\169l\195\169portation : Stormwind", + ["Teleport: Thunder Bluff"] = "T\195\169l\195\169portation : Thunder Bluff", + ["Teleport: Undercity"] = "T\195\169l\195\169portation : Undercity", + ["The Human Spirit"] = "L'esprit humain", + ["Thick Hide"] = "Peau \195\169paisse", + ["Thorns"] = "Epines", + ["Throw"] = "Lancer", + ["Throwing Specialization"] = "Sp\195\169cialisation Armes de jet", + ["Throwing Weapon Specialization"] = "Sp\195\169cialisation Armes de jet", + ["Thrown"] = "Armes de jet", + ["Thunder Clap"] = "Coup de tonnerre", + ["Thundering Strikes"] = "Frappe foudroyante", + ["Thunderstomp"] = "Grondeterre", + ["Tidal Focus"] = "Focalisation des flots", + ["Tidal Mastery"] = "Ma\195\174trise des flots", + ["Tiger Riding"] = "Monte de tigre", + ["Tiger's Fury"] = "Fureur du tigre", + ["Torment"] = "Tourment", + ["Totem"] = "Totem", + ["Totemic Focus"] = "Focalisation tot\195\169mique", + ["Touch of Weakness"] = "Toucher de faiblesse", + ["Toughness"] = "R\195\169sistance", + ["Track Beasts"] = "Pistage des b\195\170tes", + ["Track Demons"] = "Pistage des d\195\169mons", + ["Track Dragonkin"] = "Pistage des draconiens", + ["Track Elementals"] = "Pistage des \195\169l\195\169mentaires", + ["Track Giants"] = "Pistage des g\195\169ants", + ["Track Hidden"] = "Pistage des camoufl\195\169s", + ["Track Humanoids"] = "Pistage des humano\195\175des", + ["Track Undead"] = "Pistage des morts-vivants", + ["Tranquil Air Totem"] = "Totem de Tranquillit\195\169 de l'air", + ["Tranquil Spirit"] = "Tranquillit\195\169 de l'esprit", + ["Tranquility"] = "Tranquillit\195\169", + ["Tranquilizing Shot"] = "Tir tranquillisant", + ["Trap Mastery"] = "Ma\195\174trise des pi\195\168ges", + ["Travel Form"] = "Forme de voyage", + ["Tremor Totem"] = "Totem de S\195\169isme", + ["Tribal Leatherworking"] = "Travail du cuir tribal", + ["Trueshot Aura"] = "Aura de pr\195\169cision", + ["Turn Undead"] = "Renvoi des morts-vivants", + ["Two-Handed Axes and Maces"] = "Haches et masses \195\160 deux mains", + ["Two-Handed Axes"] = "Haches \195\160 deux mains", + ["Two-Handed Maces"] = "Masses \195\160 deux mains", + ["Two-Handed Swords"] = "Ep\195\169es \195\160 deux mains", + ["Two-Handed Weapon Specialization"] = "Sp\195\169cialisation Arme 2M", + ["Unarmed"] = "Mains nues", + ["Unbreakable Will"] = "Volont\195\169 inflexible", + ["Unbridled Wrath Effect"] = "Effet Col\195\168re d\195\169cha\195\174n\195\169e", + ["Unbridled Wrath"] = "Col\195\168re d\195\169cha\195\174n\195\169e", + ["Undead Horsemanship"] = "Monte de cheval squelette", + ["Underwater Breathing"] = "Respiration aquatique", + ["Unending Breath"] = "Respiration interminable", + ["Unholy Power"] = "Puissance impie", + ["Unleashed Fury"] = "Fureur lib\195\169r\195\169e", + ["Unyielding Faith"] = "Foi inflexible", + ["Vampiric Embrace"] = "Etreinte vampirique", + ["Vanish"] = "Disparition", + ["Vanished"] = "Invisible", + ["Vengeance"] = "Vengeance", + ["Vigor"] = "Vigueur", + ["Vile Poisons"] = "Poisons abominables", + ["Vindication"] = "Justification", + ["Viper Sting"] = "Morsure de vip\195\168re", + ["Volley"] = "Salve", + ["Wand Specialization"] = "Sp\195\169cialisation Baguette", + ["Wands"] = "Baguettes", + ["War Stomp"] = "Choc martial", + ["Water Breathing"] = "Respiration aquatique", + ["Water Walking"] = "Marcher sur l\226\128\153eau", + ["Weakened Soul"] = "Ame affaiblie", + ["Weaponsmith"] = "Fabricant d'armes", + ["Whirlwind"] = "Tourbillon", + ["Will of the Forsaken"] = "Volont\195\169 des R\195\169prouv\195\169s", + ["Windfury Totem"] = "Totem Furie-des-vents", + ["Windfury Weapon"] = "Arme Furie-des-vents", + ["Windwall Totem"] = "Totem de Mur des vents", + ["Wing Clip"] = "Coupure d'ailes", + ["Winter's Chill"] = "Froid hivernal", + ["Wisp Spirit"] = "Esprit feu follet", + ["Wolf Riding"] = "Monte de loup", + ["Wound Poison II"] = "Poison douloureux II", + ["Wound Poison III"] = "Poison douloureux III", + ["Wound Poison IV"] = "Poison douloureux IV", + ["Wound Poison"] = "Poison douloureux", + ["Wrath"] = "Col\195\168re", + ["Wyvern Sting"] = "Piq\195\187re de wyverne" + } +end) + +local spellIcons = { + ["Abolish Disease"] = "Spell_Nature_NullifyDisease", + ["Abolish Poison Effect"] = "Spell_Nature_NullifyPoison_02", + ["Abolish Poison"] = "Spell_Nature_NullifyPoison_02", + ["Activate MG Turret"] = "INV_Weapon_Rifle_10", + ["Adrenaline Rush"] = "Spell_Shadow_ShadowWordDominate", + ["Aftermath"] = "Spell_Fire_Fire", + ["Aggression"] = "Ability_Racial_Avatar", + ["Aimed Shot"] = "INV_Spear_07", + ["Alchemy"] = "Trade_Alchemy", + ["Ambush"] = "Ability_Rogue_Ambush", + ["Amplify Curse"] = "Spell_Shadow_Contagion", + ["Amplify Magic"] = "Spell_Holy_FlashHeal", + ["Ancestral Healing"] = "Spell_Nature_UndyingStrength", + ["Ancestral Knowledge"] = "Spell_Shadow_GrimWard", + ["Ancestral Spirit"] = "Spell_Nature_Regenerate", + ["Anger Management"] = "Spell_Holy_BlessingOfStamina", + ["Anticipation"] = "Spell_Nature_MirrorImage", + ["Aquatic Form"] = "Ability_Druid_AquaticForm", + ["Arcane Brilliance"] = "Spell_Holy_ArcaneIntellect", + ["Arcane Concentration"] = "Spell_Shadow_ManaBurn", + ["Arcane Explosion"] = "Spell_Nature_WispSplode", + ["Arcane Focus"] = "Spell_Holy_Devotion", + ["Arcane Instability"] = "Spell_Shadow_Teleport", + ["Arcane Intellect"] = "Spell_Holy_MagicalSentry", + ["Arcane Meditation"] = "Spell_Shadow_SiphonMana", + ["Arcane Mind"] = "Spell_Shadow_Charm", + ["Arcane Missiles"] = "Spell_Nature_StarFall", + ["Arcane Power"] = "Spell_Nature_Lightning", + ["Arcane Resistance"] = "Spell_Nature_StarFall", + ["Arcane Shot"] = "Ability_ImpalingBolt", + ["Arcane Subtlety"] = "Spell_Holy_DispelMagic", + ["Arctic Reach"] = "Spell_Shadow_DarkRitual", + ["Aspect of the Beast"] = "Ability_Mount_PinkTiger", + ["Aspect of the Cheetah"] = "Ability_Mount_JungleTiger", + ["Aspect of the Hawk"] = "Spell_Nature_RavenForm", + ["Aspect of the Monkey"] = "Ability_Hunter_AspectOfTheMonkey", + ["Aspect of the Pack"] = "Ability_Mount_WhiteTiger", + ["Aspect of the Wild"] = "Spell_Nature_ProtectionformNature", + ["Astral Recall"] = "Spell_Nature_AstralRecal", + ["Attack"] = "Temp", + ["Attacking"] = "Temp", + ["Auto Shot"] = "Ability_Whirlwind", + ["Axe Specialization"] = "INV_Axe_06", + ["Backstab"] = "Ability_BackStab", + ["Bane"] = "Spell_Shadow_DeathPact", + ["Banish"] = "Spell_Shadow_Cripple", + ["Barkskin Effect"] = "Spell_Nature_StoneClawTotem", + ["Barkskin"] = "Spell_Nature_StoneClawTotem", + ["Barrage"] = "Ability_UpgradeMoonGlaive", + ["Bash"] = "Ability_Druid_Bash", + ["Basic Campfire"] = "Spell_Fire_Fire", + ["Battle Shout"] = "Ability_Warrior_BattleShout", + ["Battle Stance Passive"] = "Ability_Warrior_OffensiveStance", + ["Battle Stance"] = "Ability_Warrior_OffensiveStance", + ["Bear Form"] = "Ability_Racial_BearForm", + ["Beast Lore"] = "Ability_Physical_Taunt", + ["Beast Slaying"] = "INV_Misc_Pelt_Bear_Ruin_02", + ["Beast Training"] = "Ability_Hunter_BeastCall02", + ["Benediction"] = "Spell_Frost_WindWalkOn", + ["Berserker Rage"] = "Spell_Nature_AncestralGuardian", + ["Berserker Stance Passive"] = "Ability_Racial_Avatar", + ["Berserker Stance"] = "Ability_Racial_Avatar", + ["Berserking"] = "Racial_Troll_Berserk", + ["Bestial Discipline"] = "Spell_Nature_AbolishMagic", + ["Bestial Swiftness"] = "Ability_Druid_Dash", + ["Bestial Wrath"] = "Ability_Druid_FerociousBite", + ["Bite"] = "Ability_Racial_Cannibalize", + ["Black Arrow"] = "Ability_TheBlackArrow", + ["Blackout"] = "Spell_Shadow_GatherShadows", + ["Blacksmithing"] = "Trade_BlackSmithing", + ["Blade Flurry"] = "Ability_Warrior_PunishingBlow", + ["Blast Wave"] = "Spell_Holy_Excorcism_02", + ["Blessed Recovery"] = "Spell_Holy_BlessedRecovery", + ["Blessing of Freedom"] = "Spell_Holy_SealOfValor", + ["Blessing of Kings"] = "Spell_Magic_MageArmor", + ["Blessing of Light"] = "Spell_Holy_PrayerOfHealing02", + ["Blessing of Might"] = "Spell_Holy_FistOfJustice", + ["Blessing of Protection"] = "Spell_Holy_SealOfProtection", + ["Blessing of Sacrifice"] = "Spell_Holy_SealOfSacrifice", + ["Blessing of Salvation"] = "Spell_Holy_SealOfSalvation", + ["Blessing of Sanctuary"] = "Spell_Nature_LightningShield", + ["Blessing of Wisdom"] = "Spell_Holy_SealOfWisdom", + ["Blind"] = "Spell_Shadow_MindSteal", + ["Blinding Powder"] = "INV_Misc_Ammo_Gunpowder_02", + ["Blink"] = "Spell_Arcane_Blink", + ["Blizzard"] = "Spell_Frost_IceStorm", + ["Block"] = "Ability_Defend", + ["Blood Craze"] = "Spell_Shadow_SummonImp", + ["Blood Frenzy"] = "Ability_GhoulFrenzy", + ["Blood Fury"] = "Racial_Orc_BerserkerStrength", + ["Blood Pact"] = "Spell_Shadow_BloodBoil", + ["Bloodrage"] = "Ability_Racial_BloodRage", + ["Bloodthirst"] = "Spell_Nature_BloodLust", + ["Booming Voice"] = "Spell_Nature_Purge", + ["Bow Specialization"] = "INV_Weapon_Bow_12", + ["Bows"] = "INV_Weapon_Bow_05", + ["Bright Campfire"] = "Spell_Fire_Fire", + ["Brutal Impact"] = "Ability_Druid_Bash", + ["Burning Soul"] = "Spell_Fire_Fire", + ["Call Pet"] = "Ability_Hunter_BeastCall", + ["Call of Flame"] = "Spell_Fire_Immolation", + ["Call of Thunder"] = "Spell_Nature_CallStorm", + ["Camouflage"] = "Ability_Stealth", + ["Cannibalize"] = "Ability_Racial_Cannibalize", + ["Cat Form"] = "Ability_Druid_CatForm", + ["Cataclysm"] = "Spell_Fire_WindsofWoe", + ["Chain Heal"] = "Spell_Nature_HealingWaveGreater", + ["Chain Lightning"] = "Spell_Nature_ChainLightning", + ["Challenging Roar"] = "Ability_Druid_ChallangingRoar", + ["Challenging Shout"] = "Ability_BullRush", + ["Charge Rage Bonus Effect"] = "Ability_Warrior_Charge", + ["Charge"] = "Ability_Warrior_Charge", + ["Cheap Shot"] = "Ability_CheapShot", + ["Chilled"] = "Spell_Frost_IceStorm", + ["Claw"] = "Ability_Druid_Rake", + ["Cleanse"] = "Spell_Holy_Renew", + ["Clearcasting"] = "Spell_Shadow_ManaBurn", + ["Cleave"] = "Ability_Warrior_Cleave", + ["Clever Traps"] = "Spell_Nature_TimeStop", + ["Closing"] = "Temp", + ["Cloth"] = "INV_Chest_Cloth_21", + ["Cobra Reflexes"] = "Spell_Nature_GuardianWard", + ["Cold Blood"] = "Spell_Ice_Lament", + ["Cold Snap"] = "Spell_Frost_WizardMark", + ["Combat Endurance"] = "Spell_Nature_AncestralGuardian", + ["Combustion"] = "Spell_Fire_SealOfFire", + ["Command"] = "Ability_Warrior_WarCry", + ["Concentration Aura"] = "Spell_Holy_MindSooth", + ["Concussion Blow"] = "Ability_ThunderBolt", + ["Concussion"] = "Spell_Fire_Fireball", + ["Concussive Shot"] = "Spell_Frost_Stun", + ["Cone of Cold"] = "Spell_Frost_Glacier", + ["Conflagrate"] = "Spell_Fire_Fireball", + ["Conjure Food"] = "INV_Misc_Food_10", + ["Conjure Mana Agate"] = "INV_Misc_Gem_Emerald_01", + ["Conjure Mana Citrine"] = "INV_Misc_Gem_Opal_01", + ["Conjure Mana Jade"] = "INV_Misc_Gem_Emerald_02", + ["Conjure Mana Ruby"] = "INV_Misc_Gem_Ruby_01", + ["Conjure Water"] = "INV_Drink_06", + ["Consecration"] = "Spell_Holy_InnerFire", + ["Consume Shadows"] = "Spell_Shadow_AntiShadow", + ["Convection"] = "Spell_Nature_WispSplode", + ["Conviction"] = "Spell_Holy_RetributionAura", + ["Cooking"] = "INV_Misc_Food_15", + ["Corruption"] = "Spell_Shadow_AbominationExplosion", + ["Counterattack"] = "Ability_Warrior_Challange", + ["Counterspell"] = "Spell_Frost_IceShock", + ["Cower"] = "Ability_Druid_Cower", + ["Create Firestone (Lesser)"]="INV_Ammo_FireTar", + ["Create Firestone"]="INV_Ammo_FireTar", + ["Create Firestone (Greater)"]="INV_Ammo_FireTar", + ["Create Firestone (Major)"]="INV_Ammo_FireTar", + ["Create Healthstone (Minor)"]="INV_Stone_04", + ["Create Healthstone (Lesser)"]="INV_Stone_04", + ["Create Healthstone"]="INV_Stone_04", + ["Create Healthstone (Greater)"]="INV_Stone_04", + ["Create Healthstone (Major)"]="INV_Stone_04", + ["Create Soulstone (Minor)"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Lesser)"]="Spell_Shadow_SoulGem", + ["Create Soulstone"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Greater)"]="Spell_Shadow_SoulGem", + ["Create Soulstone (Major)"]="Spell_Shadow_SoulGem", + ["Create Spellstone"]="INV_Misc_Gem_Sapphire_01", + ["Create Spellstone (Greater)"]="INV_Misc_Gem_Sapphire_01", + ["Create Spellstone (Major)"]="INV_Misc_Gem_Sapphire_01", + ["Crippling Poison II"] = "Ability_PoisonSting", + ["Crippling Poison"] = "Ability_PoisonSting", + ["Critical Mass"] = "Spell_Nature_WispHeal", + ["Crossbows"] = "INV_Weapon_Crossbow_01", + ["Cruelty"] = "Ability_Rogue_Eviscerate", + ["Cultivation"] = "INV_Misc_Flower_01", + ["Cure Disease"] = "Spell_Holy_NullifyDisease", + ["Cure Poison"] = "Spell_Nature_NullifyPoison", + ["Curse of Agony"] = "Spell_Shadow_CurseOfSargeras", + ["Curse of Doom Effect"] = "Spell_Shadow_AuraOfDarkness", + ["Curse of Doom"] = "Spell_Shadow_AuraOfDarkness", + ["Curse of Exhaustion"] = "Spell_Shadow_GrimWard", + ["Curse of Idiocy"] = "Spell_Shadow_MindRot", + ["Curse of Recklessness"] = "Spell_Shadow_UnholyStrength", + ["Curse of Shadow"] = "Spell_Shadow_CurseOfAchimonde", + ["Curse of Tongues"] = "Spell_Shadow_CurseOfTounges", + ["Curse of Weakness"] = "Spell_Shadow_CurseOfMannoroth", + ["Curse of the Elements"] = "Spell_Shadow_ChillTouch", + ["Dagger Specialization"] = "INV_Weapon_ShortBlade_05", + ["Daggers"] = "Ability_SteelMelee", + ["Dampen Magic"] = "Spell_Nature_AbolishMagic", + ["Dark Pact"] = "Spell_Shadow_DarkRitual", + ["Darkness"] = "Spell_Shadow_Twilight", + ["Dash"] = "Ability_Druid_Dash", + ["Deadly Poison II"] = "Ability_Rogue_DualWeild", + ["Deadly Poison III"] = "Ability_Rogue_DualWeild", + ["Deadly Poison IV"] = "Ability_Rogue_DualWeild", + ["Deadly Poison V"] = "Ability_Rogue_DualWeild", + ["Deadly Poison"] = "Ability_Rogue_DualWeild", + ["Death Coil"] = "Spell_Shadow_DeathCoil", + ["Death Wish"] = "Spell_Shadow_DeathPact", + ["Deep Wounds"] = "Ability_BackStab", + ["Defense"] = "Ability_Racial_ShadowMeld", + ["Defensive Stance Passive"] = "Ability_Warrior_DefensiveStance", + ["Defensive Stance"] = "Ability_Warrior_DefensiveStance", + ["Defensive State 2"] = "Ability_Defend", + ["Defensive State"] = "Ability_Defend", + ["Defiance"] = "Ability_Warrior_InnerRage", + ["Deflection"] = "Ability_Parry", + ["Demon Armor"] = "Spell_Shadow_RagingScream", + ["Demon Skin"] = "Spell_Shadow_RagingScream", + ["Demonic Embrace"] = "Spell_Shadow_Metamorphosis", + ["Demonic Sacrifice"] = "Spell_Shadow_PsychicScream", + ["Demoralizing Roar"] = "Ability_Druid_DemoralizingRoar", + ["Demoralizing Shout"] = "Ability_Warrior_WarCry", + ["Desperate Prayer"] = "Spell_Holy_Restoration", + ["Destructive Reach"] = "Spell_Shadow_CorpseExplode", + ["Detect Greater Invisibility"] = "Spell_Shadow_DetectInvisibility", + ["Detect Invisibility"] = "Spell_Shadow_DetectInvisibility", + ["Detect Lesser Invisibility"] = "Spell_Shadow_DetectLesserInvisibility", + ["Detect Magic"] = "Spell_Holy_Dizzy", + ["Detect Traps"] = "Ability_Spy", + ["Detect"] = "Ability_Hibernation", + ["Deterrence"] = "Ability_Whirlwind", + ["Devastation"] = "Spell_Fire_FlameShock", + ["Devotion Aura"] = "Spell_Holy_DevotionAura", + ["Devour Magic Effect"] = "Spell_Nature_Purge", + ["Devour Magic"] = "Spell_Nature_Purge", + ["Devouring Plague"] = "Spell_Shadow_BlackPlague", + ["Diplomacy"] = "INV_Misc_Note_02", + ["Dire Bear Form"] = "Ability_Racial_BearForm", + ["Disarm Trap"] = "Spell_Shadow_GrimWard", + ["Disarm"] = "Ability_Warrior_Disarm", + ["Disease Cleansing Totem"] = "Spell_Nature_DiseaseCleansingTotem", + ["Disenchant"] = "Spell_Holy_RemoveCurse", + ["Disengage"] = "Ability_Rogue_Feint", + ["Dismiss Pet"] = "Spell_Nature_SpiritWolf", + ["Dispel Magic"] = "Spell_Holy_DispelMagic", + ["Distract"] = "Ability_Rogue_Distract", + ["Distracting Shot"] = "Spell_Arcane_Blink", + ["Dive"] = "Spell_Shadow_BurningSpirit", + ["Divine Favor"] = "Spell_Holy_Heal", + ["Divine Fury"] = "Spell_Holy_SealOfWrath", + ["Divine Intellect"] = "Spell_Nature_Sleep", + ["Divine Intervention"] = "Spell_Nature_TimeStop", + ["Divine Protection"] = "Spell_Holy_Restoration", + ["Divine Shield"] = "Spell_Holy_DivineIntervention", + ["Divine Spirit"] = "Spell_Holy_DivineSpirit", + ["Divine Strength"] = "Ability_GolemThunderClap", + ["Dodge"] = "Spell_Nature_Invisibilty", + ["Drain Life"] = "Spell_Shadow_LifeDrain02", + ["Drain Mana"] = "Spell_Shadow_SiphonMana", + ["Drain Soul"] = "Spell_Shadow_Haunting", + ["Dual Wield Specialization"] = "Ability_DualWield", + ["Dual Wield"] = "Ability_DualWield", + ["Duel"] = "Temp", + ["Eagle Eye"] = "Ability_Hunter_EagleEye", + ["Earth Shock"] = "Spell_Nature_EarthShock", + ["Earthbind Totem"] = "Spell_Nature_StrengthOfEarthTotem02", + ["Efficiency"] = "Spell_Frost_WizardMark", + ["Elemental Focus"] = "Spell_Shadow_ManaBurn", + ["Elemental Fury"] = "Spell_Fire_Volcano", + ["Elemental Mastery"] = "Spell_Nature_WispHeal", + ["Elune's Grace"] = "Spell_Holy_ElunesGrace", + ["Elusiveness"] = "Spell_Magic_LesserInvisibilty", + ["Emberstorm"] = "Spell_Fire_SelfDestruct", + ["Enchanting"] = "Trade_Engraving", + ["Endurance Training"] = "Spell_Nature_Reincarnation", + ["Endurance"] = "Spell_Nature_UnyeildingStamina", + ["Engineering Specialization"] = "INV_Misc_Gear_01", + ["Engineering"] = "Trade_Engineering", + ["Enrage"] = "Ability_Druid_Enrage", + ["Enslave Demon"] = "Spell_Shadow_EnslaveDemon", + ["Entangling Roots"] = "Spell_Nature_StrangleVines", + ["Entrapment"] = "Spell_Nature_StrangleVines", + ["Escape Artist"] = "Ability_Rogue_Trip", + ["Evasion"] = "Spell_Shadow_ShadowWard", + ["Eventide"] = "Spell_Frost_Stun", + ["Eviscerate"] = "Ability_Rogue_Eviscerate", + ["Evocation"] = "Spell_Nature_Purge", + ["Execute"] = "INV_Sword_48", + ["Exorcism"] = "Spell_Holy_Excorcism_02", + ["Expansive Mind"] = "INV_Enchant_EssenceEternalLarge", + ["Explosive Trap Effect"] = "Spell_Fire_SelfDestruct", + ["Explosive Trap"] = "Spell_Fire_SelfDestruct", + ["Expose Armor"] = "Ability_Warrior_Riposte", + ["Eye for an Eye"] = "Spell_Holy_EyeforanEye", + ["Eye of Kilrogg"] = "Spell_Shadow_EvilEye", + ["Eyes of the Beast"] = "Ability_EyeOfTheOwl", + ["Fade"] = "Spell_Magic_LesserInvisibilty", + ["Faerie Fire"] = "Spell_Nature_FaerieFire", + ["Far Sight"] = "Spell_Nature_FarSight", + ["Fear Ward"] = "Spell_Holy_Excorcism", + ["Fear"] = "Spell_Shadow_Possession", + ["Feed Pet"] = "Ability_Hunter_BeastTraining", + ["Feedback"] = "Spell_Shadow_RitualOfSacrifice", + ["Feign Death"] = "Ability_Rogue_FeignDeath", + ["Feint"] = "Ability_Rogue_Feint", + ["Fel Concentration"] = "Spell_Shadow_FingerOfDeath", + ["Fel Domination"] = "Spell_Nature_RemoveCurse", + ["Fel Intellect"] = "Spell_Holy_MagicalSentry", + ["Fel Stamina"] = "Spell_Shadow_AntiShadow", + ["Felfire"] = "Spell_Fire_Fireball", + ["Feline Grace"] = "INV_Feather_01", + ["Feline Swiftness"] = "Spell_Nature_SpiritWolf", + ["Feral Aggression"] = "Ability_Druid_DemoralizingRoar", + ["Feral Charge"] = "Ability_Hunter_Pet_Bear", + ["Feral Instinct"] = "Ability_Ambush", + ["Ferocious Bite"] = "Ability_Druid_FerociousBite", + ["Ferocity"] = "INV_Misc_MonsterClaw_04", + ["Fetish"] = "INV_Misc_Horn_01", + ["Find Herbs"] = "INV_Misc_Flower_02", + ["Find Minerals"] = "Spell_Nature_Earthquake", + ["Find Treasure"] = "Racial_Dwarf_FindTreasure", + ["Fire Blast"] = "Spell_Fire_Fireball", + ["Fire Nova Totem"] = "Spell_Fire_SealOfFire", + ["Fire Power"] = "Spell_Fire_Immolation", + ["Fire Resistance Aura"] = "Spell_Fire_SealOfFire", + ["Fire Resistance Totem"] = "Spell_FireResistanceTotem_01", + ["Fire Resistance"] = "Spell_Fire_FireArmor", + ["Fire Shield"] = "Spell_Fire_FireArmor", + ["Fire Vulnerability"] = "Spell_Fire_SoulBurn", + ["Fire Ward"] = "Spell_Fire_FireArmor", + ["Fireball"] = "Spell_Fire_FlameBolt", + ["Firebolt"] = "Spell_Fire_FireBolt", + ["First Aid"] = "Spell_Holy_SealOfSacrifice", + ["Fishing Poles"] = "Trade_Fishing", + ["Fishing"] = "Trade_Fishing", + ["Fist Weapon Specialization"] = "INV_Gauntlets_04", + ["Fist Weapons"] = "INV_Gauntlets_04", + ["Flame Shock"] = "Spell_Fire_FlameShock", + ["Flame Throwing"] = "Spell_Fire_Flare", + ["Flamestrike"] = "Spell_Fire_SelfDestruct", + ["Flamethrower"] = "Spell_Fire_Incinerate", + ["Flametongue Totem"] = "Spell_Nature_GuardianWard", + ["Flametongue Weapon"] = "Spell_Fire_FlameTounge", + ["Flare"] = "Spell_Fire_Flare", + ["Flash Heal"] = "Spell_Holy_FlashHeal", + ["Flash of Light"] = "Spell_Holy_FlashHeal", + ["Flurry"] = "Ability_GhoulFrenzy", + ["Focused Casting"] = "Spell_Arcane_Blink", + ["Force of Will"] = "Spell_Nature_SlowingTotem", + ["Freezing Trap"] = "Spell_Frost_ChainsOfIce", + ["Frenzied Regeneration"] = "Ability_BullRush", + ["Frenzy"] = "INV_Misc_MonsterClaw_03", + ["Frost Armor"] = "Spell_Frost_FrostArmor02", + ["Frost Channeling"] = "Spell_Frost_Stun", + ["Frost Nova"] = "Spell_Frost_FrostNova", + ["Frost Resistance Aura"] = "Spell_Frost_WizardMark", + ["Frost Resistance Totem"] = "Spell_FrostResistanceTotem_01", + ["Frost Resistance"] = "Spell_Frost_FrostWard", + ["Frost Shock"] = "Spell_Frost_FrostShock", + ["Frost Trap"] = "Spell_Frost_FreezingBreath", + ["Frost Ward"] = "Spell_Frost_FrostWard", + ["Frostbite"] = "Spell_Frost_FrostArmor", + ["Frostbolt"] = "Spell_Frost_FrostBolt02", + ["Frostbrand Weapon"] = "Spell_Frost_FrostBrand", + ["Furious Howl"] = "Ability_Hunter_Pet_Wolf", + ["Furor"] = "Spell_Holy_BlessingOfStamina", + ["Garrote"] = "Ability_Rogue_Garrote", + ["Generic"] = "INV_Shield_09", + ["Ghost Wolf"] = "Spell_Nature_SpiritWolf", + ["Ghostly Strike"] = "Spell_Shadow_Curse", + ["Gift of Nature"] = "Spell_Nature_ProtectionformNature", + ["Gift of the Wild"] = "Spell_Nature_Regeneration", + ["Gouge"] = "Ability_Gouge", + ["Grace of Air Totem"] = "Spell_Nature_InvisibilityTotem", + ["Great Stamina"] = "Spell_Nature_UnyeildingStamina", + ["Greater Blessing of Kings"] = "Spell_Magic_GreaterBlessingofKings", + ["Greater Blessing of Light"] = "Spell_Holy_GreaterBlessingofLight", + ["Greater Blessing of Might"] = "Spell_Holy_GreaterBlessingofKings", + ["Greater Blessing of Salvation"] = "Spell_Holy_GreaterBlessingofSalvation", + ["Greater Blessing of Sanctuary"] = "Spell_Holy_GreaterBlessingofSanctuary", + ["Greater Blessing of Wisdom"] = "Spell_Holy_GreaterBlessingofWisdom", + ["Greater Heal"] = "Spell_Holy_GreaterHeal", + ["Grim Reach"] = "Spell_Shadow_CallofBone", + ["Grounding Totem"] = "Spell_Nature_GroundingTotem", + ["Grovel"] = "Temp", + ["Growl"] = "Ability_Physical_Taunt", + ["Guardian's Favor"] = "Spell_Holy_SealOfProtection", + ["Gun Specialization"] = "INV_Musket_03", + ["Guns"] = "INV_Weapon_Rifle_01", + ["Hammer of Justice"] = "Spell_Holy_SealOfMight", + ["Hand of Justice"] = "INV_Jewelry_Talisman_01", + ["Hammer of Wrath"] = "Ability_ThunderClap", + ["Hamstring"] = "Ability_ShockWave", + ["Harass"] = "Ability_Hunter_Harass", + ["Hardiness"] = "INV_Helmet_23", + ["Hawk Eye"] = "Ability_TownWatch", + ["Heal"] = "Spell_Holy_Heal", + ["Healing Focus"] = "Spell_Holy_HealingFocus", + ["Healing Light"] = "Spell_Holy_HolyBolt", + ["Healing Stream Totem"] = "INV_Spear_04", + ["Healing Touch"] = "Spell_Nature_HealingTouch", + ["Healing Wave"] = "Spell_Nature_MagicImmunity", + ["Health Funnel"] = "Spell_Shadow_LifeDrain", + ["Heart of the Wild"] = "Spell_Holy_BlessingOfAgility", + ["Hellfire Effect"] = "Spell_Fire_Incinerate", + ["Hellfire"] = "Spell_Fire_Incinerate", + ["Hemorrhage"] = "Spell_Shadow_LifeDrain", + ["Herbalism"] = "Spell_Nature_NatureTouchGrow", + ["Herb Gathering"] = "Spell_Nature_NatureTouchGrow", + ["Heroic Strike"] = "Ability_Rogue_Ambush", + ["Hex of Weakness"] = "Spell_Shadow_FingerOfDeath", + ["Hibernate"] = "Spell_Nature_Sleep", + ["Holy Fire"] = "Spell_Holy_SearingLight", + ["Holy Light"] = "Spell_Holy_HolyBolt", + ["Holy Nova"] = "Spell_Holy_HolyNova", + ["Holy Power"] = "Spell_Holy_Power", + ["Holy Reach"] = "Spell_Holy_Purify", + ["Holy Shield"] = "Spell_Holy_BlessingOfProtection", + ["Holy Shock"] = "Spell_Holy_SearingLight", + ["Holy Specialization"] = "Spell_Holy_SealOfSalvation", + ["Holy Wrath"] = "Spell_Holy_Excorcism", + ["Honorless Target"] = "Spell_Magic_LesserInvisibilty", + ["Horse Riding"] = "Spell_Nature_Swiftness", + ["Howl of Terror"] = "Spell_Shadow_DeathScream", + ["Humanoid Slaying"] = "Spell_Holy_PrayerOfHealing", + ["Hunter's Mark"] = "Ability_Hunter_SniperShot", + ["Hurricane"] = "Spell_Nature_Cyclone", + ["Ice Armor"] = "Spell_Frost_FrostArmor02", + ["Ice Barrier"] = "Spell_Ice_Lament", + ["Ice Block"] = "Spell_Frost_Frost", + ["Ice Shards"] = "Spell_Frost_IceShard", + ["Ignite"] = "Spell_Fire_Incinerate", + ["Illumination"] = "Spell_Holy_GreaterHeal", + ["Immolate"] = "Spell_Fire_Immolation", + ["Immolation Trap Effect"] = "Spell_Fire_FlameShock", + ["Immolation Trap"] = "Spell_Fire_FlameShock", + ["Impact"] = "Spell_Fire_MeteorStorm", + ["Impale"] = "Ability_SearingArrow", + ["Improved Ambush"] = "Ability_Rogue_Ambush", + ["Improved Arcane Explosion"] = "Spell_Nature_WispSplode", + ["Improved Arcane Missiles"] = "Spell_Nature_StarFall", + ["Improved Arcane Shot"] = "Ability_ImpalingBolt", + ["Improved Aspect of the Hawk"] = "Spell_Nature_RavenForm", + ["Improved Aspect of the Monkey"] = "Ability_Hunter_AspectOfTheMonkey", + ["Improved Backstab"] = "Ability_BackStab", + ["Improved Battle Shout"] = "Ability_Warrior_BattleShout", + ["Improved Berserker Rage"] = "Spell_Nature_AncestralGuardian", + ["Improved Blessing of Might"] = "Spell_Holy_FistOfJustice", + ["Improved Blessing of Wisdom"] = "Spell_Holy_SealOfWisdom", + ["Improved Blizzard"] = "Spell_Frost_IceStorm", + ["Improved Bloodrage"] = "Ability_Racial_BloodRage", + ["Improved Chain Heal"] = "Spell_Nature_HealingWaveGreater", + ["Improved Chain Lightning"] = "Spell_Nature_ChainLightning", + ["Improved Challenging Shout"] = "Ability_Warrior_Challange", + ["Improved Charge"] = "Ability_Warrior_Charge", + ["Improved Cheap Shot"] = "Ability_CheapShot", + ["Improved Cleave"] = "Ability_Warrior_Cleave", + ["Improved Concentration Aura"] = "Spell_Holy_MindSooth", + ["Improved Concussive Shot"] = "Spell_Frost_Stun", + ["Improved Cone of Cold"] = "Spell_Frost_Glacier", + ["Improved Corruption"] = "Spell_Shadow_AbominationExplosion", + ["Improved Counterspell"] = "Spell_Frost_IceShock", + ["Improved Curse of Agony"] = "Spell_Shadow_CurseOfSargeras", + ["Improved Curse of Exhaustion"] = "Spell_Shadow_GrimWard", + ["Improved Curse of Weakness"] = "Spell_Shadow_CurseOfMannoroth", + ["Improved Dampen Magic"] = "Spell_Nature_AbolishMagic", + ["Improved Deadly Poison"] = "Ability_Rogue_DualWeild", + ["Improved Demoralizing Shout"] = "Ability_Warrior_WarCry", + ["Improved Devotion Aura"] = "Spell_Holy_DevotionAura", + ["Improved Disarm"] = "Ability_Warrior_Disarm", + ["Improved Distract"] = "Ability_Rogue_Distract", + ["Improved Drain Life"] = "Spell_Shadow_LifeDrain02", + ["Improved Drain Mana"] = "Spell_Shadow_SiphonMana", + ["Improved Drain Soul"] = "Spell_Shadow_Haunting", + ["Improved Enrage"] = "Ability_Druid_Enrage", + ["Improved Enslave Demon"] = "Spell_Shadow_EnslaveDemon", + ["Improved Entangling Roots"] = "Spell_Nature_StrangleVines", + ["Improved Evasion"] = "Spell_Shadow_ShadowWard", + ["Improved Eviscerate"] = "Ability_Rogue_Eviscerate", + ["Improved Execute"] = "INV_Sword_48", + ["Improved Expose Armor"] = "Ability_Warrior_Riposte", + ["Improved Eyes of the Beast"] = "Ability_EyeOfTheOwl", + ["Improved Fade"] = "Spell_Magic_LesserInvisibilty", + ["Improved Feign Death"] = "Ability_Rogue_FeignDeath", + ["Improved Fire Blast"] = "Spell_Fire_Fireball", + ["Improved Fire Nova Totem"] = "Spell_Fire_SealOfFire", + ["Improved Fire Ward"] = "Spell_Fire_FireArmor", + ["Improved Fireball"] = "Spell_Fire_FlameBolt", + ["Improved Firebolt"] = "Spell_Fire_FireBolt", + ["Improved Firestone"] = "INV_Ammo_FireTar", + ["Improved Flamestrike"] = "Spell_Fire_SelfDestruct", + ["Improved Flametongue Weapon"] = "Spell_Fire_FlameTounge", + ["Improved Flash of Light"] = "Spell_Holy_FlashHeal", + ["Improved Frost Nova"] = "Spell_Frost_FreezingBreath", + ["Improved Frost Ward"] = "Spell_Frost_FrostWard", + ["Improved Frostbolt"] = "Spell_Frost_FrostBolt02", + ["Improved Frostbrand Weapon"] = "Spell_Frost_FrostBrand", + ["Improved Garrote"] = "Ability_Rogue_Garrote", + ["Improved Ghost Wolf"] = "Spell_Nature_SpiritWolf", + ["Improved Gouge"] = "Ability_Gouge", + ["Improved Grace of Air Totem"] = "Spell_Nature_InvisibilityTotem", + ["Improved Grounding Totem"] = "Spell_Nature_GroundingTotem", + ["Improved Hammer of Justice"] = "Spell_Holy_SealOfMight", + ["Improved Hamstring"] = "Ability_ShockWave", + ["Improved Healing Stream Totem"] = "INV_Spear_04", + ["Improved Healing Touch"] = "Spell_Nature_HealingTouch", + ["Improved Healing Wave"] = "Spell_Nature_MagicImmunity", + ["Improved Healing"] = "Spell_Holy_Heal02", + ["Improved Health Funnel"] = "Spell_Shadow_LifeDrain", + ["Improved Healthstone"] = "INV_Stone_04", + ["Improved Heroic Strike"] = "Ability_Rogue_Ambush", + ["Improved Hunter's Mark"] = "Ability_Hunter_SniperShot", + ["Improved Immolate"] = "Spell_Fire_Immolation", + ["Improved Imp"] = "Spell_Shadow_SummonImp", + ["Improved Inner Fire"] = "Spell_Holy_InnerFire", + ["Improved Instant Poison"] = "Ability_Poisons", + ["Improved Intercept"] = "Ability_Rogue_Sprint", + ["Improved Intimidating Shout"] = "Ability_GolemThunderClap", + ["Improved Judgement"] = "Spell_Holy_RighteousFury", + ["Improved Kick"] = "Ability_Kick", + ["Improved Kidney Shot"] = "Ability_Rogue_KidneyShot", + ["Improved Lash of Pain"] = "Spell_Shadow_Curse", + ["Improved Lay on Hands"] = "Spell_Holy_LayOnHands", + ["Improved Lesser Healing Wave"] = "Spell_Nature_HealingWaveLesser", + ["Improved Life Tap"] = "Spell_Shadow_BurningSpirit", + ["Improved Lightning Bolt"] = "Spell_Nature_Lightning", + ["Improved Lightning Shield"] = "Spell_Nature_LightningShield", + ["Improved Magma Totem"] = "Spell_Fire_SelfDestruct", + ["Improved Mana Burn"] = "Spell_Shadow_ManaBurn", + ["Improved Mana Shield"] = "Spell_Shadow_DetectLesserInvisibility", + ["Improved Mana Spring Totem"] = "Spell_Nature_ManaRegenTotem", + ["Improved Mark of the Wild"] = "Spell_Nature_Regeneration", + ["Improved Mend Pet"] = "Ability_Hunter_MendPet", + ["Improved Mind Blast"] = "Spell_Shadow_UnholyFrenzy", + ["Improved Moonfire"] = "Spell_Nature_StarFall", + ["Improved Nature's Grasp"] = "Spell_Nature_NaturesWrath", + ["Improved Overpower"] = "INV_Sword_05", + ["Improved Power Word: Fortitude"] = "Spell_Holy_WordFortitude", + ["Improved Power Word: Shield"] = "Spell_Holy_PowerWordShield", + ["Improved Prayer of Healing"] = "Spell_Holy_PrayerOfHealing02", + ["Improved Psychic Scream"] = "Spell_Shadow_PsychicScream", + ["Improved Pummel"] = "INV_Gauntlets_04", + ["Improved Regrowth"] = "Spell_Nature_ResistNature", + ["Improved Reincarnation"] = "Spell_Nature_Reincarnation", + ["Improved Rejuvenation"] = "Spell_Nature_Rejuvenation", + ["Improved Rend"] = "Ability_Gouge", + ["Improved Renew"] = "Spell_Holy_Renew", + ["Improved Retribution Aura"] = "Spell_Holy_AuraOfLight", + ["Improved Revenge"] = "Ability_Warrior_Revenge", + ["Improved Revive Pet"] = "Ability_Hunter_BeastSoothe", + ["Improved Righteous Fury"] = "Spell_Holy_SealOfFury", + ["Improved Rockbiter Weapon"] = "Spell_Nature_RockBiter", + ["Improved Rupture"] = "Ability_Rogue_Rupture", + ["Improved Sap"] = "Ability_Sap", + ["Improved Scorch"] = "Spell_Fire_SoulBurn", + ["Improved Scorpid Sting"] = "Ability_Hunter_CriticalShot", + ["Improved Seal of Righteousness"] = "Ability_ThunderBolt", + ["Improved Seal of the Crusader"] = "Spell_Holy_HolySmite", + ["Improved Searing Pain"] = "Spell_Fire_SoulBurn", + ["Improved Searing Totem"] = "Spell_Fire_SearingTotem", + ["Improved Serpent Sting"] = "Ability_Hunter_Quickshot", + ["Improved Shadow Bolt"] = "Spell_Shadow_ShadowBolt", + ["Improved Shadow Word: Pain"] = "Spell_Shadow_ShadowWordPain", + ["Improved Shield Bash"] = "Ability_Warrior_ShieldBash", + ["Improved Shield Block"] = "Ability_Defend", + ["Improved Shield Wall"] = "Ability_Warrior_ShieldWall", + ["Improved Shred"] = "Spell_Shadow_VampiricAura", + ["Improved Sinister Strike"] = "Spell_Shadow_RitualOfSacrifice", + ["Improved Slam"] = "Ability_Warrior_DecisiveStrike", + ["Improved Slice and Dice"] = "Ability_Rogue_SliceDice", + ["Improved Spellstone"] = "INV_Misc_Gem_Sapphire_01", + ["Improved Sprint"] = "Ability_Rogue_Sprint", + ["Improved Starfire"] = "Spell_Arcane_StarFire", + ["Improved Stoneclaw Totem"] = "Spell_Nature_StoneClawTotem", + ["Improved Stoneskin Totem"] = "Spell_Nature_StoneSkinTotem", + ["Improved Strength of Earth Totem"] = "Spell_Nature_EarthBindTotem", + ["Improved Succubus"] = "Spell_Shadow_SummonSuccubus", + ["Improved Sunder Armor"] = "Ability_Warrior_Sunder", + ["Improved Taunt"] = "Spell_Nature_Reincarnation", + ["Improved Thorns"] = "Spell_Nature_Thorns", + ["Improved Thunder Clap"] = "Ability_ThunderClap", + ["Improved Tranquility"] = "Spell_Nature_Tranquility", + ["Improved Vampiric Embrace"] = "Spell_Shadow_ImprovedVampiricEmbrace", + ["Improved Vanish"] = "Ability_Vanish", + ["Improved Voidwalker"] = "Spell_Shadow_SummonVoidWalker", + ["Improved Windfury Weapon"] = "Spell_Nature_Cyclone", + ["Improved Wing Clip"] = "Ability_Rogue_Trip", + ["Improved Wrath"] = "Spell_Nature_AbolishMagic", + ["Incinerate"] = "Spell_Fire_FlameShock", + ["Inferno"] = "Spell_Shadow_SummonInfernal", + ["Initiative"] = "Spell_Shadow_Fumble", + ["Inner Fire"] = "Spell_Holy_InnerFire", + ["Inner Focus"] = "Spell_Frost_WindWalkOn", + ["Innervate"] = "Spell_Nature_Lightning", + ["Insect Swarm"] = "Spell_Nature_InsectSwarm", + ["Inspiration"] = "Spell_Holy_LayOnHands", + ["Instant Poison II"] = "Ability_Poisons", + ["Instant Poison III"] = "Ability_Poisons", + ["Instant Poison IV"] = "Ability_Poisons", + ["Instant Poison V"] = "Ability_Poisons", + ["Instant Poison VI"] = "Ability_Poisons", + ["Instant Poison"] = "Ability_Poisons", + ["Intensity"] = "Spell_Fire_LavaSpawn", + ["Intercept"] = "Ability_Rogue_Sprint", + ["Intercept Stun"] = "Ability_Rogue_Sprint", + ["Intimidating Shout"] = "Ability_GolemThunderClap", + ["Intimidation"] = "Ability_Devour", + ["Iron Will"] = "Spell_Magic_MageArmor", + ["Judgement of Command"] = "Ability_Warrior_InnerRage", + ["Judgement of Justice"] = "Spell_Holy_SealOfWrath", + ["Judgement of Light"] = "Spell_Holy_HealingAura", + ["Judgement of Righteousness"] = "Spell_Holy_RighteousFury", + ["Judgement of Wisdom"] = "Spell_Holy_RighteousnessAura", + ["Judgement of the Crusader"] = "Spell_Holy_HolySmite", + ["Judgement"] = "Spell_Holy_RighteousFury", + ["Kick"] = "Ability_Kick", + ["Kidney Shot"] = "Ability_Rogue_KidneyShot", + ["Killer Instinct"] = "Spell_Holy_BlessingOfStamina", + ["Kodo Riding"] = "Spell_Nature_Swiftness", + ["Lash of Pain"] = "Spell_Shadow_Curse", + ["Last Stand"] = "Spell_Holy_AshesToAshes", + ["Lasting Judgement"] = "Spell_Holy_HealingAura", + ["Lay on Hands"] = "Spell_Holy_LayOnHands", + ["Leader of the Pack"] = "Spell_Nature_UnyeildingStamina", + ["Leather"] = "INV_Chest_Leather_09", + ["Leatherworking"] = "INV_Misc_ArmorKit_17", + ["Lesser Heal"] = "Spell_Holy_LesserHeal", + ["Lesser Healing Wave"] = "Spell_Nature_HealingWaveLesser", + ["Lesser Invisibility"] = "Spell_Magic_LesserInvisibilty", + ["Lethal Shots"] = "Ability_SearingArrow", + ["Lethality"] = "Ability_CriticalStrike", + ["Levitate"] = "Spell_Holy_LayOnHands", + ["Libram"] = "INV_Misc_Book_11", + ["Life Tap"] = "Spell_Shadow_BurningSpirit", + ["Lightning Bolt"] = "Spell_Nature_Lightning", + ["Lightning Breath"] = "Spell_Nature_Lightning", + ["Lightning Mastery"] = "Spell_Lightning_LightningBolt01", + ["Lightning Reflexes"] = "Spell_Nature_Invisibilty", + ["Lightning Shield"] = "Spell_Nature_LightningShield", + ["Lightwell Renew"] = "Spell_Holy_SummonLightwell", + ["Lightwell"] = "Spell_Holy_SummonLightwell", + ["Long Daze"] = "Spell_Frost_Stun", + ["Mace Specialization"] = "INV_Mace_01", + ["Mace Stun Effect"] = "Spell_Frost_Stun", + ["Mage Armor"] = "Spell_MageArmor", + ["Magma Totem"] = "Spell_Fire_SelfDestruct", + ["Mail"] = "INV_Chest_Chain_05", + ["Malice"] = "Ability_Racial_BloodRage", + ["Mana Burn"] = "Spell_Shadow_ManaBurn", + ["Mana Shield"] = "Spell_Shadow_DetectLesserInvisibility", + ["Mana Spring Totem"] = "Spell_Nature_ManaRegenTotem", + ["Mana Tide Totem"] = "Spell_Frost_SummonWaterElemental", + ["Mangle"] = "Ability_Druid_Mangle.tga", + ["Mark of the Wild"] = "Spell_Nature_Regeneration", + ["Martyrdom"] = "Spell_Nature_Tranquility", + ["Master Demonologist"] = "Spell_Shadow_ShadowPact", + ["Master Summoner"] = "Spell_Shadow_ImpPhaseShift", + ["Master of Deception"] = "Spell_Shadow_Charm", + ["Maul"] = "Ability_Druid_Maul", + ["Mechanostrider Piloting"] = "Spell_Nature_Swiftness", + ["Meditation"] = "Spell_Nature_Sleep", + ["Melee Specialization"] = "INV_Axe_02", + ["Mend Pet"] = "Ability_Hunter_MendPet", + ["Mental Agility"] = "Ability_Hibernation", + ["Mental Strength"] = "Spell_Nature_EnchantArmor", + ["Mind Blast"] = "Spell_Shadow_UnholyFrenzy", + ["Mind Control"] = "Spell_Shadow_ShadowWordDominate", + ["Mind Flay"] = "Spell_Shadow_SiphonMana", + ["Mind Soothe"] = "Spell_Holy_MindSooth", + ["Mind Vision"] = "Spell_Holy_MindVision", + ["Mind-numbing Poison II"] = "Spell_Nature_NullifyDisease", + ["Mind-numbing Poison III"] = "Spell_Nature_NullifyDisease", + ["Mind-numbing Poison"] = "Spell_Nature_NullifyDisease", + ["Mining"] = "Trade_Mining", + ["Mocking Blow"] = "Ability_Warrior_PunishingBlow", + ["Mongoose Bite"] = "Ability_Hunter_SwiftStrike", + ["Monster Slaying"] = "INV_Misc_Head_Dragon_Black", + ["Moonfire"] = "Spell_Nature_StarFall", + ["Moonfury"] = "Spell_Nature_MoonGlow", + ["Moonglow"] = "Spell_Nature_Sentinal", + ["Moonkin Aura"] = "Spell_Nature_MoonGlow", + ["Moonkin Form"] = "Spell_Nature_ForceOfNature", + ["Mortal Shots"] = "Ability_PierceDamage", + ["Mortal Strike"] = "Ability_Warrior_SavageBlow", + ["Multi-Shot"] = "Ability_UpgradeMoonGlaive", + ["Murder"] = "Spell_Shadow_DeathScream", + ["Natural Armor"] = "Spell_Nature_SpiritArmor", + ["Natural Shapeshifter"] = "Spell_Nature_WispSplode", + ["Natural Weapons"] = "INV_Staff_01", + ["Nature Resistance Totem"] = "Spell_Nature_NatureResistanceTotem", + ["Nature Resistance"] = "Spell_Nature_ResistNature", + ["Nature's Focus"] = "Spell_Nature_HealingWaveGreater", + ["Nature's Grace"] = "Spell_Nature_NaturesBlessing", + ["Nature's Grasp"] = "Spell_Nature_NaturesWrath", + ["Nature's Reach"] = "Spell_Nature_NatureTouchGrow", + ["Nature's Swiftness"] = "Spell_Nature_RavenForm", + ["Nightfall"] = "Spell_Shadow_Twilight", + ["Omen of Clarity"] = "Spell_Nature_CrystalBall", + ["One-Handed Axes"] = "INV_Axe_01", + ["One-Handed Maces"] = "INV_Mace_01", + ["One-Handed Swords"] = "Ability_MeleeDamage", + ["One-Handed Weapon Specialization"] = "INV_Sword_20", + ["Opening - No Text"] = "Trade_Engineering", + ["Opening"] = "Trade_Engineering", + ["Opportunity"] = "Ability_Warrior_WarCry", + ["Overpower"] = "Ability_MeleeDamage", + ["Paranoia"] = "Spell_Shadow_AuraOfDarkness", + ["Parry"] = "Ability_Parry", + ["Pathfinding"] = "Ability_Mount_JungleTiger", + ["Perception"] = "Spell_Nature_Sleep", + ["Permafrost"] = "Spell_Frost_Wisp", + ["Pet Aggression"] = "Ability_Druid_Maul", + ["Pet Hardiness"] = "Ability_BullRush", + ["Pet Recovery"] = "Ability_Hibernation", + ["Pet Resistance"] = "Spell_Holy_BlessingOfAgility", + ["Phase Shift"] = "Spell_Shadow_ImpPhaseShift", + ["Pick Lock"] = "Spell_Nature_MoonKey", + ["Pick Pocket"] = "INV_Misc_Bag_11", + ["Piercing Howl"] = "Spell_Shadow_DeathScream", + ["Piercing Ice"] = "Spell_Frost_Frostbolt", + ["Plate Mail"] = "INV_Chest_Plate01", + ["Poison Cleansing Totem"] = "Spell_Nature_PoisonCleansingTotem", + ["Poisons"] = "Trade_BrewPoison", + ["Polearm Specialization"] = "INV_Weapon_Halbard_01", + ["Polearms"] = "INV_Spear_06", + ["Polymorph"] = "Spell_Nature_Polymorph", + ["Polymorph: Pig"] = "Spell_Magic_PolymorphPig", + ["Polymorph: Turtle"] = "Ability_Hunter_Pet_Turtle", + ["Portal: Darnassus"] = "Spell_Arcane_PortalDarnassus", + ["Portal: Ironforge"] = "Spell_Arcane_PortalIronForge", + ["Portal: Orgrimmar"] = "Spell_Arcane_PortalOrgrimmar", + ["Portal: Stormwind"] = "Spell_Arcane_PortalStormWind", + ["Portal: Thunder Bluff"] = "Spell_Arcane_PortalThunderBluff", + ["Portal: Undercity"] = "Spell_Arcane_PortalUnderCity", + ["Pounce Bleed"] = "Ability_Druid_SupriseAttack", + ["Pounce"] = "Ability_Druid_SupriseAttack", + ["Power Infusion"] = "Spell_Holy_PowerInfusion", + ["Power Word: Fortitude"] = "Spell_Holy_WordFortitude", + ["Power Word: Shield"] = "Spell_Holy_PowerWordShield", + ["Prayer of Fortitude"] = "Spell_Holy_PrayerOfFortitude", + ["Prayer of Healing"] = "Spell_Holy_PrayerOfHealing02", + ["Prayer of Shadow Protection"] = "Spell_Holy_PrayerofShadowProtection", + ["Prayer of Spirit"] = "Spell_Holy_PrayerofSpirit", + ["Precision"] = "Ability_Marksmanship", + ["Predatory Strikes"] = "Ability_Hunter_Pet_Cat", + ["Premeditation"] = "Spell_Shadow_Possession", + ["Preparation"] = "Spell_Shadow_AntiShadow", + ["Presence of Mind"] = "Spell_Nature_EnchantArmor", + ["Primal Fury"] = "Ability_Racial_Cannibalize", + ["Prowl"] = "Ability_Druid_SupriseAttack", + ["Psychic Scream"] = "Spell_Shadow_PsychicScream", + ["Pummel"] = "INV_Gauntlets_04", + ["Purge"] = "Spell_Nature_Purge", + ["Purification"] = "Spell_Frost_WizardMark", + ["Purify"] = "Spell_Holy_Purify", + ["Pursuit of Justice"] = "Spell_Holy_PersuitofJustice", + ["Pyroblast"] = "Spell_Fire_Fireball02", + ["Pyroclasm"] = "Spell_Fire_Volcano", + ["Quickness"] = "Ability_Racial_ShadowMeld", + ["Rain of Fire"] = "Spell_Shadow_RainOfFire", + ["Rake"] = "Ability_Druid_Disembowel", + ["Ram Riding"] = "Spell_Nature_Swiftness", + ["Ranged Weapon Specialization"] = "INV_Weapon_Rifle_06", + ["Rapid Concealment"] = "Ability_Ambush", + ["Rapid Fire"] = "Ability_Hunter_RunningShot", + ["Raptor Riding"] = "Spell_Nature_Swiftness", + ["Raptor Strike"] = "Ability_MeleeDamage", + ["Ravage"] = "Ability_Druid_Ravage", + ["Readiness"] = "Spell_Nature_Sleep", + ["Rebirth"] = "Spell_Nature_Reincarnation", + ["Recklessness"] = "Ability_CriticalStrike", + ["Reckoning"] = "Spell_Holy_BlessingOfStrength", + ["Redemption"] = "Spell_Holy_Resurrection", + ["Redoubt"] = "Ability_Defend", + ["Reflection"] = "Spell_Frost_WindWalkOn", + ["Regeneration"] = "Spell_Nature_Regenerate", + ["Regrowth"] = "Spell_Nature_ResistNature", + ["Reincarnation"] = "Spell_Nature_Reincarnation", + ["Rejuvenation"] = "Spell_Nature_Rejuvenation", + ["Relentless Strikes"] = "Ability_Warrior_DecisiveStrike", + ["Remorseless Attacks"] = "Ability_FiegnDead", + ["Remove Curse"] = "Spell_Holy_RemoveCurse", + ["Remove Insignia"] = "Temp", + ["Remove Lesser Curse"] = "Spell_Nature_RemoveCurse", + ["Rend"] = "Ability_Gouge", + ["Renew"] = "Spell_Holy_Renew", + ["Repentance"] = "Spell_Holy_PrayerOfHealing", + ["Resurrection"] = "Spell_Holy_Resurrection", + ["Retaliation"] = "Ability_Warrior_Challange", + ["Retribution Aura"] = "Spell_Holy_AuraOfLight", + ["Revenge Stun"] = "Ability_Warrior_Revenge", + ["Revenge"] = "Ability_Warrior_Revenge", + ["Reverberation"] = "Spell_Frost_FrostWard", + ["Revive Pet"] = "Ability_Hunter_BeastSoothe", + ["Righteous Fury"] = "Spell_Holy_SealOfFury", + ["Rip"] = "Ability_GhoulFrenzy", + ["Riposte"] = "Ability_Warrior_Challange", + ["Ritual of Doom Effect"] = "Spell_Arcane_PortalDarnassus", + ["Ritual of Doom"] = "Spell_Shadow_AntiMagicShell", + ["Ritual of Summoning"] = "Spell_Shadow_Twilight", + ["Rockbiter Weapon"] = "Spell_Nature_RockBiter", + ["Rogue Passive"] = "Ability_Stealth", + ["Ruin"] = "Spell_Shadow_ShadowWordPain", + ["Rupture"] = "Ability_Rogue_Rupture", + ["Ruthlessness"] = "Ability_Druid_Disembowel", + ["Sacrifice"] = "Spell_Shadow_SacrificialShield", + ["Safe Fall"] = "INV_Feather_01", + ["Sanctity Aura"] = "Spell_Holy_MindVision", + ["Sap"] = "Ability_Sap", + ["Savage Fury"] = "Ability_Druid_Ravage", + ["Savage Strikes"] = "Ability_Racial_BloodRage", + ["Scare Beast"] = "Ability_Druid_Cower", + ["Scatter Shot"] = "Ability_GolemStormBolt", + ["Scorch"] = "Spell_Fire_SoulBurn", + ["Scorpid Poison"] = "Ability_PoisonSting", + ["Scorpid Sting"] = "Ability_Hunter_CriticalShot", + ["Screech"] = "Ability_Hunter_Pet_Bat", + ["Seal Fate"] = "Spell_Shadow_ChillTouch", + ["Seal of Command"] = "Ability_Warrior_InnerRage", + ["Seal of Justice"] = "Spell_Holy_SealOfWrath", + ["Seal of Light"] = "Spell_Holy_HealingAura", + ["Seal of Righteousness"] = "Ability_ThunderBolt", + ["Seal of Wisdom"] = "Spell_Holy_RighteousnessAura", + ["Seal of the Crusader"] = "Spell_Holy_HolySmite", + ["Searing Light"] = "Spell_Holy_SearingLightPriest", + ["Searing Pain"] = "Spell_Fire_SoulBurn", + ["Searing Totem"] = "Spell_Fire_SearingTotem", + ["Seduction"] = "Spell_Shadow_MindSteal", + ["Sense Demons"] = "Spell_Shadow_Metamorphosis", + ["Sense Undead"] = "Spell_Holy_SenseUndead", + ["Sentry Totem"] = "Spell_Nature_RemoveCurse", + ["Serpent Sting"] = "Ability_Hunter_Quickshot", + ["Setup"] = "Spell_Nature_MirrorImage", + ["Shackle Undead"] = "Spell_Nature_Slow", + ["Shadow Affinity"] = "Spell_Shadow_ShadowWard", + ["Shadow Bolt"] = "Spell_Shadow_ShadowBolt", + ["Shadow Focus"] = "Spell_Shadow_BurningSpirit", + ["Shadow Mastery"] = "Spell_Shadow_ShadeTrueSight", + ["Shadow Protection"] = "Spell_Shadow_AntiShadow", + ["Shadow Reach"] = "Spell_Shadow_ChillTouch", + ["Shadow Resistance Aura"] = "Spell_Shadow_SealOfKings", + ["Shadow Resistance"] = "Spell_Shadow_AntiShadow", + ["Shadow Trance"] = "Spell_Shadow_Twilight", + ["Shadow Ward"] = "Spell_Shadow_AntiShadow", + ["Shadow Weaving"] = "Spell_Shadow_BlackPlague", + ["Shadow Word: Pain"] = "Spell_Shadow_ShadowWordPain", + ["Shadowburn"] = "Spell_Shadow_ScourgeBuild", + ["Shadowform"] = "Spell_Shadow_Shadowform", + ["Shadowguard"] = "Spell_Nature_LightningShield", + ["Shadowmeld Passive"] = "Ability_Ambush", + ["Shadowmeld"] = "Ability_Ambush", + ["Sharpened Claws"] = "INV_Misc_MonsterClaw_04", + ["Shatter"] = "Spell_Frost_FrostShock", + ["Shell Shield"] = "Ability_Hunter_Pet_Turtle", + ["Shield Bash"] = "Ability_Warrior_ShieldBash", + ["Shield Block"] = "Ability_Defend", + ["Shield Slam"] = "INV_Shield_05", + ["Shield Specialization"] = "INV_Shield_06", + ["Shield Wall"] = "Ability_Warrior_ShieldWall", + ["Shield"] = "INV_Shield_04", + ["Shoot Bow"] = "Ability_Marksmanship", + ["Shoot Crossbow"] = "Ability_Marksmanship", + ["Shoot Gun"] = "Ability_Marksmanship", + ["Shoot"] = "Ability_ShootWand", + ["Shred"] = "Spell_Shadow_VampiricAura", + ["Silence"] = "Spell_Shadow_ImpPhaseShift", + ["Silent Resolve"] = "Spell_Nature_ManaRegenTotem", + ["Sinister Strike"] = "Spell_Shadow_RitualOfSacrifice", + ["Siphon Life"] = "Spell_Shadow_Requiem", + ["Skinning"] = "INV_Misc_Pelt_Wolf_01", + ["Slam"] = "Ability_Warrior_DecisiveStrike", + ["Slice and Dice"] = "Ability_Rogue_SliceDice", + ["Slow Fall"] = "Spell_Magic_FeatherFall", + ["Smelting"] = "Spell_Fire_FlameBlades", + ["Smite"] = "Spell_Holy_HolySmite", + ["Soothe Animal"] = "Ability_Hunter_BeastSoothe", + ["Soothing Kiss"] = "Spell_Shadow_SoothingKiss", + ["Soul Fire"] = "Spell_Fire_Fireball02", + ["Soul Link"] = "Spell_Shadow_GatherShadows", + ["Soulstone Resurrection"] = "INV_Misc_Orb_04", + ["Spell Lock"] = "Spell_Shadow_MindRot", + ["Spell Warding"] = "Spell_Holy_SpellWarding", + ["Spirit Bond"] = "Ability_Druid_DemoralizingRoar", + ["Spirit Tap"] = "Spell_Shadow_Requiem", + ["Spirit of Redemption"] = "INV_Enchant_EssenceEternalLarge", + ["Spiritual Focus"] = "Spell_Arcane_Blink", + ["Spiritual Guidance"] = "Spell_Holy_SpiritualGuidence", + ["Spiritual Healing"] = "Spell_Nature_MoonGlow", + ["Sprint"] = "Ability_Rogue_Sprint", + ["Starfire"] = "Spell_Arcane_StarFire", + ["Starshards"] = "Spell_Arcane_StarFire", + ["Staves"] = "INV_Staff_08", + ["Stealth"] = "Ability_Stealth", + ["Stoneclaw Totem"] = "Spell_Nature_StoneClawTotem", + ["Stoneform"] = "Spell_Shadow_UnholyStrength", + ["Stoneskin Totem"] = "Spell_Nature_StoneSkinTotem", + ["Stormstrike"] = "Spell_Holy_SealOfMight", + ["Strength of Earth Totem"] = "Spell_Nature_EarthBindTotem", + ["Stuck"] = "Spell_Shadow_Teleport", + ["Subtlety"] = "Ability_EyeOfTheOwl", + ["Suffering"] = "Spell_Shadow_BlackPlague", + ["Summon Charger"] = "Ability_Mount_Charger", + ["Summon Dreadsteed"] = "Ability_Mount_Dreadsteed", + ["Summon Felhunter"] = "Spell_Shadow_SummonFelHunter", + ["Summon Felsteed"] = "Spell_Nature_Swiftness", + ["Summon Imp"] = "Spell_Shadow_SummonImp", + ["Summon Succubus"] = "Spell_Shadow_SummonSuccubus", + ["Summon Voidwalker"] = "Spell_Shadow_SummonVoidWalker", + ["Summon Warhorse"] = "Spell_Nature_Swiftness", + ["Sunder Armor"] = "Ability_Warrior_Sunder", + ["Suppression"] = "Spell_Shadow_UnsummonBuilding", + ["Surefooted"] = "Ability_Kick", + ["Survivalist"] = "Spell_Shadow_Twilight", + ["Sweeping Strikes"] = "Ability_Rogue_SliceDice", + ["Swiftmend"] = "INV_Relics_IdolOfRejuvenation", + ["Swipe"] = "INV_Misc_MonsterClaw_03", + ["Sword Specialization"] = "INV_Sword_27", + ["Tactical Mastery"] = "Spell_Nature_EnchantArmor", + ["Tailoring"] = "Trade_Tailoring", + ["Tainted Blood"] = "Spell_Shadow_LifeDrain", + ["Tame Beast"] = "Ability_Hunter_BeastTaming", + ["Tamed Pet Passive"] = "Ability_Mount_PinkTiger", + ["Taunt"] = "Spell_Nature_Reincarnation", + ["Teleport: Darnassus"] = "Spell_Arcane_TeleportDarnassus", + ["Teleport: Ironforge"] = "Spell_Arcane_TeleportIronForge", + ["Teleport: Moonglade"] = "Spell_Arcane_TeleportMoonglade", + ["Teleport: Orgrimmar"] = "Spell_Arcane_TeleportOrgrimmar", + ["Teleport: Stormwind"] = "Spell_Arcane_TeleportStormWind", + ["Teleport: Thunder Bluff"] = "Spell_Arcane_TeleportThunderBluff", + ["Teleport: Undercity"] = "Spell_Arcane_TeleportUnderCity", + ["The Human Spirit"] = "INV_Enchant_ShardBrilliantSmall", + ["Thick Hide"] = "INV_Misc_Pelt_Bear_03", + ["Thorns"] = "Spell_Nature_Thorns", + ["Throw"] = "Ability_Throw", + ["Throwing Specialization"] = "INV_ThrowingAxe_03", + ["Throwing Weapon Specialization"] = "INV_ThrowingKnife_01", + ["Thrown"] = "INV_ThrowingKnife_02", + ["Thunder Clap"] = "Spell_Nature_ThunderClap", + ["Thundering Strikes"] = "Ability_ThunderBolt", + ["Thunderstomp"] = "Ability_Hunter_Pet_Gorilla", + ["Tidal Focus"] = "Spell_Frost_ManaRecharge", + ["Tidal Mastery"] = "Spell_Nature_Tranquility", + ["Tiger Riding"] = "Spell_Nature_Swiftness", + ["Tiger's Fury"] = "Ability_Mount_JungleTiger", + ["Torment"] = "Spell_Shadow_GatherShadows", + ["Totem"] = "Spell_Nature_StoneClawTotem", + ["Totemic Focus"] = "Spell_Nature_MoonGlow", + ["Touch of Weakness"] = "Spell_Shadow_DeadofNight", + ["Toughness"] = "Spell_Holy_Devotion", + ["Track Beasts"] = "Ability_Tracking", + ["Track Demons"] = "Spell_Shadow_SummonFelHunter", + ["Track Dragonkin"] = "INV_Misc_Head_Dragon_01", + ["Track Elementals"] = "Spell_Frost_SummonWaterElemental", + ["Track Giants"] = "Ability_Racial_Avatar", + ["Track Hidden"] = "Ability_Stealth", + ["Track Humanoids"] = "Ability_Tracking", + ["Track Undead"] = "Spell_Shadow_DarkSummoning", + ["Tranquil Air Totem"] = "Spell_Nature_Brilliance", + ["Tranquil Spirit"] = "Spell_Holy_ElunesGrace", + ["Tranquility"] = "Spell_Nature_Tranquility", + ["Tranquilizing Shot"] = "Spell_Nature_Drowsy", + ["Trap Mastery"] = "Ability_Ensnare", + ["Travel Form"] = "Ability_Druid_TravelForm", + ["Tremor Totem"] = "Spell_Nature_TremorTotem", + ["Trueshot Aura"] = "Ability_TrueShot", + ["Turn Undead"] = "Spell_Holy_TurnUndead", + ["Two-Handed Axes and Maces"] = "INV_Axe_10", + ["Two-Handed Axes"] = "INV_Axe_04", + ["Two-Handed Maces"] = "INV_Mace_04", + ["Two-Handed Swords"] = "Ability_MeleeDamage", + ["Two-Handed Weapon Specialization"] = "INV_Axe_09", + ["Unarmed"] = "Ability_GolemThunderClap", + ["Unbreakable Will"] = "Spell_Magic_MageArmor", + ["Unbridled Wrath Effect"] = "Spell_Nature_StoneClawTotem", + ["Unbridled Wrath"] = "Spell_Nature_StoneClawTotem", + ["Undead Horsemanship"] = "Spell_Nature_Swiftness", + ["Underwater Breathing"] = "Spell_Shadow_DemonBreath", + ["Unending Breath"] = "Spell_Shadow_DemonBreath", + ["Unholy Power"] = "Spell_Shadow_ShadowWordDominate", + ["Unleashed Fury"] = "Ability_BullRush", + ["Unyielding Faith"] = "Spell_Holy_UnyieldingFaith", + ["Vampiric Embrace"] = "Spell_Shadow_UnsummonBuilding", + ["Vanish"] = "Ability_Vanish", + ["Vanished"] = "Ability_Vanish", + ["Vengeance"] = "Ability_Warrior_Revenge", + ["Vigor"] = "Spell_Nature_EarthBindTotem", + ["Vile Poisons"] = "Ability_Rogue_FeignDeath", + ["Vindication"] = "Spell_Holy_Vindication", + ["Viper Sting"] = "Ability_Hunter_AimedShot", + ["Volley"] = "Ability_Marksmanship", + ["Wand Specialization"] = "INV_Wand_01", + ["Wands"] = "Ability_ShootWand", + ["War Stomp"] = "Ability_WarStomp", + ["Water Breathing"] = "Spell_Shadow_DemonBreath", + ["Water Walking"] = "Spell_Frost_WindWalkOn", + ["Weakened Soul"] = "Spell_Holy_AshesToAshes", + ["Whirlwind"] = "Ability_Whirlwind", + ["Will of the Forsaken"] = "Spell_Shadow_RaiseDead", + ["Windfury Totem"] = "Spell_Nature_Windfury", + ["Windfury Weapon"] = "Spell_Nature_Cyclone", + ["Windwall Totem"] = "Spell_Nature_EarthBind", + ["Wing Clip"] = "Ability_Rogue_Trip", + ["Winter's Chill"] = "Spell_Frost_ChillingBlast", + ["Wisp Spirit"] = "Spell_Nature_WispSplode", + ["Wolf Riding"] = "Spell_Nature_Swiftness", + ["Wound Poison II"] = "INV_Misc_Herb_16", + ["Wound Poison III"] = "INV_Misc_Herb_16", + ["Wound Poison IV"] = "INV_Misc_Herb_16", + ["Wound Poison"] = "INV_Misc_Herb_16", + ["Wrath"] = "Spell_Nature_AbolishMagic", + ["Wyvern Sting"] = "INV_Spear_02" +} + +BabbleSpell:Debug() +BabbleSpell:SetStrictness(true) + +function BabbleSpell:GetSpellIcon(spell) + self:argCheck(spell, 2, "string") + local icon = spellIcons[spell] or spellIcons[self:HasReverseTranslation(spell) and self:GetReverseTranslation(spell) or false] + if not icon then + return nil + end + return "Interface\\Icons\\" .. icon +end + +function BabbleSpell:GetShortSpellIcon(spell) + self:argCheck(spell, 2, "string") + return spellIcons[spell] or spellIcons[self:HasReverseTranslation(spell) and self:GetReverseTranslation(spell) or false] +end + +AceLibrary:Register(BabbleSpell, MAJOR_VERSION, MINOR_VERSION) +BabbleSpell = nil diff --git a/MikScrollingBattleText/MikCombatEventHelper.lua b/MikScrollingBattleText/MikCombatEventHelper.lua index 9752e4d..0904edc 100644 --- a/MikScrollingBattleText/MikCombatEventHelper.lua +++ b/MikScrollingBattleText/MikCombatEventHelper.lua @@ -1,6 +1,7 @@ -------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- -- Title: Mik's Combat Event Helper -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create "namespace." @@ -106,8 +107,6 @@ MikCEH.CombatEventData = {}; -- Hold trigger event data. MikCEH.TriggerEventData = {}; - - ------------------------------------------------------------------------------------- -- Private constants. ------------------------------------------------------------------------------------- @@ -199,6 +198,7 @@ function MikCEH.OnLoad() table.insert(listenEvents, "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES"); -- Incoming Melee Misses, Dodges, Parries, Blocks, Absorbs, Immunes table.insert(listenEvents, "CHAT_MSG_COMBAT_PARTY_MISSES"); -- Incoming Melee Misses, Dodges, Parries, Blocks, Absorbs, Immunes table.insert(listenEvents, "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses + table.insert(listenEvents, "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses -- athenne add table.insert(listenEvents, "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses table.insert(listenEvents, "CHAT_MSG_SPELL_PARTY_DAMAGE"); -- Incoming Spell/Ability Damage, Misses, Dodges, Parries, Blocks, Absorbs, Resists, Immunes, Power Losses table.insert(listenEvents, "CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS"); -- Incoming damage from shields @@ -214,6 +214,7 @@ function MikCEH.OnLoad() table.insert(listenEvents, "CHAT_MSG_SPELL_SELF_BUFF"); -- Outgoing Heals, Power Gains, Dispel/Purge Resists table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS"); -- Outgoing HoTs table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS"); -- Outgoing HoTs + table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS"); table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"); -- Outgoing DoTs table.insert(listenEvents, "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"); -- Outgoing DoTs, Power Losses table.insert(listenEvents, "CHAT_MSG_COMBAT_PET_HITS"); -- Outgoing Pet Melee Hits/Crits @@ -388,7 +389,10 @@ function MikCEH.ParseCombatEvents(event, combatMessage) MikCEH.ParseForIncomingSpellHeals(combatMessage); -- Incoming Debuffs, DoTs, Power Gains - elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE") then + elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE" or + event == "CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS" or + event == "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS" or + event == "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS") then MikCEH.ParseForIncomingDebuffs(combatMessage); MikCEH.ParseForPowerGains(combatMessage); @@ -890,6 +894,123 @@ function MikCEH.ParseForIncomingDamageShieldDamage(combatMessage) -- Return the parse was successful. return true; end + + -- Look for a resist. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLRESISTOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_RESIST, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a miss. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLMISSOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a dodge. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLDODGEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a parry. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPARRIEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a block. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLBLOCKEDOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for an absorb. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for an immune. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLIMMUNEOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a reflect. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLREFLECTOTHERSELF", {"%n", "%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_REFLECT, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Return the parse was NOT successful. return false; @@ -907,6 +1028,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_CRIT, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); --athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -921,6 +1047,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_NORMAL, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); --athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -936,6 +1067,11 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + eventData.Name = playerName + MikCEH.PopulateOverhealData(eventData); -- athenne add + eventData.Name = capturedData.Name + -- Send the event. MikCEH.SendEvent(eventData); @@ -950,6 +1086,9 @@ function MikCEH.ParseForIncomingSpellHeals(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, playerName); + -- Get overheal info. + MikCEH.PopulateOverhealData(eventData); --athenne add + -- Send the event. MikCEH.SendEvent(eventData); @@ -969,7 +1108,7 @@ end function MikCEH.ParseForIncomingDebuffs(combatMessage) -- Look for a debuff. local capturedData = MikCEH.GetCapturedData(combatMessage, "AURAADDEDSELFHARMFUL", {"%b"}); - + -- If a match was found. if (capturedData ~= nil) then local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_DEBUFF, capturedData.Amount, capturedData.BuffName); @@ -981,13 +1120,23 @@ function MikCEH.ParseForIncomingDebuffs(combatMessage) return true; end - + capturedData = nil -- Look for damage from a debuff. - local capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%a", "%t", "%n", "%s"}); + if (GetLocale() == "frFR") then + capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%t", "%a", "%s", "%n"}); + else + capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGEOTHERSELF", {"%a", "%t", "%n", "%s"}); +end -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name); + + local eventData + if (GetLocale() == "frFR") then + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, capturedData.Name); + else + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.Name, capturedData.SpellName); + end -- Look for any partial actions and populate them into the event data. MikCEH.ParseForPartialActions(combatMessage, eventData); @@ -998,7 +1147,36 @@ function MikCEH.ParseForIncomingDebuffs(combatMessage) -- Return the parse was successful. return true; end + + + + -- Look for damage from a self debuff. + local capturedData = MikCEH.GetCapturedData(combatMessage, "PERIODICAURADAMAGESELFSELF", {"%a", "%t", "%s"}); + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_OVER_TIME, capturedData.DamageType, capturedData.Amount, capturedData.SpellName, nil); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for absorbed damage from a self debuff. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBSELFSELF", {"%s"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_INCOMING, MikCEH.ACTIONTYPE_ABSORB, nil, nil, nil, capturedData.SpellName, nil); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Look for absorbed damage from a debuff. local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLLOGABSORBOTHERSELF", {"%n", "%s"}); @@ -1023,14 +1201,16 @@ end -- Parses for power gains. -- ********************************************************************************** function MikCEH.ParseForPowerGains(combatMessage) - -- Look for self power gains. - local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%a", "%p", "%s"}); + local capturedData = nil + + -- Look for power gains from others. + local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINOTHERSELF", {"%p", "%a", "%s", "%n"}); -- If a match was found. if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1039,15 +1219,19 @@ function MikCEH.ParseForPowerGains(combatMessage) return true; end end - - -- Look for power gains from others. - local capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINOTHERSELF", {"%a", "%p", "%n", "%s"}); + + -- Look for self power gains. +if (GetLocale() == "frFR") then + capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%p", "%s", "%a"}); +else + capturedData = MikCEH.GetCapturedData(combatMessage, "POWERGAINSELFSELF", {"%a", "%p", "%s"}); +end -- If a match was found. if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1064,7 +1248,7 @@ function MikCEH.ParseForPowerGains(combatMessage) if (capturedData ~= nil) then -- Make sure it's mana, rage, or energy. if (capturedData.PowerType == MANA or capturedData.PowerType == RAGE or capturedData.PowerType == ENERGY) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_GAIN, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1088,7 +1272,7 @@ function MikCEH.ParseForPowerLosses(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1103,7 +1287,7 @@ function MikCEH.ParseForPowerLosses(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType); + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); -- Send the event. MikCEH.SendEvent(eventData); @@ -1140,6 +1324,20 @@ function MikCEH.ParseForIncomingBuffs(combatMessage) -- Return the parse was successful. return true; end + + -- Look for a self mana drain. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPOWERDRAINSELFSELF", {"%s", "%a", "%p"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetNotificationEventData(MikCEH.NOTIFICATIONTYPE_POWER_LOSS, capturedData.Amount, capturedData.PowerType, capturedData.SpellName); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end -- Return the parse was NOT successful. return false; @@ -1708,7 +1906,113 @@ function MikCEH.ParseForOutgoingDamageShieldDamage(combatMessage) -- If a match was found. if (capturedData ~= nil) then - local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, nil, capturedData.Name); + local eventData + if capturedData.DamageType == 2 and capturedData.Amount == "20" then + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, "Aura de vindicte", capturedData.Name); + else + eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_HIT, MikCEH.HITTYPE_NORMAL, capturedData.DamageType, capturedData.Amount, nil, capturedData.Name); + end + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a resist. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLRESISTSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_RESIST, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for an immune. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLIMMUNESELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_IMMUNE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for an evade + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLEVADEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_EVADE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + -- Look for a miss. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLMISSSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_MISS, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a dodge. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLDODGEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_DODGE, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a parry. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLPARRIEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_PARRY, nil, nil, nil, capturedData.SpellName, capturedData.Name); + + -- Send the event. + MikCEH.SendEvent(eventData); + + -- Return the parse was successful. + return true; + end + + + -- Look for a block. + local capturedData = MikCEH.GetCapturedData(combatMessage, "SPELLBLOCKEDSELFOTHER", {"%s", "%n"}); + + -- If a match was found. + if (capturedData ~= nil) then + local eventData = MikCEH.GetDamageEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.ACTIONTYPE_BLOCK, nil, nil, nil, capturedData.SpellName, capturedData.Name); -- Send the event. MikCEH.SendEvent(eventData); @@ -1838,6 +2142,9 @@ function MikCEH.ParseForOutgoingHoTs(combatMessage) if (capturedData ~= nil) then local eventData = MikCEH.GetHealEventData(MikCEH.DIRECTIONTYPE_PLAYER_OUTGOING, MikCEH.HEALTYPE_OVER_TIME, capturedData.Amount, capturedData.SpellName, capturedData.Name); + -- Get overheal info. + MikCEH.PopulateOverhealData(eventData); --athenne add + -- Send the event. MikCEH.SendEvent(eventData); @@ -2589,7 +2896,7 @@ function MikCEH.GetGlobalStringInfo(globalStringName) formatCode = currentChar; else -- Check if the character is one of the magic characters and escape it. - if (string.find(currentChar, "[%^%$%(%)%.%[%]%*%+%-%?]")) then + if (string.find(currentChar, "[%^%$%(%)%.%[%]%*%-%+%?]")) then searchString = searchString .. "%" .. currentChar; -- Normal character so just add it to the formatted string. else @@ -2779,6 +3086,8 @@ function MikCEH.GetDamageTypeNumber(damageTypeString) return MikCEH.DAMAGETYPE_SHADOW; elseif (damageTypeString == SPELL_SCHOOL6_CAP) then return MikCEH.DAMAGETYPE_ARCANE; + elseif (damageTypeString == "Arcane") then + return MikCEH.DAMAGETYPE_ARCANE; end -- Return the unknown damage type. @@ -2865,7 +3174,7 @@ end -- Populates the combat event data table for a notification event with the passed -- info. -- ********************************************************************************** -function MikCEH.GetNotificationEventData(notificationType, amount, effectName) +function MikCEH.GetNotificationEventData(notificationType, amount, effectName, SpellName) -- Get the global combat event data table. local eventData = MikCEH.CombatEventData; @@ -2876,7 +3185,12 @@ function MikCEH.GetNotificationEventData(notificationType, amount, effectName) eventData.EventType = MikCEH.EVENTTYPE_NOTIFICATION; eventData.NotificationType = notificationType; eventData.Amount = amount; - eventData.EffectName = effectName; + if effectName == MANA or effectName == RAGE or effectName == ENERGY then + eventData.Amount = amount.." "..effectName; + eventData.EffectName = SpellName; + else + eventData.EffectName = effectName; + end -- Return the event data. return eventData; @@ -2926,7 +3240,14 @@ end -- ********************************************************************************** function MikCEH.PopulateOverhealData(eventData) -- Get the appropriate unit id for the unit being checked for overheals. + local unitID = MikCEH.GetUnitIDFromName(eventData.Name); + + if not unitID then + if UnitName("target") == eventData.Name then + unitID = "target"; + end + end -- Make sure it's a valid unit id. if (unitID) then @@ -3128,7 +3449,8 @@ function MikCEH.ParseSelfHealthTriggers() if (healthPercentage < triggerSettings.Threshold/100 and lastSelfHealthPercentage >= triggerSettings.Threshold/100) then -- Get trigger event data and call the trigger handler. local eventData = MikCEH.GetThresholdTriggerEventData(triggerKey, healthAmount); - MikCEH.SendTriggerEvent(eventData) + MikCEH.SendTriggerEvent(eventData); + PlaySoundFile("Interface\\AddOns\\MikScrollingBattleText\\sounds\\LowHealth.mp3"); end end @@ -3152,7 +3474,8 @@ function MikCEH.ParseSelfManaTriggers() if (manaPercentage < triggerSettings.Threshold/100 and lastSelfManaPercentage >= triggerSettings.Threshold/100) then -- Get trigger event data and call the trigger handler. local eventData = MikCEH.GetThresholdTriggerEventData(triggerKey, manaAmount); - MikCEH.SendTriggerEvent(eventData) + MikCEH.SendTriggerEvent(eventData); + PlaySoundFile("Interface\\AddOns\\MikScrollingBattleText\\sounds\\LowMana.mp3"); end end diff --git a/MikScrollingBattleText/MikScrollingBattleText-enUS.lua b/MikScrollingBattleText/MikScrollingBattleText-enUS.lua new file mode 100644 index 0000000..8d6d6ce --- /dev/null +++ b/MikScrollingBattleText/MikScrollingBattleText-enUS.lua @@ -0,0 +1,25 @@ +local L = AceLibrary("AceLocale-2.2"):new("MikScrollingBattleText") + +L:RegisterTranslations("enUS", function() + return { + ["Debug mode has been enabled."] = true, + ["Debug mode has been disabled."] = true, + ["Event search mode has been enabled. Searching for: "] = true, + ["Event search mode has been disabled."] = true, + ["The mod is now disabled."] = true, + ["The mod is now enabled."] = true, + ["Hits"] = true, + ["Crit"] = true, + ["Crits"] = true, + ["Multiple"] = true, + [" (%d vulnerability)"] = true, + [" <\124cff00b37e\124h%d\124h\124r>"] = true, + ["Profile Reset"] = true, + ["Drowning"] = true, + ["Falling"] = true, + ["Fatigue"] = true, + ["Fire"] = true, + ["Lava"] = true, + ["Slime"] = true, + } +end) \ No newline at end of file diff --git a/MikScrollingBattleText/MikScrollingBattleText-frFR.lua b/MikScrollingBattleText/MikScrollingBattleText-frFR.lua new file mode 100644 index 0000000..2c48368 --- /dev/null +++ b/MikScrollingBattleText/MikScrollingBattleText-frFR.lua @@ -0,0 +1,25 @@ +local L = AceLibrary("AceLocale-2.2"):new("MikScrollingBattleText") + +L:RegisterTranslations("frFR", function() + return { + ["Debug mode has been enabled."] = "Debug mode has been enabled.", + ["Debug mode has been disabled."] = "Debug mode has been disabled.", + ["Event search mode has been enabled. Searching for: "] = "Event search mode has been enabled. Searching for: ", + ["Event search mode has been disabled."] = "Event search mode has been disabled.", + ["The mod is now disabled."] = "The mod is now disabled.", + ["The mod is now enabled."] = "The mod is now enabled.", + ["Hits"] = "Coups", + ["Crit"] = "Crit", + ["Crits"] = "Crits", + ["Multiple"] = "Multiple", + [" (%d vulnerability)"] = " (%d vulnérabilité)", + [" <\124cff00b37e\124h%d\124h\124r>"] = " <\124cff00b37e\124h%d\124h\124r>", + ["Profile Reset"] = "Profile Reset", + ["Drowning"] = "Noyade", + ["Falling"] = "Chute", + ["Fatigue"] = "Fatigue", + ["Fire"] = "Feu", + ["Lava"] = "Lave", + ["Slime"] = "Gelée", + } +end) \ No newline at end of file diff --git a/MikScrollingBattleText/MikScrollingBattleText.lua b/MikScrollingBattleText/MikScrollingBattleText.lua index 940e471..3896c9a 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.lua +++ b/MikScrollingBattleText/MikScrollingBattleText.lua @@ -1,6 +1,7 @@ -------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- @@ -25,8 +26,96 @@ MikSBT.CurrentProfile = nil; -- Private constants. ------------------------------------------------------------------------------------- +-- cache des icones trouvées par l'algo et des icones qu'il ne trouverait pas +if not ICON_CACHE then + ICON_CACHE = {} +end +ICON_CACHE["repousser au loin"] = "Interface\\Icons\\Inv_Gauntlets_05" +ICON_CACHE["rupture du sol"] = "Interface\\Icons\\Spell_Nature_Earthquake" +ICON_CACHE["rayon de l'oeil"] = "Interface\\Icons\\Spell_Nature_Callstorm" +ICON_CACHE["salve de traits de l'ombre"] = "Interface\\Icons\\Spell_Shadow_Shadowbolt" +ICON_CACHE["tempête d'ombre"] = "Interface\\Icons\\spell_shadow_shadowbolt" +ICON_CACHE["gaz"] = "Interface\\Icons\\Spell_Nature_Abolishmagic" +ICON_CACHE["décimer"] = "Interface\\Icons\\Inv_Shield_01" +ICON_CACHE["champ statique"] = "Interface\\Icons\\Spell_Nature_WispHeal" +ICON_CACHE["horion"] = "Interface\\Icons\\Spell_Nature_WispHeal" +ICON_CACHE["secousse"] = "Interface\\Icons\\spell_nature_earthquake" +ICON_CACHE["charge de bouclier"] = "Interface\\Icons\\ability_warrior_charge" +ICON_CACHE["eclair des arcanes"] = "Interface\\Icons\\spell_arcane_starfire" +ICON_CACHE["gémissement des âmes"] = "Interface\\Icons\\spell_nature_lightning" +ICON_CACHE["trait noir"] = "Interface\\Icons\\spell_shadow_shadowbolt" +ICON_CACHE["infusion de mana"] = "Interface\\Icons\\inv_trinket_naxxramas01" +ICON_CACHE["afflux"] = "Interface\\Icons\\Ability_Warrior_Charge" +ICON_CACHE["frappe"] = "Interface\\Icons\\Ability_Rogue_Ambush" +ICON_CACHE["souffle de lave"] = "Interface\\Icons\\Spell_Fire_WindsOfWoe" +ICON_CACHE["frappe des ailes"] = "Interface\\Icons\\Inv_Misc_Monsterscales_14" +ICON_CACHE["lance de flammes"] = "Interface\\Icons\\Ability_Throw" +ICON_CACHE["horion de l'ombre"] = "Interface\\Icons\\Spell_Shadow_Shadowbolt" +ICON_CACHE["explosion de lave"] = "Interface\\Icons\\Spell_Fire_Volcano" +ICON_CACHE["bouclier de lave"] = "Interface\\Icons\\Spell_Fire_Immolation" +ICON_CACHE["fleur de feu"] = "Interface\\Icons\\Spell_Fire_Fireball02" +ICON_CACHE["bombe"] = "Interface\\Icons\\Spell_Fire_Selfdestruct" +ICON_CACHE["explosion"] = "Interface\\Icons\\Spell_Fire_Selfdestruct" +ICON_CACHE["colère de ragnaros"] = "Interface\\Icons\\Spell_Fire_Soulburn" +ICON_CACHE["choc"] = "Interface\\Icons\\Ability_Smash" +ICON_CACHE["secousse violente"] = "Interface\\Icons\\Ability_Smash" +ICON_CACHE["nova de feu"] = "Interface\\Icons\\Spell_Fire_SealOfFire" +ICON_CACHE["marque de détonation"] = "Interface\\Icons\\spell_fire_selfdestruct" +ICON_CACHE["cône de feu"] = "Interface\\Icons\\Spell_Fire_WindsOfWoe" +ICON_CACHE["volée de boules de feu"] = "Interface\\Icons\\Spell_Fire_Flamebolt" +ICON_CACHE["vague de foudre"] = "Interface\\Icons\\Spell_Nature_Chainlightning" +ICON_CACHE["coup de queue"] = "Interface\\Icons\\Inv_Misc_MonsterScales_05" +ICON_CACHE["exploiter faiblesse"] = "Interface\\Icons\\ability_backstab" +ICON_CACHE["lancer feu liquide"] = "Interface\\Icons\\spell_fire_meteorstorm" +ICON_CACHE["poing de force"] = "Interface\\Icons\\inv_gauntlets_31" +ICON_CACHE["uppercut"] = "Interface\\Icons\\inv_gauntlets_31" +ICON_CACHE["sangsue"] = "Interface\\Icons\\ability_racial_cannibalize" +ICON_CACHE["choc de feu"] = "Interface\\Icons\\spell_fire_immolation" +ICON_CACHE["malédiction du sang"] = "Interface\\Icons\\spell_shadow_ritualofsacrifice" +ICON_CACHE["brasier"] = "Interface\\Icons\\spell_fire_incinerate" +ICON_CACHE["météore"] = "Interface\\Icons\\spell_fire_meteorstorm" +ICON_CACHE["jet de poison"] = "Interface\\Icons\\spell_nature_corrosivebreath" +ICON_CACHE["explosion d'ombre"] = "Interface\\Icons\\spell_shadow_antishadow" +ICON_CACHE["voile de l'ombre"] = "Interface\\Icons\\spell_shadow_gathershadows" +ICON_CACHE["nuée maléfique"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["crachat empoisonné"] = "Interface\\Icons\\spell_nature_corrosivebreath" +ICON_CACHE["piétiner"] = "Interface\\Icons\\spell_nature_natureswrath" +ICON_CACHE["spores mutées"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["heurtoir du vomisseur de bile"] = "Interface\\Icons\\ability_devour" +ICON_CACHE["eruption"] = "Interface\\Icons\\spell_fire_volcano" +ICON_CACHE["tempête de mana"] = "Interface\\Icons\\spell_frost_icestorm" +ICON_CACHE["frappe sacrée"] = "Interface\\Icons\\ability_thunderbolt" +ICON_CACHE["grondement du tonnerre"] = "Interface\\Icons\\spell_nature_thunderclap" +ICON_CACHE["déflagration des arcanes"] = "Interface\\Icons\\spell_shadow_deathpact" +ICON_CACHE["nuage pestilentiel"] = "Interface\\Icons\\spell_nature_abolishmagic" +ICON_CACHE["régénération de mana"] = "Interface\\Icons\\spell_nature_manaregentotem" +ICON_CACHE["potion de soins"] = "Interface\\Icons\\inv_potion_54" +ICON_CACHE["restauration du mana"] = "Interface\\Icons\\inv_potion_76" +ICON_CACHE["rune démoniaque"] = "Interface\\Icons\\inv_misc_rune_04" +ICON_CACHE["rune ténébreuse"] = "Interface\\Icons\\spell_shadow_sealofkings" +ICON_CACHE["absorption de magie"] = "Interface\\Icons\\spell_nature_astralrecalgroup" +ICON_CACHE["gel"] = "Interface\\Icons\\spell_frost_glacier" + +ICON_CACHE["lésions cérébrales"] = "Interface\\Icons\\ability_gouge" +ICON_CACHE["décharge électrique"] = "Interface\\Icons\\spell_lightning_lightningbolt01" +ICON_CACHE["foudre"] = "Interface\\Icons\\spell_lightning_lightningbolt01" +ICON_CACHE["enchantement flamboyant"] = "Interface\\Icons\\spell_fire_selfdestruct" +ICON_CACHE["pierre de soins supérieure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins mineure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins inférieure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins majeure"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["pierre de soins"] = "Interface\\Icons\\inv_stone_04" +ICON_CACHE["capturer un esprit"] = "Interface\\Icons\\Spell_Shadow_Haunting" + + +-- Cache des spells dont l'icone n'a pas été trouvée +NO_ICON_CACHE = {} + +-- Babble-Spell pour les icones des spells de class +local BS = AceLibrary("Babble-Spell-2.2") + -- Number of font strings. -local NUM_FONT_STRINGS = 15; +local NUM_FONT_STRINGS = 20; -- Animation values for incoming and outgoing events. local MIN_VERTICAL_SPACING = 8; @@ -40,7 +129,7 @@ local STICKY_DISPLAY_TIME = 2; local STICKY_FADE_OUT_TIME = 0.5; -- The animation speed. -local ANIMATION_SPEED = 0.015; +local ANIMATION_SPEED = 0.02; -- Scroll directions local SCROLL_DIRECTION_UP = 1; @@ -83,9 +172,9 @@ local stillMerging = false; local activeNonStickies = {}; local activeStickies = {}; --- Create a new table recycler object that holds up to 50 table references +-- Create a new table recycler object that holds up to 40 table references -- in primary cache. -local eventsRecycler = MikTRO:NewRecyclerObject(50); +local eventsRecycler = MikTRO:NewRecyclerObject(40); ------------------------------------------------------------------------------------- @@ -482,7 +571,11 @@ function MikSBT.CombatEventsHandler(combatEvent) end -- Copy the amount, effect name, and player/enemy name from the passed combat event data. - animationEvent.Amount = combatEvent.Amount; + -- if combatEvent.Amount then + -- animationEvent.Amount = combatEvent.Amount * 420; + -- else + animationEvent.Amount = combatEvent.Amount; + -- end animationEvent.EffectName = combatEvent.EffectName; animationEvent.Name = combatEvent.Name; @@ -490,19 +583,19 @@ function MikSBT.CombatEventsHandler(combatEvent) if (combatEvent.DamageType ~= nil) then animationEvent.DamageType = MikCEH.GetDamageTypeString(combatEvent.DamageType); end - + -- If there are partial action types set the partial effect text appropriately. if (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_ABSORB) then if (ABSORB_TRAILER) then - animationEvent.PartialEffectText = string.gsub(ABSORB_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = "\124cffFAFA00\124h"..string.gsub(ABSORB_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_BLOCK) then if (BLOCK_TRAILER) then - animationEvent.PartialEffectText = string.gsub(BLOCK_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = "\124cff7F00FF\124h"..string.gsub(BLOCK_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_RESIST) then if (RESIST_TRAILER) then - animationEvent.PartialEffectText = string.gsub(RESIST_TRAILER, "%%d", combatEvent.PartialAmount); + animationEvent.PartialEffectText = " \124cff81007F\124h"..string.gsub(RESIST_TRAILER, "%%d", combatEvent.PartialAmount).."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_VULNERABLE) then if (MikSBT.MSG_VULERNABLE_TRAILER) then @@ -510,11 +603,11 @@ function MikSBT.CombatEventsHandler(combatEvent) end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_CRUSHING) then if (CRUSHING_TRAILER) then - animationEvent.PartialEffectText = CRUSHING_TRAILER; + animationEvent.PartialEffectText = "\124cff7D0000\124h"..CRUSHING_TRAILER.."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_GLANCING) then if (GLANCING_TRAILER) then - animationEvent.PartialEffectText = GLANCING_TRAILER; + animationEvent.PartialEffectText = "\124cffFA0000\124h"..GLANCING_TRAILER.."\124h\124r"; end elseif (combatEvent.PartialActionType == MikCEH.PARTIALACTIONTYPE_OVERHEAL) then animationEvent.OverhealAmount = combatEvent.PartialAmount; @@ -553,6 +646,10 @@ function MikSBT.TriggerHandler(triggerEvent) animationEvent.ScrollArea = scrollAreas.Notification; animationEvent.EventSettings = MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].EventSettings; MikSBT.FormatTriggerText(animationEvent, triggerEvent); + + if (MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].Texture) then + animationEvent.Texture = MikSBT.CurrentProfile.Triggers[triggerEvent.TriggerKey].Texture + end -- Dispatch the event to the animation system. MikSBT.DispatchAnimationEvent(animationEvent); @@ -637,7 +734,11 @@ function MikSBT.MergeEvents(mergeData, numEvents) -- If the events have an amount then total them. if (animationEvent.Amount ~= nil and mergeData.UnmergedEvents[x].Amount ~= nil) then - animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; + animationEvent.Amount = tonumber (animationEvent.Amount, 10) + if animationEvent.Amount and mergeData.UnmergedEvents[x].Amount then + animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; + end + -- animationEvent.Amount = animationEvent.Amount + mergeData.UnmergedEvents[x].Amount; end -- Check if there is an overheal amount and total it. @@ -916,12 +1017,39 @@ end -- ********************************************************************************** function MikSBT.FormatEventText(animationEvent) local outputString = animationEvent.UnformattedText; - + + -- Print(animationEvent) + -- Check if there is no unformatted text and bail. if (outputString == nil) then return; end + outputString = string.gsub(outputString, "-%%a", "\124cffff0000\124h-\124h\124r%%a"); + + if (animationEvent.DamageType ~= nil) then + if animationEvent.DamageType == SPELL_SCHOOL1_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffF6F99E\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL2_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFF8080\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL3_CAP then + outputString = string.gsub(outputString, "%%a", "\124cff80FF80\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL4_CAP then + outputString = string.gsub(outputString, "%%a", "\124cff8080FF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL5_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffA000A0\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL6_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFFB9FF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL0_CAP and animationEvent.EffectName and animationEvent.ScrollArea.AssociatedFrame == "MSBTFrameOutgoing" then + outputString = string.gsub(outputString, "%%a", "\124cffFFFF00\124h%%a\124h\124r"); + elseif animationEvent.DamageType == SPELL_SCHOOL0_CAP then + outputString = string.gsub(outputString, "%%a", "\124cffFFFFFF\124h%%a\124h\124r"); + elseif animationEvent.DamageType == "Inconnu" then + outputString = string.gsub(outputString, "%%a", "\124cffFFB9FF\124h%%a\124h\124r"); + -- DEFAULT_CHAT_FRAME:AddMessage(animationEvent.DamageType) + end + end + -- Substitute amount. if (animationEvent.Amount ~= nil) then -- Check if there is overheal info @@ -934,8 +1062,11 @@ function MikSBT.FormatEventText(animationEvent) end -- Substitute enemy/player names. - if (animationEvent.Name ~= nil) then + if (animationEvent.Name ~= nil) and (animationEvent.Name ~= UnitName("player")) then outputString = string.gsub(outputString, "%%n", animationEvent.Name); + else + outputString = string.gsub(outputString, "%(%%n%)", ""); + outputString = string.gsub(outputString, "%%n", ""); end -- Substitute effect names. @@ -1376,10 +1507,14 @@ function MikSBT.AddAnimation(animationEvent) -- Loop through all of the suppression entries and look for a match. for _, suppressionSettings in MikSBT.CurrentProfile.Suppressions do -- Check if the suppression's search pattern is a match. - if (suppressionSettings.Enabled and string.find(animationEvent.Text, suppressionSettings.SearchPattern)) then + if (suppressionSettings.Enabled and (string.find(animationEvent.Text, suppressionSettings.SearchPattern))) then -- Reclaim the animation event table to the events recycler and leave the function. eventsRecycler:ReclaimTable(animationEvent); - return; + return; + elseif (suppressionSettings.Enabled and animationEvent.EffectName and string.find(animationEvent.EffectName, suppressionSettings.SearchPattern)) then + -- Reclaim the animation event table to the events recycler and leave the function. + eventsRecycler:ReclaimTable(animationEvent); + return; end end @@ -1389,6 +1524,30 @@ function MikSBT.AddAnimation(animationEvent) animationEvent.IsSticky = true; end + -- Color UnitName by class + local UnitID = MikCEH.GetUnitIDFromName(animationEvent.Name) + if UnitID then + local Class = UnitClass(UnitID) + if Class and Class == "Paladin" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffF58CBA|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Druide" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFF7D0A|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Chasseur" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffABD473|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Mage" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff69CCF0|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Prêtre" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFFFFFF|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Voleur" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffFFF569|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Chaman" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff0070DE|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Démoniste" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cff9482C9|h"..animationEvent.Name.."|h|r") + elseif Class and Class == "Guerrier" then + animationEvent.Text = string.gsub(animationEvent.Text, animationEvent.Name, "|cffC79C6E|h"..animationEvent.Name.."|h|r") + end + end -- Get the next available animation display info object for the scroll area. local animDisplayInfo = MikSBT.GetNextAnimationDisplayInfo(animationEvent); @@ -1447,7 +1606,62 @@ function MikSBT.AddAnimation(animationEvent) animDisplayInfo.FontObject:SetText(animationEvent.Text); animDisplayInfo.FontObject:SetAlpha(animDisplayInfo.Alpha); animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); - + + -- Athene Edit - Spell Icon + local texture + if animationEvent.Texture then texture = animationEvent.Texture end + if animationEvent.EffectName then + local name = string.gsub(animationEvent.EffectName, " %(%d+%)", "") + -- DEFAULT_CHAT_FRAME:AddMessage(animationEvent.EffectName) + -- DEFAULT_CHAT_FRAME:AddMessage(name) + -- texture = BS:GetSpellIcon(name) + if ICON_CACHE[strlower(name)] then + texture = ICON_CACHE[strlower(name)] + elseif not texture and MikSBT.FindBuff(name) then + local bufftype,index,_ = MikSBT.FindBuff(name) + local icon + if bufftype == "buff" then + icon = UnitBuff("player", index) + ICON_CACHE[strlower(name)] = icon + texture = icon + elseif bufftype == "debuff" then + icon = UnitDebuff("player", index) + ICON_CACHE[strlower(name)] = icon + texture = icon + else + texture = nil + NO_ICON_CACHE[strlower(name)] = 1 + end + elseif not texture and BS:GetSpellIcon(name) then + texture = BS:GetSpellIcon(name) + elseif not texture and MikSBT.FindItemIcon(name) then + texture = MikSBT.FindItemIcon(name) + ICON_CACHE[strlower(name)] = MikSBT.FindItemIcon(name) + elseif not texture then + texture = nil + NO_ICON_CACHE[strlower(name)] = 1 + end + end + + if texture then + -- local frame + if not animDisplayInfo.Texture then + -- on creer une nouvelle texture + animDisplayInfo.Texture = getglobal(animationEvent.ScrollArea.AssociatedFrame):CreateTexture(nil, "ARTWORK") + end + -- on réutilise une texture existante + animDisplayInfo.Texture:ClearAllPoints(); + animDisplayInfo.Texture:SetTexture(nil); + animDisplayInfo.Texture:SetTexture(texture); + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetTexCoord(0.125, 0.875, 0.125, 0.875) + animDisplayInfo.Texture:SetPoint("RIGHT", animDisplayInfo.FontObject, "LEFT", -4, 0); + animDisplayInfo.Texture:SetDrawLayer(animDisplayInfo.IsSticky and "OVERLAY" or animDisplayInfo.IsCrit and "OVERLAY" or "ARTWORK"); + elseif animDisplayInfo.Texture then + animDisplayInfo.Texture:SetTexture(nil); + end + -- Set the last update to the current time. animDisplayInfo.LastUpdated = GetTime(); @@ -1475,6 +1689,116 @@ function MikSBT.AddAnimation(animationEvent) eventsRecycler:ReclaimTable(animationEvent); end +-- ********************************************************************************** +-- This function return the buff texture based on +-- it's name. +-- ********************************************************************************** +function ItemLinkToName(link) + return gsub(link,"^.*%[(.*)%].*$","%1"); +end + +function MikSBT.FindItemIcon(item) + if ( not item ) then return; end + item = string.lower(item); + local link; + for i = 1,23 do + link = GetInventoryItemLink("player",i); + if ( link ) then + if ( item == string.lower(ItemLinkToName(link)) )then + return i, nil, GetInventoryItemTexture('player', i), GetInventoryItemCount('player', i); + end + end + end + local count, bag, slot, texture; + for i = 0,NUM_BAG_FRAMES do + for j = 1,MAX_CONTAINER_ITEMS do + link = GetContainerItemLink(i,j); + if ( link ) then + if ( item == string.lower(ItemLinkToName(link))) then + bag, slot = i, j; + texture, count = GetContainerItemInfo(i,j); + end + end + end + end + return texture; +end + +-- ********************************************************************************** +-- This function return the buff texture based on +-- it's name. +-- ********************************************************************************** +function MikSBT.FindBuff( obuff, unit, item) + local buff=strlower(obuff); + local tooltip=MSBT_Tooltip; + local textleft1=getglobal(tooltip:GetName().."TextLeft1"); + if ( not unit ) then + unit ='player'; + end + local my, me, mc, oy, oe, oc = GetWeaponEnchantInfo(); + if ( my ) then + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetInventoryItem( unit, 16); + for i=1, 23 do + local text = getglobal("MSBT_TooltipTextLeft"..i):GetText(); + if ( not text ) then + break; + elseif (text and strlower(text) == buff) then + tooltip:Hide(); + return "main",me, mc; + end + end + tooltip:Hide(); + elseif ( oy ) then + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetInventoryItem( unit, 17); + for i=1, 23 do + local text = getglobal("MSBT_TooltipTextLeft"..i):GetText(); + if ( not text ) then + break; + elseif (text and strlower(text) == buff) then + tooltip:Hide(); + return "off", oe, oc; + end + end + tooltip:Hide(); + end + if ( item ) then return end + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetTrackingSpell(); + local b = textleft1:GetText(); + if ( b and strlower(b) == buff ) then + tooltip:Hide(); + return "track",b; + end + local c=nil; + for i=1, 32 do + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetUnitBuff(unit, i); + b = textleft1:GetText(); + tooltip:Hide(); + if ( b and strlower(b) == buff ) then + return "buff", i, b; + elseif ( c==b ) then + break; + end + --c = b; + end + c=nil; + for i=1, 16 do + tooltip:SetOwner(UIParent, "ANCHOR_NONE"); + tooltip:SetUnitDebuff(unit, i); + b = textleft1:GetText(); + tooltip:Hide(); + if ( b and strlower(b) == buff ) then + return "debuff", i, b; + elseif ( c==b) then + break; + end + --c = b; + end + tooltip:Hide(); +end -- ********************************************************************************** -- This function gets the next animation display info object for the correct @@ -1769,18 +2093,55 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) local textDelta = animDisplayInfo.FontSize * (1 - (elapsedTime / STICKY_FADE_IN_TIME)); animDisplayInfo.FontObject:SetTextHeight(animDisplayInfo.FontSize + textDelta); animDisplayInfo.FontObject:SetAlpha(1); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(1); + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize + textDelta); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize + textDelta); + end return; elseif (elapsedTime <= (STICKY_DISPLAY_TIME + STICKY_FADE_IN_TIME)) then animDisplayInfo.FontObject:SetTextHeight(animDisplayInfo.FontSize); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetWidth(animDisplayInfo.FontSize); + animDisplayInfo.Texture:SetHeight(animDisplayInfo.FontSize); + end + if animDisplayInfo.IsCrit then + if not animDisplayInfo.timeLastJiggled then + animDisplayInfo.originalPositionX = animDisplayInfo.PositionX + animDisplayInfo.originalPositionY = animDisplayInfo.PositionY + animDisplayInfo.DecalageX = 0 + animDisplayInfo.DecalageY = 0 + animDisplayInfo.timeLastJiggled = 0 + end + if animDisplayInfo.PositionY ~= (animDisplayInfo.originalPositionY + animDisplayInfo.DecalageY) then + animDisplayInfo.originalPositionX = animDisplayInfo.PositionX + animDisplayInfo.originalPositionY = animDisplayInfo.PositionY + end + if (elapsedTime - animDisplayInfo.timeLastJiggled > 0.05) then + animDisplayInfo.DecalageX = math.ceil(math.random(-1, 1)); + animDisplayInfo.DecalageY = math.ceil(math.random(-1, 1)); + animDisplayInfo.PositionX = animDisplayInfo.originalPositionX + animDisplayInfo.DecalageX; + animDisplayInfo.PositionY = animDisplayInfo.originalPositionY + animDisplayInfo.DecalageY; + animDisplayInfo.timeLastJiggled = elapsedTime; + animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); + end + end return; elseif (elapsedTime <= (STICKY_DISPLAY_TIME + STICKY_FADE_IN_TIME + STICKY_FADE_OUT_TIME)) then local alpha = 1 - ((elapsedTime - STICKY_DISPLAY_TIME - STICKY_FADE_IN_TIME) / STICKY_FADE_OUT_TIME); + animDisplayInfo.timeLastJiggled = nil animDisplayInfo.FontObject:SetAlpha(alpha); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(alpha); + end return; end -- Deactivate the animation. animDisplayInfo.FontObject:SetAlpha(0); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(0); + end animDisplayInfo.IsActive = false; return; @@ -1797,6 +2158,9 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) if (animationComplete) then -- Set the font object's alpha. animDisplayInfo.FontObject:SetAlpha(0); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(0); + end -- Deactive the animation. animDisplayInfo.IsActive = false; @@ -1804,6 +2168,9 @@ function MikSBT.DoAnimation(animDisplayInfo, scrollArea) -- Move the font object and set its alpha. animDisplayInfo.FontObject:SetPoint(animDisplayInfo.AnchorPoint, animDisplayInfo.PositionX, animDisplayInfo.PositionY); animDisplayInfo.FontObject:SetAlpha(animDisplayInfo.Alpha); + if animDisplayInfo.Texture then + animDisplayInfo.Texture:SetAlpha(animDisplayInfo.Alpha); + end end -- Set the last update to the current time. @@ -2151,7 +2518,7 @@ end -- Displays the passed message in the passed scroll area with the passed parameters. -- This function is for easy displaying of messages from external sources. -- ********************************************************************************** -function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, colorB, fontSize, fontIndex, outlineIndex) +function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, colorB, fontSize, fontIndex, outlineIndex, Texture) -- Check if no message was passed and do nothing. if (message == nil) then return; @@ -2235,6 +2602,7 @@ function MikSBT.DisplayMessage(message, displayType, isSticky, colorR, colorG, c animationEvent.ColorR = colorR; animationEvent.ColorG = colorG; animationEvent.ColorB = colorB; + animationEvent.Texture = Texture; -- Add the event to the animation system. diff --git a/MikScrollingBattleText/MikScrollingBattleText.toc b/MikScrollingBattleText/MikScrollingBattleText.toc index 878bc23..e780d18 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.toc +++ b/MikScrollingBattleText/MikScrollingBattleText.toc @@ -1,8 +1,17 @@ ## Interface: 11200 -## Version: 3.01 +## Version: 3.9 ## Title: Mik's Scrolling Battle Text ## Notes: Scrolls battle information around the character model. +## OptionalDeps: SW_FixLogStrings ## SavedVariables: MikSBT_Save + +Libs\AceLibrary\AceLibrary.lua +Libs\AceLocale-2.2\AceLocale-2.2.lua +Libs\BabbleSpell-2.2\Babble-Spell-2.2.lua + +MikScrollingBattleText-enUS.lua +MikScrollingBattleText-frFR.lua + localization.lua MikTableRecyclerObject.lua MikCombatEventHelper.lua diff --git a/MikScrollingBattleText/MikScrollingBattleText.xml b/MikScrollingBattleText/MikScrollingBattleText.xml index c6b75ac..0975874 100644 --- a/MikScrollingBattleText/MikScrollingBattleText.xml +++ b/MikScrollingBattleText/MikScrollingBattleText.xml @@ -11,6 +11,15 @@ + + + @@ -29,91 +38,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -140,91 +159,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -251,91 +280,101 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MikScrollingBattleText/MikTableRecyclerObject.lua b/MikScrollingBattleText/MikTableRecyclerObject.lua index 9c35d6b..03d308b 100644 --- a/MikScrollingBattleText/MikTableRecyclerObject.lua +++ b/MikScrollingBattleText/MikTableRecyclerObject.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Table Recyler Object -- Author: Mik +-- Maintainer: Athene -- Credits: -- Thanks to tekkub, the author of compostLib. I adapted much of his code for -- this object. diff --git a/MikScrollingBattleText/localization.lua b/MikScrollingBattleText/localization.lua index f3f5b70..e5dbf56 100644 --- a/MikScrollingBattleText/localization.lua +++ b/MikScrollingBattleText/localization.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create "namespace." @@ -11,12 +12,14 @@ MikSBT = {}; ------------------------------------------------------------------------------- MikSBT.MOD_NAME = "MikScrollingBattleText" -MikSBT.VERSION_NUMBER = 3.01; -MikSBT.VERSION_STRING = "v3.01"; -MikSBT.WINDOW_TITLE = "Mik's Scrolling Battle Text " .. MikSBT.VERSION_STRING; +MikSBT.VERSION_NUMBER = 3.9; +MikSBT.VERSION_STRING = "v3.9"; +MikSBT.WINDOW_TITLE = "Mik's Scrolling Battle Text " .. MikSBT.VERSION_STRING .. " - \124cffF58CBA\124hAthene Edit\124h\124r"; MikSBT.COMMAND = "/msbt"; +local BS = AceLibrary("Babble-Spell-2.2") +local L = AceLibrary("AceLocale-2.2"):new(MikSBT.MOD_NAME) ------------------------------------------------------------------------------- -- English (Default) @@ -53,25 +56,25 @@ MikSBT.COMMAND_USAGE = { -- Output messages ------------------------------ -MikSBT.MSG_DEBUG_ENABLE = "Debug mode has been enabled."; -MikSBT.MSG_DEBUG_DISABLE = "Debug mode has been disabled."; -MikSBT.MSG_SEARCH_ENABLE = "Event search mode has been enabled. Searching for: "; -MikSBT.MSG_SEARCH_DISABLE = "Event search mode has been disabled."; -MikSBT.MSG_DISABLE = "The mod is now disabled."; -MikSBT.MSG_ENABLE = "The mod is now enabled."; -MikSBT.MSG_HITS = "Hits"; -MikSBT.MSG_CRIT = "Crit"; -MikSBT.MSG_CRITS = "Crits"; -MikSBT.MSG_MULTIPLE_TARGETS = "Multiple"; -MikSBT.MSG_VULERNABLE_TRAILER = " (%d vulnerability)"; -MikSBT.MSG_OVERHEAL_TRAILER = " <%d>"; -MikSBT.MSG_PROFILE_RESET = "Profile Reset"; -MikSBT.MSG_ENVIRONMENTAL_DROWNING = "Drowning"; -MikSBT.MSG_ENVIRONMENTAL_FALLING = "Falling"; -MikSBT.MSG_ENVIRONMENTAL_FATIGUE = "Fatigue"; -MikSBT.MSG_ENVIRONMENTAL_FIRE = "Fire"; -MikSBT.MSG_ENVIRONMENTAL_LAVA = "Lava"; -MikSBT.MSG_ENVIRONMENTAL_SLIME = "Slime"; +MikSBT.MSG_DEBUG_ENABLE = L["Debug mode has been enabled."]; +MikSBT.MSG_DEBUG_DISABLE = L["Debug mode has been disabled."]; +MikSBT.MSG_SEARCH_ENABLE = L["Event search mode has been enabled. Searching for: "]; +MikSBT.MSG_SEARCH_DISABLE = L["Event search mode has been disabled."]; +MikSBT.MSG_DISABLE = L["The mod is now disabled."]; +MikSBT.MSG_ENABLE = L["The mod is now enabled."]; +MikSBT.MSG_HITS = L["Hits"]; +MikSBT.MSG_CRIT = L["Crit"]; +MikSBT.MSG_CRITS = L["Crits"]; +MikSBT.MSG_MULTIPLE_TARGETS = L["Multiple"]; +MikSBT.MSG_VULERNABLE_TRAILER = L[" (%d vulnerability)"]; +MikSBT.MSG_OVERHEAL_TRAILER = L[" <\124cff00b37e\124h%d\124h\124r>"]; +MikSBT.MSG_PROFILE_RESET = L["Profile Reset"]; +MikSBT.MSG_ENVIRONMENTAL_DROWNING = L["Drowning"]; +MikSBT.MSG_ENVIRONMENTAL_FALLING = L["Falling"]; +MikSBT.MSG_ENVIRONMENTAL_FATIGUE = L["Fatigue"]; +MikSBT.MSG_ENVIRONMENTAL_FIRE = L["Fire"]; +MikSBT.MSG_ENVIRONMENTAL_LAVA = L["Lava"]; +MikSBT.MSG_ENVIRONMENTAL_SLIME = L["Slime"]; @@ -89,6 +92,11 @@ MikSBT.AVAILABLE_FONTS = { [6] = {Name="Friz", Path="Fonts\\FRIZQT__.TTF"}, [7] = {Name="Porky", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\porky.ttf"}, [8] = {Name="Signature", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\signature.ttf"}, + [9] = {Name="Black Castle", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\BlackCastleMF.ttf"}, + [10] = {Name="Exocet", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\exocet.ttf"}, + [11] = {Name="FuturaBold", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\FuturaBold.ttf"}, + [12] = {Name="Mail Ray Stuff", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\mailrays.ttf"}, + [13] = {Name="Pepsi", Path="Interface\\Addons\\MikScrollingBattleText\\Fonts\\pepsi.ttf"}, }; -- Holds the available font outlines. @@ -151,20 +159,20 @@ MikSBT.DEFAULT_CONFIG = { CreationVersion = MikSBT.VERSION_NUMBER, ShowPartialEffects = true, ShowOverheals = true, - ShowGameDamage = false, + ShowGameDamage = true, UseStickyCrits = true, - AnimationStep = 2, + AnimationStep = 1.5, MasterFontSettings = { - Normal = {FontIndex=1, OutlineIndex=3, FontSize=18}, - Crit = {FontIndex=1, OutlineIndex=3, FontSize=26}, + Normal = {FontIndex=7, OutlineIndex=2, FontSize=18}, + Crit = {FontIndex=7, OutlineIndex=2, FontSize=26}, }, DisplaySettings = { Incoming = { Show = true, - FrameOffsets = {x=-60, y=-160}, - AnimationStyle = 2, - ScrollDirection = 2, - ScrollHeight = 260, + FrameOffsets = {x=-450, y=-170}, + AnimationStyle = 1, + ScrollDirection = 1, + ScrollHeight = 450, FontSettings = { Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -173,10 +181,10 @@ MikSBT.DEFAULT_CONFIG = { }, Outgoing = { Show = true, - FrameOffsets = {x=60, y=-160}, - AnimationStyle = 3, - ScrollDirection = 2, - ScrollHeight = 260, + FrameOffsets = {x=450, y=-170}, + AnimationStyle = 1, + ScrollDirection = 1, + ScrollHeight = 450, FontSettings = { Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -185,8 +193,8 @@ MikSBT.DEFAULT_CONFIG = { }, Notification = { Show = true, - FrameOffsets = {x=0, y=100}, - AnimationStyle = 1, + FrameOffsets = {x=-300, y=-322}, + AnimationStyle = 1, ScrollDirection = 1, ScrollHeight = 150, FontSettings = { @@ -199,16 +207,16 @@ MikSBT.DEFAULT_CONFIG = { EventSettings = { MSBT_EVENTTYPE_INCOMING_DAMAGE = { Show = true, - Message = "(%n) -%a", + Message = "-%a", FontSettings = { - Color = {r=1, g=0, b=0}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_MISS = { Show = true, - Message = "Miss!", + Message = MISS.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -216,7 +224,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_DODGE = { Show = true, - Message = "Dodge!", + Message = DODGE.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -224,7 +232,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_PARRY = { Show = true, - Message = "Parry!", + Message = PARRY.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -232,7 +240,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_BLOCK = { Show = true, - Message = "Block!", + Message = BLOCK.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -240,7 +248,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_ABSORB = { Show = true, - Message = "Absorb!", + Message = ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -248,7 +256,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_IMMUNE = { Show = true, - Message = "Immune!", + Message = IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -256,24 +264,24 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_DAMAGE = { Show = true, - Message = "(%s) -%a", + Message = "-%a", FontSettings = { - Color = {r=0.502, g=0, b=0.502}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_SPELL_DOT = { Show = true, - Message = "(%s) -%a", + Message = "-%a", FontSettings = { - Color = {r=0.502, g=0, b=0.502}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_INCOMING_SPELL_MISS = { Show = true, - Message = "(%s) Miss!", + Message = MISS.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -281,7 +289,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_DODGE = { Show = true, - Message = "(%s) Dodge!", + Message = DODGE.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -289,7 +297,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_PARRY = { Show = true, - Message = "(%s) Parry!", + Message = PARRY.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -297,7 +305,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_BLOCK = { Show = true, - Message = "(%s) Block!", + Message = BLOCK.."!", FontSettings = { Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -305,7 +313,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_RESIST = { Show = true, - Message = "(%s) Resist!", + Message = "(%s) "..RESIST.."!", FontSettings = { Color = {r=0.502, g=0, b=0.502}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -313,7 +321,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_ABSORB = { Show = true, - Message = "(%s) Absorb!", + Message = "(%s) "..ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -321,7 +329,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_IMMUNE = { Show = true, - Message = "(%s) Immune!", + Message = "(%s) "..IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -329,7 +337,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_SPELL_REFLECT = { Show = true, - Message = "(%s) Reflect!", + Message = "(%s) "..REFLECT.."!", FontSettings = { Color = {r=0.502, g=0, b=0.502}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -338,7 +346,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_HEAL = { Show = true, - Message = "(%s - %n) +%a", + Message = "+%a (%n)", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -347,7 +355,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_INCOMING_HOT = { Show = true, - Message = "(%s - %n) +%a", + Message = "+%a (%n)", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -367,46 +375,46 @@ MikSBT.DEFAULT_CONFIG = { Show = true, Message = "%a", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, Crit = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_MISS = { Show = true, - Message = "Miss!", + Message = MISS.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_DODGE = { Show = true, - Message = "Dodge!", + Message = DODGE.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_PARRY = { Show = true, - Message = "Parry!", + Message = PARRY.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_BLOCK = { Show = true, - Message = "Block!", + Message = BLOCK.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=0, g=0, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_ABSORB = { Show = true, - Message = "Absorb!", + Message = ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -414,7 +422,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_IMMUNE = { Show = true, - Message = "Immune!", + Message = IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -422,7 +430,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_EVADE = { Show = true, - Message = "Evade!", + Message = EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -430,7 +438,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_DAMAGE = { Show = true, - Message = "%a (%s)", + Message = "%a", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -439,7 +447,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_DOT = { Show = true, - Message = "%a (%s)", + Message = "%a", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -447,39 +455,39 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_MISS = { Show = true, - Message = "Miss! (%s)", + Message = MISS.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_DODGE = { Show = true, - Message = "Dodge! (%s)", + Message = DODGE.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_PARRY = { Show = true, - Message = "Parry! (%s)", + Message = PARRY.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_BLOCK = { Show = true, - Message = "Block! (%s)", + Message = BLOCK.."!", FontSettings = { - Color = {r=1, g=1, b=1}, + Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_OUTGOING_SPELL_RESIST = { Show = true, - Message = "Resist! (%s)", + Message = RESIST.."!", FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -487,7 +495,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_ABSORB = { Show = true, - Message = "Absorb! (%s)", + Message = "(%s) "..ABSORB.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -495,7 +503,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_IMMUNE = { Show = true, - Message = "Immune! (%s)", + Message = "(%s) "..IMMUNE.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -503,7 +511,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_REFLECT = { Show = true, - Message = "Reflect! (%s)", + Message = "(%s) "..REFLECT.."!", FontSettings = { Color = {r=1, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -512,7 +520,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_SPELL_EVADE = { Show = true, - Message = "Evade! (%s)", + Message = "(%s) "..EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -520,7 +528,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_HEAL = { Show = true, - Message = "+%a (%s - %n)", + Message = "+%a", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -529,7 +537,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_HOT = { Show = true, - Message = "+%a (%s - %n)", + Message = "+%a", FontSettings = { Color = {r=0, g=1, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -549,7 +557,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_MISS = { Show = true, - Message = "Pet Miss!", + Message = "Pet "..MISS.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -557,7 +565,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_DODGE = { Show = true, - Message = "Pet Dodge!", + Message = "Pet "..DODGE.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -565,7 +573,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_PARRY = { Show = true, - Message = "Pet Parry!", + Message = "Pet "..PARRY.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -573,7 +581,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_BLOCK = { Show = true, - Message = "Pet Block!", + Message = "Pet "..BLOCK.."!", FontSettings = { Color = {r=1, g=0.502, b=0}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -581,7 +589,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_ABSORB = { Show = true, - Message = "Pet Absorb!", + Message = "Pet "..ABSORB.."!", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -589,7 +597,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_IMMUNE = { Show = true, - Message = "Pet Immune!", + Message = "Pet "..IMMUNE.."!", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -597,7 +605,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_EVADE = { Show = true, - Message = "Pet Evade!", + Message = "Pet "..EVADE.."!", FontSettings = { Color = {r=1, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -614,7 +622,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_MISS = { Show = true, - Message = "Pet Miss! (%s)", + Message = "Pet "..MISS.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -622,7 +630,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_DODGE = { Show = true, - Message = "Pet Dodge! (%s)", + Message = "Pet "..DODGE.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -630,7 +638,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_PARRY = { Show = true, - Message = "Pet Parry! (%s)", + Message = "Pet "..PARRY.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -638,7 +646,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_BLOCK = { Show = true, - Message = "Pet Block! (%s)", + Message = "Pet "..BLOCK.."! (%s)", FontSettings = { Color = {r=0.33, g=0.33, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -646,7 +654,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_RESIST = { Show = true, - Message = "Pet Resist! (%s)", + Message = "Pet "..RESIST.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -654,7 +662,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_ABSORB = { Show = true, - Message = "Pet Absorb! (%s)", + Message = "Pet "..ABSORB.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -662,7 +670,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_IMMUNE = { Show = true, - Message = "Pet Immune! (%s)", + Message = "Pet "..IMMUNE.."! (%s)", FontSettings = { Color = {r=0.502, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, @@ -670,7 +678,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_OUTGOING_PET_SPELL_EVADE = { Show = true, - Message = "Pet Evade! (%s)", + Message = "Pet "..EVADE.."! (%s)", FontSettings = { Color = {r=1, g=0.502, b=1}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=22}, @@ -735,19 +743,19 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_POWER_GAIN = { Show = true, - Message = "+%a %s", + Message = "+%a", IsSticky = false, FontSettings = { - Color = {r=1, g=1, b=0}, + Color = {r=0.3098039215686275, g=0.3098039215686275, b=0.8784313725490196}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, MSBT_EVENTTYPE_NOTIFICATION_POWER_LOSS = { Show = true, - Message = "-%a %s", + Message = "-%a", IsSticky = false, FontSettings = { - Color = {r=1, g=1, b=0}, + Color = {r=0.7568627450980392, g=0.2705882352941176, b=0.8235294117647058}, Normal = {FontIndex=0, OutlineIndex=0, FontSize=0}, }, }, @@ -771,7 +779,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_HONOR_GAIN = { Show = true, - Message = "+%a Honor", + Message = "+%a "..HONOR, IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -780,7 +788,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_REP_GAIN = { Show = true, - Message = "+%a Reputation (%s)", + Message = "+%a "..TUTORIAL_TITLE16.." (%s)", IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -789,7 +797,7 @@ MikSBT.DEFAULT_CONFIG = { }, MSBT_EVENTTYPE_NOTIFICATION_REP_LOSS = { Show = true, - Message = "-%a Reputation (%s)", + Message = "-%a "..TUTORIAL_TITLE16.." (%s)", IsSticky = false, FontSettings = { Color = {r=0.502, g=0.502, b=0.698}, @@ -849,6 +857,7 @@ MikSBT.DEFAULT_CONFIG = { TriggerType = 1, Threshold = 40, }, + Texture = "Interface\\Icons\\spell_holy_sealofsacrifice" }, MSBT_TRIGGER_LOW_MANA = { EventSettings = { @@ -881,11 +890,12 @@ MikSBT.DEFAULT_CONFIG = { TriggerType = 3, Threshold = 40, }, + Texture = "Interface\\Icons\\spell_holy_sealofsacrifice" }, MSBT_TRIGGER_EXECUTE = { EventSettings = { Show = true, - Message = "Execute!", + Message = BS["Execute"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -893,15 +903,33 @@ MikSBT.DEFAULT_CONFIG = { }, }, TriggerSettings = { - Classes = {PALADIN=true,WARRIOR=true}, + Classes = {WARRIOR=true}, TriggerType = 4, Threshold = 20, }, + Texture = "Interface\\Icons\\inv_sword_48" + }, + MSBT_TRIGGER_HAMMER_OF_WRATH = { + EventSettings = { + Show = true, + Message = BS["Hammer of Wrath"].."!", + IsSticky = true, + FontSettings = { + Color = {r=1, g=1, b=0}, + Normal = {FontIndex=0, OutlineIndex=0, FontSize=26}, + }, + }, + TriggerSettings = { + Classes = {PALADIN=true}, + TriggerType = 4, + Threshold = 20, + }, + Texture = "Interface\\Icons\\ability_thunderclap" }, MSBT_TRIGGER_COUNTER_ATTACK = { EventSettings = { Show = true, - Message = "Counterattack!", + Message = BS["Counterattack"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -915,11 +943,12 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSPARRYOTHERSELF", "SPELLPARRIEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_warrior_challange" }, MSBT_TRIGGER_MONGOOSE_BITE = { EventSettings = { Show = true, - Message = "Mongoose Bite!", + Message = BS["Mongoose Bite"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -933,11 +962,12 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSDODGEOTHERSELF", "SPELLDODGEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_hunter_swiftstrike" }, MSBT_TRIGGER_CLEARCAST = { EventSettings = { Show = true, - Message = "Clearcast!", + Message = BS["Clearcasting"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -948,13 +978,14 @@ MikSBT.DEFAULT_CONFIG = { Classes = {MAGE=true,SHAMAN=true}, TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain Clearcast"}, + SearchPatterns = {string.format(AURAADDEDSELFHELPFUL, BS["Clearcasting"])}, }, + Texture = "Interface\\Icons\\spell_shadow_manaburn" }, MSBT_TRIGGER_RIPOSTE = { EventSettings = { Show = true, - Message = "Riposte!", + Message = BS["Riposte"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -968,6 +999,7 @@ MikSBT.DEFAULT_CONFIG = { "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PARTY_DAMAGE"}, SearchPatterns = {"VSPARRYOTHERSELF", "SPELLPARRIEDOTHERSELF"}, }, + Texture = "Interface\\Icons\\ability_warrior_challange" }, MSBT_TRIGGER_WINDFURY = { EventSettings = { @@ -982,13 +1014,31 @@ MikSBT.DEFAULT_CONFIG = { TriggerSettings = { TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain %d extra attacks through Windfury"}, + SearchPatterns = {string.format(SPELLEXTRAATTACKSSELF, 1, BS["Windfury Weapon"])}, --"Vous gagnez %d attaques supplémentaires grâce à Arme Furie-des-vents" }, + Texture = "Interface\\Icons\\spell_nature_cyclone" + }, + MSBT_TRIGGER_HAND_OF_JUSTICE = { + EventSettings = { + Show = true, + Message = BS["Hand of Justice"].."!", + IsSticky = true, + FontSettings = { + Color = {r=1, g=1, b=0}, + Normal = {FontIndex=0, OutlineIndex=0, FontSize=26}, + }, + }, + TriggerSettings = { + TriggerType = 6, + TriggerEvents = {"CHAT_MSG_SPELL_SELF_BUFF"}, + SearchPatterns = {string.format(SPELLEXTRAATTACKSSELF, 1, BS["Hand of Justice"])}, --"Vous gagnez %d attaques supplémentaires grâce à Main de justice" + }, + Texture = "Interface\\Icons\\inv_jewelry_talisman_01" }, MSBT_TRIGGER_NIGHTFALL = { EventSettings = { Show = true, - Message = "Nightfall!", + Message = BS["Nightfall"].."!", IsSticky = true, FontSettings = { Color = {r=0.709, g=0, b=0.709}, @@ -999,13 +1049,14 @@ MikSBT.DEFAULT_CONFIG = { Classes = {WARLOCK=true}, TriggerType = 6, TriggerEvents = {"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS"}, - SearchPatterns = {"You gain Shadow Trance"}, + SearchPatterns = {string.format(AURAADDEDSELFHELPFUL, BS["Shadow Trance"])}, }, + Texture = "Interface\\Icons\\spell_shadow_twilight" }, MSBT_TRIGGER_OVERPOWER = { EventSettings = { Show = true, - Message = "Overpower!", + Message = BS["Overpower"].."!", IsSticky = true, FontSettings = { Color = {r=1, g=1, b=0}, @@ -1018,6 +1069,7 @@ MikSBT.DEFAULT_CONFIG = { TriggerEvents = {"CHAT_MSG_COMBAT_SELF_MISSES", "CHAT_MSG_SPELL_SELF_DAMAGE"}, SearchPatterns = {"VSDODGESELFOTHER", "SPELLDODGEDSELFOTHER"}, }, + Texture = "Interface\\Icons\\ability_meleedamage" }, }, diff --git a/MikScrollingBattleText/sounds/LowHealth.mp3 b/MikScrollingBattleText/sounds/LowHealth.mp3 new file mode 100644 index 0000000..b97b894 Binary files /dev/null and b/MikScrollingBattleText/sounds/LowHealth.mp3 differ diff --git a/MikScrollingBattleText/sounds/LowMana.mp3 b/MikScrollingBattleText/sounds/LowMana.mp3 new file mode 100644 index 0000000..93bfd89 Binary files /dev/null and b/MikScrollingBattleText/sounds/LowMana.mp3 differ diff --git a/MikScrollingBattleTextOptions/MSBTOptions.lua b/MikScrollingBattleTextOptions/MSBTOptions.lua index 16322af..818be8c 100644 --- a/MikScrollingBattleTextOptions/MSBTOptions.lua +++ b/MikScrollingBattleTextOptions/MSBTOptions.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text Options -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- @@ -34,7 +35,7 @@ local MAX_ANIMATION_STEP = 5; -- The min and max scroll heights. local MIN_SCROLL_HEIGHT = 100; -local MAX_SCROLL_HEIGHT = 300; +local MAX_SCROLL_HEIGHT = 600; -- The size of an event settings line and number of event items per page. local EVENT_ITEM_HEIGHT = 25; @@ -821,7 +822,7 @@ end function MikSBTOpt.InitSliders() -- Initialize the Animation Step slider. local key = "Tab1FrameAnimationStepSlider"; - MikSBTOpt.SetupSlider(OPTIONS_FRAME_NAME .. key, MikSBTOpt.SLIDERS[key].Label, MikSBTOpt.SLIDERS[key].Tooltip, MIN_ANIMATION_STEP, MAX_ANIMATION_STEP, 1, "AnimationStep"); + MikSBTOpt.SetupSlider(OPTIONS_FRAME_NAME .. key, MikSBTOpt.SLIDERS[key].Label, MikSBTOpt.SLIDERS[key].Tooltip, MIN_ANIMATION_STEP, MAX_ANIMATION_STEP, 0.5, "AnimationStep"); -- Initialize the scroll height slider. key = "ScrollHeightSlider"; @@ -1332,6 +1333,8 @@ function MikSBTOpt.InitEditboxes() key = "XOffsetEditbox"; MikSBTOpt.SetupEditbox(SCROLL_AREA_MOVER_CONTROL_FRAME_NAME .. key, MikSBTOpt.EDITBOXES[key].Label, MikSBTOpt.EDITBOXES[key].Tooltip, nil); key = "YOffsetEditbox"; MikSBTOpt.SetupEditbox(SCROLL_AREA_MOVER_CONTROL_FRAME_NAME .. key, MikSBTOpt.EDITBOXES[key].Label, MikSBTOpt.EDITBOXES[key].Tooltip, nil); + key = "IconNameEditbox"; MikSBTOpt.SetupEditbox(TRIGGER_CONFIGURATION_FRAME_NAME .. key, MikSBTOpt.EDITBOXES[key].Label, MikSBTOpt.EDITBOXES[key].Tooltip, nil); + key = "SearchPattern1Editbox"; MikSBTOpt.SetupEditbox(TRIGGER_CONFIGURATION_FRAME_NAME .. key, MikSBTOpt.EDITBOXES[key].Label, MikSBTOpt.EDITBOXES[key].Tooltip, nil); key = "SearchPattern2Editbox"; MikSBTOpt.SetupEditbox(TRIGGER_CONFIGURATION_FRAME_NAME .. key, MikSBTOpt.EDITBOXES[key].Label, MikSBTOpt.EDITBOXES[key].Tooltip, nil); end @@ -3107,7 +3110,7 @@ function MikSBTOpt.SetupAvailableTriggerEvents() table.insert(availableTriggerEvents, "CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES"); table.insert(availableTriggerEvents, "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES"); table.insert(availableTriggerEvents, "CHAT_MSG_COMBAT_PARTY_MISSES"); - table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"); + table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"); -- athenne add table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_PARTY_DAMAGE"); table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS"); @@ -3134,6 +3137,7 @@ function MikSBTOpt.SetupAvailableTriggerEvents() table.insert(availableTriggerEvents, "CHAT_MSG_SKILL"); table.insert(availableTriggerEvents, "CHAT_MSG_COMBAT_XP_GAIN"); table.insert(availableTriggerEvents, "CHAT_MSG_COMBAT_HOSTILE_DEATH"); + table.insert(availableTriggerEvents, "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"); end @@ -3235,6 +3239,15 @@ function MikSBTOpt.ShowTriggerConfig(triggerKey) -- Populate the trigger type. MikSBTOpt.PopulateDropdown(TRIGGER_CONFIGURATION_FRAME_NAME .. "TriggerTypeDropdown", triggerData.TriggerSettings.TriggerType); + -- Holds the Icon Texture. + local texture = ""; + + -- Check if there is a texture defined. + if (triggerData.Texture) then + texture = triggerData.Texture or ""; + end + + MikSBTOpt.PopulateEditbox(TRIGGER_CONFIGURATION_FRAME_NAME .. "IconNameEditbox", texture); -- Setup the trigger controls appropriately depending on the trigger type. MikSBTOpt.SetupVariableTriggerControls(triggerKey, triggerData.TriggerSettings.TriggerType == MikCEH.TRIGGERTYPE_SEARCH_PATTERN); @@ -3272,6 +3285,8 @@ function MikSBTOpt.SetupVariableTriggerControls(triggerKey, showSearch) getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "SearchPattern1Editbox"):Show(); getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "SearchPattern2Editbox"):Show(); + + getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "TextureHorizontalBarBottom"):Show(); -- Clear the selected trigger events. if (not triggerFrame.SelectedTriggerEvents) then @@ -3318,6 +3333,8 @@ function MikSBTOpt.SetupVariableTriggerControls(triggerKey, showSearch) getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "TriggerEvent4Checkbox"):Hide(); getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "SearchPattern1Editbox"):Hide(); getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "SearchPattern2Editbox"):Hide(); + + getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "TextureHorizontalBarBottom"):Hide(); -- Populate the threshold slider. MikSBTOpt.PopulateSlider(TRIGGER_CONFIGURATION_FRAME_NAME .. "ThresholdSlider", triggerData.TriggerSettings.Threshold or 1); @@ -3396,7 +3413,12 @@ function MikSBTOpt.SaveTriggerConfig() -- Save the trigger type. triggerData.TriggerSettings.TriggerType = UIDropDownMenu_GetSelectedValue(getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "TriggerTypeDropdown")); - + -- Save the Icon Name + local texture = getglobal(TRIGGER_CONFIGURATION_FRAME_NAME .. "IconNameEditbox"):GetText(); + if (texture) and (texture ~= "") then + triggerData.Texture = texture; + end + -- Check if the trigger type is search pattern. if (triggerData.TriggerSettings.TriggerType == MikCEH.TRIGGERTYPE_SEARCH_PATTERN) then -- Clear the threshold field. diff --git a/MikScrollingBattleTextOptions/MSBTOptions.xml b/MikScrollingBattleTextOptions/MSBTOptions.xml index 3f46616..42c0b07 100644 --- a/MikScrollingBattleTextOptions/MSBTOptions.xml +++ b/MikScrollingBattleTextOptions/MSBTOptions.xml @@ -2013,6 +2013,20 @@ + + + + + + + + + + + + + + @@ -2226,7 +2240,7 @@ - + diff --git a/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc b/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc index 6621658..0cd1f75 100644 --- a/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc +++ b/MikScrollingBattleTextOptions/MikScrollingBattleTextOptions.toc @@ -1,5 +1,5 @@ ## Interface: 11200 -## Version: 3.0 +## Version: 3.9 ## Title: Mik's Scrolling Battle Text Options ## Notes: Load on demand options for Mik's Scrolling Battle Text ## Dependencies: MikScrollingBattleText diff --git a/MikScrollingBattleTextOptions/localization_options.lua b/MikScrollingBattleTextOptions/localization_options.lua index a3f4a29..6caf9d2 100644 --- a/MikScrollingBattleTextOptions/localization_options.lua +++ b/MikScrollingBattleTextOptions/localization_options.lua @@ -1,6 +1,7 @@ ------------------------------------------------------------------------------------- -- Title: Mik's Scrolling Battle Text Options -- Author: Mik +-- Maintainer: Athene ------------------------------------------------------------------------------------- -- Create Options "namespace." @@ -126,6 +127,7 @@ MikSBTOpt.EDITBOXES = { ["Tab1FrameNewProfileNameEditbox"] = { Label="New Profile Name", Tooltip="Allows you to enter the name of a new profile."}, ["XOffsetEditbox"] = { Label="X Offset", Tooltip="Allows you to enter the X offset of the selected scroll frame."}, ["YOffsetEditbox"] = { Label="Y Offset", Tooltip="Allows you to enter the Y offset of the selected scroll frame."}, + ["IconNameEditbox"] = { Label="Icon Path", Tooltip="Allows you to enter the path of the file to display as icon."}, ["SearchPattern1Editbox"] = { Label="Search Pattern 1", Tooltip="Allows you to enter a search pattern that will cause the trigger to fire."}, ["SearchPattern2Editbox"] = { Label="Search Pattern 2", Tooltip="Allows you to enter a search pattern that will cause the trigger to fire."}, };