local MAJOR_VERSION = "1.0" local MINOR_VERSION = tonumber(string.sub("$Revision: 2427 $", 12, -3)) if CrayonLib and CrayonLib.versions[MAJOR_VERSION] and CrayonLib.versions[MAJOR_VERSION].minor >= MINOR_VERSION then return 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 CrayonLib) then CrayonLib = 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 = "CrayonLib: " .. 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 = {} lib.COLOR_HEX_RED = "ff0000" lib.COLOR_HEX_ORANGE = "ff7f00" lib.COLOR_HEX_YELLOW = "ffff00" lib.COLOR_HEX_GREEN = "00ff00" lib.COLOR_HEX_WHITE = "ffffff" lib.COLOR_HEX_COPPER = "eda55f" lib.COLOR_HEX_SILVER = "c7c7cf" lib.COLOR_HEX_GOLD = "ffd700" function lib:Colorize(hexColor, text) return "|cff" .. tostring(hexColor or 'ffffff') .. tostring(text) .. "|r" end function lib:Red(text) return self:Colorize(self.COLOR_HEX_RED, text) end function lib:Orange(text) return self:Colorize(self.COLOR_HEX_ORANGE, text) end function lib:Yellow(text) return self:Colorize(self.COLOR_HEX_YELLOW, text) end function lib:Green(text) return self:Colorize(self.COLOR_HEX_GREEN, text) end function lib:White(text) return self:Colorize(self.COLOR_HEX_WHITE, text) end function lib:Copper(text) return self:Colorize(self.COLOR_HEX_COPPER, text) end function lib:Silver(text) return self:Colorize(self.COLOR_HEX_SILVER, text) end function lib:Gold(text) return self:Colorize(self.COLOR_HEX_GOLD, text) end local inf = 1/0 function lib:GetThresholdColor(quality, worst, worse, normal, better, best) argCheck(quality, 2, "number") if quality ~= quality or quality == inf or quality == -inf then return 1, 1, 1 end if not best then worst = 0 worse = 0.25 normal = 0.5 better = 0.75 best = 1 end if worst < best then if (worse == better and quality == worse) or (worst == best and quality == worst) then return 1, 1, 0 elseif quality <= worst then return 1, 0, 0 elseif quality <= worse then return 1, 0.5 * (quality - worst) / (worse - worst), 0 elseif quality <= normal then return 1, 0.5 + 0.5 * (quality - worse) / (normal - worse), 0 elseif quality <= better then return 1 - 0.5 * (quality - normal) / (better - normal), 1, 0 elseif quality <= best then return 0.5 - 0.5 * (quality - better) / (best - better), 1, 0 else return 0, 1, 0 end else if (worse == better and quality == worse) or (worst == best and quality == worst) then return 1, 1, 0 elseif quality >= worst then return 1, 0, 0 elseif quality >= worse then return 1, 0.5 - 0.5 * (quality - worse) / (worst - worse), 0 elseif quality >= normal then return 1, 1 - 0.5 * (quality - normal) / (worse - normal), 0 elseif quality >= better then return 0.5 + 0.5 * (quality - better) / (normal - better), 1, 0 elseif quality >= best then return 0.5 * (quality - best) / (better - best), 1, 0 else return 0, 1, 0 end end end function lib:GetThresholdHexColor(quality, worst, worse, normal, better, best) local r, g, b = self:GetThresholdColor(quality, worst, worse, normal, better, best) return format("%02x%02x%02x", r*255, g*255, b*255) end function lib:GetThresholdColorTrivial(quality, worst, worse, normal, better, best) argCheck(quality, 2, "number") if quality ~= quality or quality == inf or quality == -inf then return 1, 1, 1 end if not best then worst = 0 worse = 0.25 normal = 0.5 better = 0.75 best = 1 end if worst < best then if worse == better and normal == worse then return 1, 1, 0 elseif quality <= worst then return 1, 0, 0 elseif quality <= worse then return 1, 0.5 * (quality - worst) / (worse - worst), 0 elseif quality <= normal then return 1, 0.5 + 0.5 * (quality - worse) / (normal - worse), 0 elseif quality <= better then return 1 - (quality - normal) / (better - normal), 1, 0 elseif quality <= best then local x = 0.5 * (quality - better) / (best - better) return x, 1 - x, x else return 0.5, 0.5, 0.5 end else if worse == better and normal == worse then return 1, 1, 0 elseif quality >= worst then return 1, 0, 0 elseif quality >= worse then return 1, 0.5 - 0.5 * (quality - worse) / (worst - worse), 0 elseif quality >= normal then return 1, 1 - 0.5 * (quality - normal) / (worse - normal), 0 elseif quality >= better then return (quality - better) / (normal - better), 1, 0 elseif quality >= best then local x = 0.5 * (quality - best) / (better - best) return 0.5 - x, 0.5 + x, 0.5 - x else return 0.5, 0.5, 0.5 end end end function lib:GetThresholdHexColorTrivial(quality, worst, worse, normal, better, best) local r, g, b = self:GetThresholdColorTrivial(quality, worst, worse, normal, better, best) 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) end function lib:LibDeactivate(stub) end CrayonLib:Register(lib) lib = nil