local MAJOR_VERSION = "Class 1.2" local MINOR_VERSION = tonumber(string.sub("$Revision: 3860 $", 12, -3)) if BabbleLib and BabbleLib.versions[MAJOR_VERSION] and BabbleLib.versions[MAJOR_VERSION].minor >= MINOR_VERSION then return end local locale = GetLocale and GetLocale() or "enUS" local totalClasses = { ["Warlock"] = "Warlock", ["Warrior"] = "Warrior", ["Hunter"] = "Hunter", ["Mage"] = "Mage", ["Priest"] = "Priest", ["Druid"] = "Druid", ["Paladin"] = "Paladin", ["Shaman"] = "Shaman", ["Rogue"] = "Rogue", } local englishToLocal if locale == "koKR" then englishToLocal = { ["Warlock"] = "흑마법사", ["Warrior"] = "전사", ["Hunter"] = "사냥꾼", ["Mage"] = "마법사", ["Priest"] = "사제", ["Druid"] = "드루이드", ["Paladin"] = "성기사", ["Shaman"] = "주술사", ["Rogue"] = "도적", } elseif locale == "deDE" then englishToLocal = { ["Warlock"] = "Hexenmeister", ["Warrior"] = "Krieger", ["Hunter"] = "J\195\164ger", ["Mage"] = "Magier", ["Priest"] = "Priester", ["Druid"] = "Druide", ["Paladin"] = "Paladin", ["Shaman"] = "Schamane", ["Rogue"] = "Schurke", } elseif locale == "frFR" then englishToLocal = { ["Warlock"] = "D\195\169moniste", ["Warrior"] = "Guerrier", ["Hunter"] = "Chasseur", ["Mage"] = "Mage", ["Priest"] = "Pr\195\170tre", ["Druid"] = "Druide", ["Paladin"] = "Paladin", ["Shaman"] = "Chaman", ["Rogue"] = "Voleur", } elseif locale == "zhCN" then englishToLocal = { ["Warlock"] = "\230\156\175\229\163\171", ["Warrior"] = "\230\136\152\229\163\171", ["Hunter"] = "\231\140\142\228\186\186", ["Mage"] = "\230\179\149\229\184\136", ["Priest"] = "\231\137\167\229\184\136", ["Druid"] = "\229\190\183\233\178\129\228\188\138", ["Paladin"] = "\229\156\163\233\170\145\229\163\171", ["Shaman"] = "\232\144\168\230\187\161\231\165\173\231\165\128", ["Rogue"] = "\231\155\151\232\180\188", } elseif locale ~= "enUS" then -- no translations englishToLocal = { } end if englishToLocal then for key in pairs(englishToLocal) do if not totalClasses[key] then error("Improper translation exists. %q is likely misspelled for locale %s.", key, locale) break end end end -------------IRIEL'S-STUB-CODE-------------- local stub = {}; -- Instance replacement method, replace contents of old with that of new function stub:ReplaceInstance(old, new) for k,v in pairs(old) do old[k]=nil; end for k,v in pairs(new) do old[k]=v; end end -- Get a new copy of the stub function stub:NewStub() local newStub = {}; self:ReplaceInstance(newStub, self); newStub.lastVersion = ''; newStub.versions = {}; return newStub; end -- Get instance version function stub:GetInstance(version) if (not version) then version = self.lastVersion; end local versionData = self.versions[version]; if (not versionData) then message("Cannot find library instance with version '" .. version .. "'"); return; end return versionData.instance; end -- Register new instance function stub:Register(newInstance) local version,minor = newInstance:GetLibraryVersion(); self.lastVersion = version; local versionData = self.versions[version]; if (not versionData) then -- This one is new! versionData = { instance = newInstance, minor = minor, old = {} }; self.versions[version] = versionData; newInstance:LibActivate(self); return newInstance; end if (minor <= versionData.minor) then -- This one is already obsolete if (newInstance.LibDiscard) then newInstance:LibDiscard(); end return versionData.instance; end -- This is an update local oldInstance = versionData.instance; local oldList = versionData.old; versionData.instance = newInstance; versionData.minor = minor; local skipCopy = newInstance:LibActivate(self, oldInstance, oldList); table.insert(oldList, oldInstance); if (not skipCopy) then for i, old in ipairs(oldList) do self:ReplaceInstance(old, newInstance); end end return newInstance; end -- Bind stub to global scope if it's not already there if (not BabbleLib) then BabbleLib = stub:NewStub(); end -- Nil stub for garbage collection stub = nil; -----------END-IRIEL'S-STUB-CODE------------ local function assert(condition, message) if not condition then local stack = debugstack() local first = string.gsub(stack, "\n.*", "") local file = string.gsub(first, "^(.*\\.*).lua:%d+: .*", "%1") file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") if not message then local _,_,second = string.find(stack, "\n(.-)\n") message = "assertion failed! " .. second end message = "BabbleLib-Class: " .. message local i = 1 for s in string.gfind(stack, "\n([^\n]*)") do i = i + 1 if not string.find(s, file .. "%.lua:%d+:") then error(message, i) return end end error(message, 2) return end return condition end local function argCheck(arg, num, kind, kind2, kind3, kind4) if tostring(type(arg)) ~= kind then if kind2 then if tostring(type(arg)) ~= kind2 then if kind3 then if tostring(type(arg)) ~= kind3 then if kind4 then if tostring(type(arg)) ~= kind4 then local _,_,func = string.find(debugstack(), "\n.-`(.-)'\n") assert(false, format("Bad argument #%d to `%s' (%s, %s, %s, or %s expected, got %s)", num, func, kind, kind2, kind3, kind4, type(arg))) end else local _,_,func = string.find(debugstack(), "\n.-`(.-)'\n") assert(false, format("Bad argument #%d to `%s' (%s, %s, or %s expected, got %s)", num, func, kind, kind2, kind3, type(arg))) end end else local _,_,func = string.find(debugstack(), "\n.-`(.-)'\n") assert(false, format("Bad argument #%d to `%s' (%s or %s expected, got %s)", num, func, kind, kind2, type(arg))) end end else local _,_,func = string.find(debugstack(), "\n.-`(.-)'\n") assert(false, format("Bad argument #%d to `%s' (%s expected, got %s)", num, func, kind, type(arg))) end end end local lib = {} local localToEnglish if locale == "enUS" then function lib:GetEnglish(class) argCheck(class, 2, "string") assert(totalClasses[class], format("Class %q does not exist", class)) return class end function lib:GetLocalized(class) argCheck(class, 2, "string") if totalClasses[class] then return class elseif string.find(class, "^[A-Z]*$") then local lowClass = strupper(strsub(class, 1, 1)) .. strlower(strsub(class, 2)) assert(totalClasses[lowClass], format("Class %q does not exist", class)) return lowClass else assert(false, format("Class %q does not exist", class)) end end function lib:GetIterator() return pairs(totalClasses) end lib.GetReverseIterator = lib.GetIterator function lib:HasClass(class) argCheck(class, 2, "string") return totalClasses[class] and true or false end else function lib:GetEnglish(class) argCheck(class, 2, "string") local c = localToEnglish[class] assert(c, format("Class %q does not exist or is not translated into %s", class, locale)) return c end function lib:GetLocalized(class) argCheck(class, 2, "string") if totalClasses[class] then local c = englishToLocal[class] assert(c, format("Class %q is not translated into %s", class, locale)) return c elseif string.find(class, "^[A-Z]*$") then local lowClass = strupper(strsub(class, 1, 1)) .. strlower(strsub(class, 2)) assert(totalClasses[lowClass], format("Class %q does not exist", class)) local c = englishToLocal[lowClass] assert(c, format("Class %q is not translated into %s", class, locale)) return c else assert(false, format("Class %q does not exist", class)) end end local improperTranslation = nil for zone in pairs(totalClasses) do if not englishToLocal[zone] then improperTranslation = zone break end end if improperTranslation then function lib:GetIterator() assert(false, "Class %q not translated into %s", improperTranslation, locale) end lib.GetReverseIterator = lib.GetIterator else function lib:GetIterator() return pairs(englishToLocal) end function lib:GetReverseIterator() return pairs(localToEnglish) end end function lib:HasClass(class) argCheck(class, 2, "string") return (totalClasses[class] or localToEnglish[class]) and true or false end end function lib:GetColor(class) argCheck(class, 2, "string") if string.find(class, "^[A-Z]*$") then class = strupper(strsub(class, 1, 1)) .. strlower(strsub(class, 2)) elseif localToEnglish then class = localToEnglish[class] or class end if class == "Warlock" then return 0.784314, 0.509804, 0.588235 elseif class == "Warrior" then return 0.784314, 0.607843, 0.431373 elseif class == "Hunter" then return 0.666667, 0.823529, 0.666667 elseif class == "Mage" then return 0.411765, 0.803922, 0.941176 elseif class == "Priest" then return 1, 1, 1 elseif class == "Druid" then return 1, 0.490196, 0.039216 elseif class == "Paladin" or class == "Shaman" then return 0.960784, 0.549020, 0.725490 elseif class == "Rogue" then return 1, 0.960784, 0.411765 end return 0.627451, 0.627451, 0.627451 end function lib:GetHexColor(class) argCheck(class, 2, "string") local r, g, b = self:GetColor(class) return format("%02x%02x%02x", r * 255, g * 255, b * 255) end function lib:GetLibraryVersion() return MAJOR_VERSION, MINOR_VERSION end function lib:LibActivate(stub, oldLib, oldList) if locale ~= "enUS" then localToEnglish = {} for english, localized in pairs(englishToLocal) do localToEnglish[localized] = english end end local mt = getmetatable(self) or {} mt.__call = self.GetLocalized setmetatable(self, mt) end function lib:LibDeactivate() totalClasses, localToEnglish, englishToLocal = nil end BabbleLib:Register(lib) lib = nil