late/functions.lua
2018-08-28 23:57:07 +02:00

275 lines
8.8 KiB
Lua

--[[
Late library for Minetest - Library adding temporary effects.
(c) Pierre-Yves Rollo
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
--]]
-- Events
---------
local registered_events = {}
function late.event_register(event, func)
if type(func) == 'function' then
registered_events[event] = registered_events[event] or {}
registered_events[event][#registered_events[event] + 1] = func
end
end
function late.trigger_event(event, ...)
if registered_events[event] then
for _, func in ipairs(registered_events[event]) do
func(...)
end
end
end
-- Colors
---------
local stdcolors = {
aliceblue = 0xf0f8ff,
antiquewhite = 0xfaebd7,
aqua = 0x00ffff,
aquamarine = 0x7fffd4,
azure = 0xf0ffff,
beige = 0xf5f5dc,
bisque = 0xffe4c4,
black = 00000000,
blanchedalmond = 0xffebcd,
blue = 0x0000ff,
blueviolet = 0x8a2be2,
brown = 0xa52a2a,
burlywood = 0xdeb887,
cadetblue = 0x5f9ea0,
chartreuse = 0x7fff00,
chocolate = 0xd2691e,
coral = 0xff7f50,
cornflowerblue = 0x6495ed,
cornsilk = 0xfff8dc,
crimson = 0xdc143c,
cyan = 0x00ffff,
darkblue = 0x00008b,
darkcyan = 0x008b8b,
darkgoldenrod = 0xb8860b,
darkgray = 0xa9a9a9,
darkgreen = 0x006400,
darkgrey = 0xa9a9a9,
darkkhaki = 0xbdb76b,
darkmagenta = 0x8b008b,
darkolivegreen = 0x556b2f,
darkorange = 0xff8c00,
darkorchid = 0x9932cc,
darkred = 0x8b0000,
darksalmon = 0xe9967a,
darkseagreen = 0x8fbc8f,
darkslateblue = 0x483d8b,
darkslategray = 0x2f4f4f,
darkslategrey = 0x2f4f4f,
darkturquoise = 0x00ced1,
darkviolet = 0x9400d3,
deeppink = 0xff1493,
deepskyblue = 0x00bfff,
dimgray = 0x696969,
dimgrey = 0x696969,
dodgerblue = 0x1e90ff,
firebrick = 0xb22222,
floralwhite = 0xfffaf0,
forestgreen = 0x228b22,
fuchsia = 0xff00ff,
gainsboro = 0xdcdcdc,
ghostwhite = 0xf8f8ff,
gold = 0xffd700,
goldenrod = 0xdaa520,
gray = 0x808080,
green = 0x008000,
greenyellow = 0xadff2f,
grey = 0x808080,
honeydew = 0xf0fff0,
hotpink = 0xff69b4,
indianred = 0xcd5c5c,
indigo = 0x4b0082,
ivory = 0xfffff0,
khaki = 0xf0e68c,
lavender = 0xe6e6fa,
lavenderblush = 0xfff0f5,
lawngreen = 0x7cfc00,
lemonchiffon = 0xfffacd,
lightblue = 0xadd8e6,
lightcoral = 0xf08080,
lightcyan = 0xe0ffff,
lightgoldenrodyellow = 0xfafad2,
lightgray = 0xd3d3d3,
lightgreen = 0x90ee90,
lightgrey = 0xd3d3d3,
lightpink = 0xffb6c1,
lightsalmon = 0xffa07a,
lightseagreen = 0x20b2aa,
lightskyblue = 0x87cefa,
lightslategray = 0x778899,
lightslategrey = 0x778899,
lightsteelblue = 0xb0c4de,
lightyellow = 0xffffe0,
lime = 0x00ff00,
limegreen = 0x32cd32,
linen = 0xfaf0e6,
magenta = 0xff00ff,
maroon = 0x800000,
mediumaquamarine = 0x66cdaa,
mediumblue = 0x0000cd,
mediumorchid = 0xba55d3,
mediumpurple = 0x9370db,
mediumseagreen = 0x3cb371,
mediumslateblue = 0x7b68ee,
mediumspringgreen = 0x00fa9a,
mediumturquoise = 0x48d1cc,
mediumvioletred = 0xc71585,
midnightblue = 0x191970,
mintcream = 0xf5fffa,
mistyrose = 0xffe4e1,
moccasin = 0xffe4b5,
navajowhite = 0xffdead,
navy = 0x000080,
oldlace = 0xfdf5e6,
olive = 0x808000,
olivedrab = 0x6b8e23,
orange = 0xffa500,
orangered = 0xff4500,
orchid = 0xda70d6,
palegoldenrod = 0xeee8aa,
palegreen = 0x98fb98,
paleturquoise = 0xafeeee,
palevioletred = 0xdb7093,
papayawhip = 0xffefd5,
peachpuff = 0xffdab9,
peru = 0xcd853f,
pink = 0xffc0cb,
plum = 0xdda0dd,
powderblue = 0xb0e0e6,
purple = 0x800080,
red = 0xff0000,
rosybrown = 0xbc8f8f,
royalblue = 0x4169e1,
saddlebrown = 0x8b4513,
salmon = 0xfa8072,
sandybrown = 0xf4a460,
seagreen = 0x2e8b57,
seashell = 0xfff5ee,
sienna = 0xa0522d,
silver = 0xc0c0c0,
skyblue = 0x87ceeb,
slateblue = 0x6a5acd,
slategray = 0x708090,
slategrey = 0x708090,
snow = 0xfffafa,
springgreen = 0x00ff7f,
steelblue = 0x4682b4,
tan = 0xd2b48c,
teal = 0x008080,
thistle = 0xd8bfd8,
tomato = 0xff6347,
turquoise = 0x40e0d0,
violet = 0xee82ee,
wheat = 0xf5deb3,
white = 0xffffff,
whitesmoke = 0xf5f5f5,
yellow = 0xffff00,
yellowgreen = 0x9acd32,
}
--- color_to_table
-- Converts a colorstring to a {r,g,b,a} table.
-- @param colorspec Can be a standard color name, a 32 bit integer or a table
-- @returns A {r,g,b,a} table
function late.color_to_table(colorspec)
if type(colorspec) == 'string' then
if string.sub(colorspec, 1, 1) == "#" then
if string.len(colorspec) == 4 then
return {
r = tonumber("0x"..string.sub(colorspec, 2, 2)),
g = tonumber("0x"..string.sub(colorspec, 3, 3)),
b = tonumber("0x"..string.sub(colorspec, 4, 4)),
a = 0xFF,
}
elseif string.len(colorspec) == 5 then
return {
r = tonumber("0x"..string.sub(colorspec, 2, 2)),
g = tonumber("0x"..string.sub(colorspec, 3, 3)),
b = tonumber("0x"..string.sub(colorspec, 4, 4)),
a = tonumber("0x"..string.sub(colorspec, 5, 5)),
}
elseif string.len(colorspec) == 7 then
return {
r = tonumber("0x"..string.sub(colorspec, 2, 3)),
g = tonumber("0x"..string.sub(colorspec, 4, 5)),
b = tonumber("0x"..string.sub(colorspec, 6, 7)),
a = 0xFF,
}
elseif string.len(colorspec) == 9 then
return {
r = tonumber("0x"..string.sub(colorspec, 2, 3)),
g = tonumber("0x"..string.sub(colorspec, 4, 5)),
b = tonumber("0x"..string.sub(colorspec, 6, 7)),
a = tonumber("0x"..string.sub(colorspec, 8, 9)),
}
end
else
colorspec = stdcolors[colorspec]
if colorspec then
return {
a = 0xFF,
r = math.floor(colorspec / 0x10000 % 0x100),
g = math.floor(colorspec / 0x100 % 0x100),
b = math.floor(colorspec % 0x100),
}
end
return nil
end
end
if type(colorspec) == 'number' then
return {
a = math.floor(colorspec / 0x1000000 % 0x100),
r = math.floor(colorspec / 0x10000 % 0x100),
g = math.floor(colorspec / 0x100 % 0x100),
b = math.floor(colorspec % 0x100),
}
end
if type(colorspec) == 'table' then
return {
a = (colorspec.a or 0),
r = (colorspec.r or 0),
g = (colorspec.g or 0),
b = (colorspec.b or 0),
}
end
end
--- color_to_rgb_texture
-- Converts a colorspec to a #RRGGBB string ready to use in textures
-- @param colorspec Can be a standard color name, a 32 bit integer or a table
-- @returns A "#RRGGBB" string
function late.color_to_rgb_texture(colorspec)
local color = late.color_to_table(colorspec)
return string.format("#%02x%02x%02x", color.r, color.g, color.b)
end
function late.color_to_rgba_texture(colorspec)
local color = late.color_to_table(colorspec)
return string.format("#%02x%02x%02x%02x", color.r, color.g, color.b, color.a)
end