1
0
mirror of https://github.com/mt-mods/unifieddyes.git synced 2025-06-28 14:26:21 +02:00

Compare commits

..

32 Commits

Author SHA1 Message Date
334de564fd fix crash
when trying to airbrush unknown nodes or nodes without palettes.
2018-10-19 16:00:05 -04:00
545968517b more strict checking of need to reset param2 on place
fixes wood (coloredwood mod), stone (blox mod), bricks (unified
bricks mod), etc.  being rotated wrong
2018-10-12 07:55:09 -04:00
368205d3b8 Add VALS_SPLIT for craft
Add faint + light.
2018-10-05 05:23:02 +02:00
feed6d5aae add human-readable color names to tooltips and "your selection
in airbrush form, plus minor re-arrangements and size adjustment to fit.
2018-09-23 18:11:07 -04:00
4811847655 check palette filename when airbrushing to determine mode.
(relying just on paramtype2 doesn't work :-/ )
2018-09-13 22:32:12 -04:00
44629935d2 turn unavail colors in selector into non-clickable flat images
(instead of making them all buttons)
2018-09-13 00:17:13 -04:00
ccbedcd3d6 allow passing an explicitly-available list of colors for airbrush 2018-09-13 00:03:59 -04:00
622d09a243 get rid of colors.txt, outdated 2018-09-12 23:08:17 -04:00
27fe090395 clarify item desc in split palette register nodes helper 2018-09-12 22:44:24 -04:00
230ac1342a remove debug prints 2018-09-12 22:39:44 -04:00
e921095006 allow access to the 0 column in the split palettes
which now contains a "faint" shade of each color
brings the total to 197 colors in split mode.
2018-09-12 22:37:52 -04:00
3eb3a9a330 expand old split-89 palette to 176 colors
(by adding more hues, now has all 24 in 7 shades each
plus 5 greys)
2018-09-12 22:29:57 -04:00
078a998d29 append output given to color craft helper if prefix/suffix are used
(if any; allows specifying an item count/yield for the recipe)
2018-09-12 20:34:28 -04:00
4b88997360 add helper function for registering split palette nodes 2018-09-12 20:19:07 -04:00
ef7d357e0b make sure group.ud_param2_colorable exists before trying to check its value :P 2018-09-12 19:40:22 -04:00
66774213e2 use the node's paramtype2 instead of its palette filename
to decide what the airbrush should do with it.

(that plus a few related changes allows coloredwood mod to make
the airbrush work on stairsplus cut plain wood slabs/slopes/et. al)
2018-09-12 18:32:04 -04:00
ad21862eee add hues+greys table 2018-09-12 16:38:42 -04:00
ad12387432 use "split" for split-89 palette instead of true. 2018-09-08 12:09:25 -04:00
7b18314235 drop support for the old 89 color palette - obsolete
(the full version)
2018-09-08 11:49:20 -04:00
73a062f026 don't register pink recipe twice for wallmounted 2018-09-08 11:30:14 -04:00
0413f23df1 fix incorrect handling of "azure" re: wallmounted palette
(it doesn't exist there :P  replaced with light blue)
also fixed missing craft helper recipe for same
and fixed missing light_red in color<->palette table.
2018-09-08 11:21:00 -04:00
8fbd9cd23b condense legend a bit
move selected dye label over next to/under "Your selection"
2018-09-08 11:08:37 -04:00
997d703b94 eliminate most egregious string concats in color select form
build it into a table and return table.concat()
instead of using foo = foo..bar or foo = bar..baz..meh  everywhere
2018-09-08 10:53:25 -04:00
95f009a282 show in color selector when a dye is on-hand in survival, but unavailable
(right-clicked node can't use it)
2018-09-08 10:24:08 -04:00
fb2c14b4a8 rename "available" overlay to "onhand" 2018-09-08 10:15:51 -04:00
42093582df show "on hand" indicators in "avail only" screen 2018-09-08 10:13:31 -04:00
3cbb25d92a pass inv to colored squared function 2018-09-08 10:09:42 -04:00
0589d8f02e dim-out the user's color choice in the color selector
and reject it on clicking "Accept",
if they went to "Show All" to select a color,
but then went back to "Show Avail" before clicking Accept.

(i.e. only accept what's shown as available to click on)
2018-09-08 10:05:13 -04:00
fc199cced4 moved the formspec code for the colored squares to its own function 2018-09-08 09:47:31 -04:00
da9ab7215c make airbrush show only the colors the right-clicked node can use
(with button to toggle between that mode and show-all)
2018-09-08 09:09:13 -04:00
19febc877d fix typo 2018-08-28 22:50:05 -04:00
c3036aba00 handle special case of split palette with full colors in node name
also check for ud_param2_colorable before proceeding to airbrush
also handle new -> old color names in split palette switching
2018-08-28 22:44:02 -04:00
33 changed files with 396 additions and 382 deletions

11
API.md
View File

@ -28,7 +28,9 @@ minetest.register_node("mymod:colored_node", {
- "unifieddyes_palette_colorwallmounted.png"
- or one of the "split" hues palettes (see below).
`groups`: If your node can be colored by punching it with dye, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted.
`groups`: If your node can be colored by using the airbrush, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted.
If your node if of the kind where you need the split palette, but you need to put the *full color name* into the node name, as opposed to just the hue, then add the keys `ud_color_start` and `ud_color_end` and set them to the positions of the first and last characters of the color name (where 1 is the first character of the mod name at the start of the node name, i.e. "mymod:foo_bar_orange_baz" would have the start set to 15 and the end at 20).
`on_construct`: see below.
@ -115,12 +117,17 @@ This will loop through all of Unified Dyes' color lists, generating one recipe f
`recipe` is the same as in the normal call, except that Unified Dyes will replace all instances of the string "NEUTRAL_NODE" with the item specified in the preceding `neutral_node` field. Every instance of "MAIN_DYE" will be replaced with a portion of dye, as Unified Dyes' recipe helper works through its color lists (i.e. this field will become whatever dye is needed for each recipe).
`output_prefix` and `output_suffix`, if specified (must use both if at all), will cause the recipe registration to ignore the usual `output` field, and instead set to the output item to `output_prefix` + (hue) + `output_suffix`. Used for mods that use the split 89-color palette. `hue` will thus be one of the 12 hues, or "grey", as defined by the split palettes.
`output_prefix` and `output_suffix`, if specified (must use both if at all), will cause the recipe registration to set to the output item to `output_prefix` + (hue) + `output_suffix` + `output`. Used for mods that use the split 89-color palette. `hue` will thus be one of the 12 hues, or "grey", as defined by the split palettes. In this situation, you can set `output` to your recipe yield (with a leading space) if needed. For example, if the prefix is "foo:bar", the suffix is "baz", and the output is set to " 3", then the craft helper will generate output item strings of the form "foo:bar_COLOR_baz 3", for each color in the table.
**`unifieddyes.make_colored_itemstack(itemstack, palette, color)`**
Makes a colored itemstack out of the given `itemstack` and `color` (as a dye, e.g. "dye:dark_red_s50"), setting the correct index per the `palette` field, which works as described above for `unifieddyes.getpaletteidx()`. Said itemstack is returned as a string suitable for use as the output field of a craft recipe, equal in size to the itemstack passed into the function (e.g. if you give it "mymod:colored_node 7", it'll return a stack of 7 colored items).
**`unifieddyes.generate_split_palette_nodes(name, def, drop)`**
Does just what it sounds like - it registers all the nodes that are needed for a given base node (`def`) to be able to use the split palette, each named according to `name`, with the palette hue appended. If a custom drop is needed, it can be passed along (only a string is allowed here, specifying a single item).
#### Tables
In addition to the above API calls, Unified Dyes provides several useful tables

View File

@ -1,90 +0,0 @@
Full-saturation colors:
-----------------------
dark aqua 0, 84, 42 unifieddyes_dark_aqua.png
dark blue 0, 0, 84 unifieddyes_dark_blue.png
dark cyan 0, 84, 83 unifieddyes_dark_cyan.png
dark green 0, 84, 0 unifieddyes_dark_green.png
dark lime 43, 84, 0 unifieddyes_dark_lime.png
dark magenta 84, 0, 83 unifieddyes_dark_magenta.png
dark orange 84, 42, 0 unifieddyes_dark_orange.png
dark red 84, 0, 0 unifieddyes_dark_red.png
dark redviolet 84, 0, 42 unifieddyes_dark_redviolet.png
dark skyblue 0, 42, 84 unifieddyes_dark_skyblue.png
dark violet 43, 0, 84 unifieddyes_dark_violet.png
dark yellow 84, 83, 0 unifieddyes_dark_yellow.png
medium aqua 0,169, 84 unifieddyes_medium_aqua.png
medium blue 0, 0,169 unifieddyes_medium_blue.png
medium cyan 0,169,167 unifieddyes_medium_cyan.png
medium green 0,169, 0 unifieddyes_medium_green.png
medium lime 87,169, 0 unifieddyes_medium_lime.png
medium magenta 169, 0,167 unifieddyes_medium_magenta.png
medium orange 169, 84, 0 unifieddyes_medium_orange.png
medium red 168, 0, 0 unifieddyes_medium_red.png
medium redviolet 169, 0, 84 unifieddyes_medium_redviolet.png
medium skyblue 0, 84,169 unifieddyes_medium_skyblue.png
medium violet 87, 0,169 unifieddyes_medium_violet.png
medium yellow 169,167, 0 unifieddyes_medium_yellow.png
aqua 1,255,127 unifieddyes_aqua.png
blue 1, 1,255 unifieddyes_blue.png
cyan 1,255,252 unifieddyes_cyan.png
green 1,255, 1 unifieddyes_green.png
lime 132,255, 1 unifieddyes_lime.png
magenta 255, 1,252 unifieddyes_magenta.png
orange 255,127, 1 unifieddyes_orange.png
red 255, 0, 0 unifieddyes_red.png
redviolet 255, 1,127 unifieddyes_redviolet.png
skyblue 1,127,255 unifieddyes_skyblue.png
violet 132, 1,255 unifieddyes_violet.png
yellow 255,252, 1 unifieddyes_yellow.png
Low-saturation colors:
----------------------
dark aqua 50% saturation 21, 63, 42 unifieddyes_dark_aqua_s50.png
dark blue 50% saturation 21, 21, 63 unifieddyes_dark_blue_s50.png
dark cyan 50% saturation 21, 63, 63 unifieddyes_dark_cyan_s50.png
dark green 50% saturation 21, 63, 21 unifieddyes_dark_green_s50.png
dark lime 50% saturation 43, 63, 21 unifieddyes_dark_lime_s50.png
dark magenta 50% saturation 63, 21, 63 unifieddyes_dark_magenta_s50.png
dark orange 50% saturation 63, 42, 21 unifieddyes_dark_orange_s50.png
dark red 50% saturation 63, 21, 21 unifieddyes_dark_red_s50.png
dark redviolet 50% saturation 63, 21, 42 unifieddyes_dark_redviolet_s50.png
dark skyblue 50% saturation 21, 42, 63 unifieddyes_dark_skyblue_s50.png
dark violet 50% saturation 43, 21, 63 unifieddyes_dark_violet_s50.png
dark yellow 50% saturation 63, 63, 21 unifieddyes_dark_yellow_s50.png
medium aqua 50% saturation 42,126, 84 unifieddyes_medium_aqua_s50.png
medium blue 50% saturation 42, 42,126 unifieddyes_medium_blue_s50.png
medium cyan 50% saturation 42,126,126 unifieddyes_medium_cyan_s50.png
medium green 50% saturation 42,126, 42 unifieddyes_medium_green_s50.png
medium lime 50% saturation 86,126, 42 unifieddyes_medium_lime_s50.png
medium magenta 50% saturation 126, 42,126 unifieddyes_medium_magenta_s50.png
medium orange 50% saturation 126, 84, 42 unifieddyes_medium_orange_s50.png
medium red 50% saturation 127, 42, 42 unifieddyes_medium_red_s50.png
medium redviolet 50% saturation 126, 42, 84 unifieddyes_medium_redviolet_s50.png
medium skyblue 50% saturation 42, 84,126 unifieddyes_medium_skyblue_s50.png
medium violet 50% saturation 86, 42,126 unifieddyes_medium_violet_s50.png
medium yellow 50% saturation 126,126, 42 unifieddyes_medium_yellow_s50.png
aqua 50% saturation 65,191,127 unifieddyes_aqua_s50.png
blue 50% saturation 65, 65,191 unifieddyes_blue_s50.png
cyan 50% saturation 65,191,190 unifieddyes_cyan_s50.png
green 50% saturation 65,191, 65 unifieddyes_green_s50.png
lime 50% saturation 130,191, 65 unifieddyes_lime_s50.png
magenta 50% saturation 191, 65,190 unifieddyes_magenta_s50.png
orange 50% saturation 191,127, 65 unifieddyes_orange_s50.png
red 50% saturation 192, 64, 64 unifieddyes_red_s50.png
redviolet 50% saturation 191, 65,127 unifieddyes_redviolet_s50.png
skyblue 50% saturation 65,127,191 unifieddyes_skyblue_s50.png
violet 50% saturation 130, 65,191 unifieddyes_violet_s50.png
yellow 50% saturation 191,190, 65 unifieddyes_yellow_s50.png
Greyscale:
----------
black 0, 0, 0 unifieddyes_black.png
dark grey 64, 64, 64 unifieddyes_darkgrey_paint.png
medium grey 128,128,128 unifieddyes_grey_paint.png
light grey 192,192,192 unifieddyes_lightgrey_paint.png
white 255,255,255 unifieddyes_white_paint.png

677
init.lua
View File

@ -41,23 +41,6 @@ else
S = function(s) return s end
end
-- helper functions for other mods that use this one
unifieddyes.HUES = {
"red",
"orange",
"yellow",
"lime",
"green",
"aqua",
"cyan",
"skyblue",
"blue",
"violet",
"magenta",
"redviolet"
}
-- the names of the various colors here came from http://www.procato.com/rgb+index/
unifieddyes.HUES_EXTENDED = {
@ -87,6 +70,13 @@ unifieddyes.HUES_EXTENDED = {
{ "crimson", 0xff, 0x00, 0x40 }
}
unifieddyes.HUES_WITH_GREY = {}
for _,i in ipairs(unifieddyes.HUES_EXTENDED) do
table.insert(unifieddyes.HUES_WITH_GREY, i[1])
end
table.insert(unifieddyes.HUES_WITH_GREY, "grey")
unifieddyes.HUES_WALLMOUNTED = {
"red",
"orange",
@ -109,6 +99,14 @@ unifieddyes.VALS = {
"dark_"
}
unifieddyes.VALS_SPLIT = {
"faint_",
"light_",
"",
"medium_",
"dark_"
}
unifieddyes.VALS_EXTENDED = {
"faint_",
"pastel_",
@ -155,6 +153,9 @@ local default_dyes = {
unifieddyes.player_current_dye = {}
unifieddyes.player_selected_dye = {}
unifieddyes.player_last_right_clicked = {}
unifieddyes.palette_has_color = {}
unifieddyes.player_showall = {}
-- if a node with a palette is placed in the world,
-- but the itemstack used to place it has no palette_index (color byte),
@ -171,20 +172,25 @@ minetest.register_on_placenode(
end
if not string.find(itemstack:to_string(), "palette_index") then
local param2 = 0
local param2
local color = 0
if def.palette == "unifieddyes_palette_extended.png" then
if def.palette == "unifieddyes_palette_extended.png"
and def.paramtype2 == "color" then
param2 = 240
color = 240
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
elseif def.palette == "unifieddyes_palette_colorwallmounted.png"
and def.paramtype2 == "colorwallmounted" then
param2 = newnode.param2 % 8
elseif def.palette ~= "unifieddyes_palette.png" then -- it's a split palette
elseif string.find(def.palette, "unifieddyes_palette_")
and def.paramtype2 == "colorfacedir" then -- it's a split palette
param2 = newnode.param2 % 32
end
minetest.swap_node(pos, {name = newnode.name, param2 = param2})
minetest.get_meta(pos):set_int("palette_index", color)
if param2 then
minetest.swap_node(pos, {name = newnode.name, param2 = param2})
minetest.get_meta(pos):set_int("palette_index", color)
end
end
end
)
@ -198,6 +204,35 @@ end
function unifieddyes.after_dig_node(foo)
end
-- This helper function creates multiple copies of the passed node,
-- for the split palette - one per hue, plus grey - and assigns
-- proper palettes and other attributes
function unifieddyes.generate_split_palette_nodes(name, def, drop)
for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do
local def2 = table.copy(def)
local desc_color = string.gsub(string.upper(string.sub(color, 1, 1))..string.sub(color, 2), "_", " ")
if string.sub(def2.description, -1) == ")" then
def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)"
else
def2.description = def2.description.."("..desc_color.." shades)"
end
def2.palette = "unifieddyes_palette_"..color.."s.png"
def2.paramtype2 = "colorfacedir"
def2.groups.ud_param2_colorable = 1
if drop then
def2.drop = {
items = {
{items = {drop.."_"..color}, inherit_color = true },
}
}
end
minetest.register_node(":"..name.."_"..color, def2)
end
end
-- This helper function creates a colored itemstack
function unifieddyes.make_colored_itemstack(item, palette, color)
@ -207,24 +242,17 @@ function unifieddyes.make_colored_itemstack(item, palette, color)
return stack:to_string(),paletteidx
end
-- if your node was once 89-color and uses an LBM to convert to the 256-color palette,
-- call this in that node def's on_construct:
function unifieddyes.on_construct(pos)
local meta = minetest.get_meta(pos)
meta:set_string("palette", "ext")
end
-- these helper functions register all of the recipes needed to create colored
-- nodes with any of the dyes supported by that node's palette.
local function register_c(craft, hue, sat, val)
local function register_c(craft, h, sat, val)
local hue = (type(h) == "table") and h[1] or h
local color = ""
if val then
if craft.palette ~= "extended" then
if craft.palette == "wallmounted" then
color = val..hue..sat
else
color = val..hue[1]..sat
color = val..hue..sat
end
else
color = hue -- if val is nil, then it's grey.
@ -236,18 +264,19 @@ local function register_c(craft, hue, sat, val)
recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
local newrecipe = minetest.deserialize(recipe)
local output = craft.output
local coutput = craft.output or ""
local output = coutput
if craft.output_prefix then
if craft.palette ~= true then
output = craft.output_prefix..color..craft.output_suffix
if craft.palette ~= "split" then
output = craft.output_prefix..color..craft.output_suffix..coutput
else
if hue == "white" or hue == "black" or string.find(hue, "grey") then
output = craft.output_prefix.."grey"..craft.output_suffix
output = craft.output_prefix.."grey"..craft.output_suffix..coutput
elseif hue == "pink" then
dye = "dye:light_red"
output = craft.output_prefix.."red"..craft.output_suffix
output = craft.output_prefix.."red"..craft.output_suffix..coutput
else
output = craft.output_prefix..hue..craft.output_suffix
output = craft.output_prefix..hue..craft.output_suffix..coutput
end
end
end
@ -264,19 +293,18 @@ local function register_c(craft, hue, sat, val)
end
function unifieddyes.register_color_craft(craft)
local hues_table = unifieddyes.HUES
local hues_table = unifieddyes.HUES_EXTENDED
local sats_table = unifieddyes.SATS
local vals_table = unifieddyes.VALS
local vals_table = unifieddyes.VALS_SPLIT
local greys_table = unifieddyes.GREYS
if craft.palette == "wallmounted" then
register_c(craft, "green", "", "light_")
register_c(craft, "azure", "", "")
register_c(craft, "blue", "", "light_")
hues_table = unifieddyes.HUES_WALLMOUNTED
sats_table = {""}
vals_table = unifieddyes.VALS
elseif craft.palette == "extended" then
hues_table = unifieddyes.HUES_EXTENDED
vals_table = unifieddyes.VALS_EXTENDED
greys_table = unifieddyes.GREYS_EXTENDED
end
@ -361,10 +389,10 @@ end
function unifieddyes.get_hsv(name) -- expects a node/item name
local hue = ""
local a,b
for _, i in ipairs(unifieddyes.HUES) do
a,b = string.find(name, "_"..i)
if a and not ( string.find(name, "_redviolet") and i == "red" ) then
hue = i
for _, i in ipairs(unifieddyes.HUES_EXTENDED) do
a,b = string.find(name, "_"..i[1])
if a then
hue = i[1]
break
end
end
@ -394,10 +422,10 @@ end
-- in the function below, color is just a color string, while
-- palette_type can be:
--
-- false/nil = standard 89 color palette
-- true = 89 color palette split into pieces for colorfacedir
-- "wallmounted" = 32-color abridged palette
-- "extended" = 256 color palette
-- "split" = 200 color palette split into pieces for colorfacedir
-- "wallmounted" = 32-color abridged palette
function unifieddyes.getpaletteidx(color, palette_type)
@ -446,24 +474,6 @@ function unifieddyes.getpaletteidx(color, palette_type)
["black"] = 4,
}
local hues = {
["red"] = 1,
["orange"] = 2,
["yellow"] = 3,
["lime"] = 4,
["green"] = 5,
["aqua"] = 6,
["spring"] = 6,
["cyan"] = 7,
["skyblue"] = 8,
["azure"] = 8,
["blue"] = 9,
["violet"] = 10,
["magenta"] = 11,
["redviolet"] = 12,
["rose"] = 12,
}
local hues_extended = {
["red"] = 0,
["vermilion"] = 1,
@ -515,6 +525,17 @@ function unifieddyes.getpaletteidx(color, palette_type)
["darks50"] = 7,
}
local shades_split = {
["faint"] = 0,
[""] = 1,
["s50"] = 2,
["light"] = 3,
["medium"] = 4,
["mediums50"] = 5,
["dark"] = 6,
["darks50"] = 7,
}
local shades_extended = {
["faint"] = 0,
["pastel"] = 1,
@ -546,7 +567,7 @@ function unifieddyes.getpaletteidx(color, palette_type)
if grayscale_wallmounted[color] then
return (grayscale_wallmounted[color] * 8), 0
end
elseif palette_type == true then
elseif palette_type == "split" then
if grayscale[color] then
return (grayscale[color] * 32), 0
end
@ -554,10 +575,6 @@ function unifieddyes.getpaletteidx(color, palette_type)
if grayscale_extended[color] then
return grayscale_extended[color]+240, 0
end
else
if grayscale[color] then
return grayscale[color], 0
end
end
local shade = "" -- assume full
@ -589,7 +606,7 @@ function unifieddyes.getpaletteidx(color, palette_type)
if color == "green" and shade == "light" then return 48,3
elseif color == "brown" then return 17,1
elseif color == "pink" then return 56,7
elseif color == "azure" then return 40,5
elseif color == "blue" and shade == "light" then return 40,5
elseif hues_wallmounted[color] and shades_wallmounted[shade] then
return (shades_wallmounted[shade] * 64 + hues_wallmounted[color] * 8), hues_wallmounted[color]
end
@ -601,36 +618,14 @@ function unifieddyes.getpaletteidx(color, palette_type)
color = "red"
shade = "light"
end
if palette_type == true then -- it's colorfacedir, so "split" 89-color palette
-- If using this palette, translate new color names back to old.
if color == "spring" then
color = "aqua"
elseif color == "azure" then
color = "skyblue"
elseif color == "rose" then
color = "redviolet"
end
if hues[color] and shades[shade] then
return (shades[shade] * 32), hues[color]
if palette_type == "split" then -- it's colorfacedir
if hues_extended[color] and shades_split[shade] then
return (shades_split[shade] * 32), hues_extended[color]+1
end
elseif palette_type == "extended" then
if hues_extended[color] and shades_extended[shade] then
return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color]
end
else -- it's the regular 89-color palette, do the same translation if needed
if color == "spring" then
color = "aqua"
elseif color == "azure" then
color = "skyblue"
elseif color == "rose" then
color = "redviolet"
end
if hues[color] and shades[shade] then
return (hues[color] * 8 + shades[shade]), hues[color]
end
end
end
end
@ -665,21 +660,29 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
return
end
if not def.palette then
if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then
minetest.chat_send_player(player_name, "*** That node can't be colored.")
return
end
local palette = nil
local fdir = 0
if def.palette == "unifieddyes_palette_extended.png" then
if not def or not def.palette then
minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.")
return
elseif def.palette == "unifieddyes_palette_extended.png" then
palette = "extended"
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
palette = "wallmounted"
fdir = node.param2 % 8
elseif def.palette ~= "unifieddyes_palette.png" then
palette = true
elseif def.palette ~= "unifieddyes_palette_extended.png"
and def.palette ~= "unifieddyes_palette_colorwallmounted.png"
and string.find(def.palette, "unifieddyes_palette_") then
palette = "split"
fdir = node.param2 % 32
else
minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.")
return
end
local idx, hue = unifieddyes.getpaletteidx(painting_with, palette)
@ -699,29 +702,42 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
end
local oldidx = node.param2 - fdir
local name = def.airbrush_replacement_node or node.name
if palette == true then
local s = string.sub(def.palette, 21)
local oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
if palette == "split" then
local modname = string.sub(name, 1, string.find(name, ":")-1)
local nodename2 = string.sub(name, string.find(name, ":")+1)
local oldcolor = "snozzberry"
local newcolor = "razzberry" -- intentionally misspelled ;-)
local a,b
if def.ud_color_start and def.ud_color_end then
oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end)
newcolor = string.sub(painting_with, 5)
else
if hue ~= 0 then
newcolor = unifieddyes.HUES_EXTENDED[hue][1]
else
newcolor = "grey"
end
local newcolor = "grey"
if hue ~= 0 then
newcolor = unifieddyes.HUES[hue]
if def.airbrush_replacement_node then
oldcolor = "grey"
else
local s = string.sub(def.palette, 21)
oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
end
end
local a,b = string.gsub(nodename2, oldcolor, newcolor)
name = modname..":"..a
name = modname..":"..string.gsub(nodename2, oldcolor, newcolor)
if not minetest.registered_items[name] then
minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
return
end
elseif idx == oldidx then
return
end
minetest.swap_node(pos, {name = name, param2 = fdir + idx})
if not creative or not creative.is_enabled_for(player_name) then
inv:remove_item("main", painting_with)
@ -764,28 +780,6 @@ function unifieddyes.color_to_name(param2, def)
return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s]
end
elseif def.palette == "unifieddyes_palette.png" then
local color = param2
local h = math.floor(color/8)
local s = 1
local val = ""
if color == 1 or color == h or color > 103 or color == 6 or color == 7 then return "white"
elseif color == 2 then return "light_grey"
elseif color == 3 then return "grey"
elseif color == 4 then return "dark_grey"
elseif color == 5 then return "black"
end
local c = color - h*8
if c == 2 then s = 2
elseif c == 3 then val = "light_"
elseif c == 4 then val = "medium_"
elseif c == 5 then val = "medium_" s = 2
elseif c == 6 then val = "dark_"
else val = "dark_" s = 2
end
return val..unifieddyes.HUES[h+1]..unifieddyes.SATS[s]
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
local color = math.floor(param2 / 8)
if color == 0 then return "white"
@ -801,16 +795,16 @@ function unifieddyes.color_to_name(param2, def)
local h = color - v * 8
return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1]
elseif string.find(def.palette, "unifieddyes_palette") then -- it's the "split" 89-color palette
elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette
-- palette names in this mode are always "unifieddyes_palette_COLORs.png"
local s = string.sub(def.palette, 21)
local color = string.sub(s, 1, string.find(s, "s.png")-1)
local v = math.floor(param2/32)
if v == 0 then return "white" end
if color ~= "grey" then
if v == 1 then return color
if v == 0 then return "faint_"..color
elseif v == 1 then return color
elseif v == 2 then return color.."_s50"
elseif v == 3 then return "light_"..color
elseif v == 4 then return "medium_"..color
@ -826,20 +820,107 @@ function unifieddyes.color_to_name(param2, def)
end
end
local hps = 0.6 -- horizontal position scale
local vps = 1.3 -- vertical position scale
local vs = 0.1 -- vertical shift/offset
local color_button_size = ";0.75,0.75;"
local color_square_size = ";0.69,0.69;"
function unifieddyes.make_readable_color(color)
local s = string.gsub(color, "_", " ")
s = string.gsub(s, "s50", "(low saturation)")
return s
end
function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
local dye = "dye:"..colorname
local overlay = ""
local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255")
if not creative and inv:contains_item("main", dye) then
overlay = "^unifieddyes_onhand_overlay.png"
end
local unavail_overlay = ""
if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname]
or (explist and not explist[colorname]) then
if overlay == "" then
unavail_overlay = "^unifieddyes_unavailable_overlay.png"
else
unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png"
end
end
local tooltip = "tooltip["..colorname..";"..
unifieddyes.make_readable_color(colorname)..
"\n(dye:"..colorname..")]"
if dye == painting_with then
overlay = "^unifieddyes_select_overlay.png"
selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip
end
local form
if unavail_overlay == "" then
form = "image_button["..
(hp*hps)..","..(v2*vps+vs)..
color_button_size..
"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
colorname..";]"..
tooltip
else
form = "image["..
(hp*hps)..","..(v2*vps+vs)..
color_square_size..
"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..
tooltip
end
return form, selindic
end
function unifieddyes.show_airbrush_form(player)
if not player then return end
local t = {}
local player_name = player:get_player_name()
local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name]
local creative = creative and creative.is_enabled_for(player_name)
local inv = player:get_inventory()
local nodepalette = "extended"
local showall = unifieddyes.player_showall[player_name]
local base_form = "size[15,8.5]label[7,-0.25;Select a color:]"
t[1] = "size[14.5,8.5]label[7,-0.3;Select a color:]"
local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]"
local size="0.75,0.75;"
local hps=0.6
local vps=1.3
local vs=0.3
local last_right_click = unifieddyes.player_last_right_clicked[player_name]
if last_right_click then
if last_right_click.def and last_right_click.def.palette then
if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
nodepalette = "wallmounted"
elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
t[#t+1] = "label[0.5,8.25;(Right-clicked a node that supports all 256 colors, showing them all)]"
showall = true
elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png"
and last_right_click.def.palette ~= "unifieddyes_palette_colorwallmounted.png"
and string.find(last_right_click.def.palette, "unifieddyes_palette_") then
nodepalette = "split"
end
end
end
if not last_right_click.def.groups
or not last_right_click.def.groups.ud_param2_colorable
or not last_right_click.def.palette
or not string.find(last_right_click.def.palette, "unifieddyes_palette_") then
t[#t+1] = "label[0.5,8.25;(Right-clicked a node not supported by the Airbrush, showing all colors)]"
end
local explist = last_right_click.def.explist
for v = 0, 6 do
local val = unifieddyes.VALS_EXTENDED[v+1]
@ -849,7 +930,7 @@ function unifieddyes.show_airbrush_form(player)
for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
local hue = h[1]
local hp=hi-0.5
local hp=hi-1
local r = h[2]
local g = h[3]
@ -865,29 +946,10 @@ function unifieddyes.show_airbrush_form(player)
local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
local dye = "dye:"..val..hue..sat
local overlay = ""
local colorize = minetest.formspec_escape("^[colorize:#"..color..":255")
if not creative and inv:contains_item("main", dye) then
overlay = "^unifieddyes_available_overlay.png"
end
if dye == painting_with then
overlay = "^unifieddyes_select_overlay.png"
selindic = "unifieddyes_white_square.png"..colorize..overlay.."]"..
"tooltip["..val..hue..sat..";"..val..hue..sat.."]"
end
base_form = base_form.."image_button["..
(hp*hps)..","..(v2*vps+vs)..";"..
size..
"unifieddyes_white_square.png"..colorize..overlay..";"..
val..hue..sat..";]"..
"tooltip["..val..hue..sat..";"..val..hue..sat.."]"
local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
local f
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
t[#t+1] = f
end
if v > 3 then
@ -896,7 +958,7 @@ function unifieddyes.show_airbrush_form(player)
for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
local hue = h[1]
local hp=hi-0.5
local hp=hi-1
local r = h[2]
local g = h[3]
@ -917,28 +979,10 @@ function unifieddyes.show_airbrush_form(player)
local g3 = math.floor(p+(g2-p)*0.5)
local b3 = math.floor(p+(b2-p)*0.5)
local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
local dye = "dye:"..val..hue..sat
local overlay = ""
local colorize = minetest.formspec_escape("^[colorize:#"..color..":255")
if not creative and inv:contains_item("main", dye) then
overlay = "^unifieddyes_available_overlay.png"
end
if dye == painting_with then
overlay = "^unifieddyes_select_overlay.png"
selindic = "unifieddyes_white_square.png"..colorize..overlay.."]"..
"tooltip["..val..hue..sat..";"..val..hue..sat.."]"
end
base_form = base_form.."image_button["..
(hp*hps)..","..(v2*vps+vs)..";"..
size..
"unifieddyes_white_square.png"..colorize..overlay..";"..
val..hue..sat..";]"..
"tooltip["..val..hue..sat..";"..val..hue..sat.."]"
local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
local f
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
t[#t+1] = f
end
end
end
@ -946,63 +990,75 @@ function unifieddyes.show_airbrush_form(player)
local v2=5
for y = 0, 15 do
local hp=(15-y)+0.5
local hp=15-y
local grey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
local grey2 = "grey_"..y
local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
local grey = "grey_"..y
if y == 0 then grey2 = "black"
elseif y == 4 then grey2 = "dark_grey"
elseif y == 8 then grey2 = "grey"
elseif y == 11 then grey2 = "light_grey"
elseif y == 15 then grey2 = "white"
if y == 0 then grey = "black"
elseif y == 4 then grey = "dark_grey"
elseif y == 8 then grey = "grey"
elseif y == 11 then grey = "light_grey"
elseif y == 15 then grey = "white"
end
local dye = "dye:"..grey2
local overlay = ""
local colorize = minetest.formspec_escape("^[colorize:#"..grey..":255")
if not creative and inv:contains_item("main", dye) then
overlay = "^unifieddyes_available_overlay.png"
end
if dye == painting_with then
overlay = "^unifieddyes_select_overlay.png"
slindic = "unifieddyes_white_square.png"..colorize..overlay.."]"..
"tooltip["..grey2..";"..grey2.."]"
end
base_form = base_form.."image_button["..
(hp*hps)..","..(v2*vps+vs)..";"..
size..
"unifieddyes_white_square.png"..colorize..overlay..";"..
grey2..";]tooltip["..grey2..";"..grey2.."]"
local f
f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
t[#t+1] = f
end
if not creative then
base_form = base_form..
"image[10.3,"..(vps*5+vs)..";"..size..
"unifieddyes_available_overlay.png]"..
"label[11.0,"..(vps*5.1+vs)..";Dyes on hand]"
end
base_form = base_form..
"image[12.5,"..(vps*5+vs)..";"..size..
selindic..
"label[13.2,"..(vps*5.1+vs)..";Your selection]"
t[#t+1] = "image[10,"
t[#t+1] = (vps*5.55+vs)
t[#t+1] = color_button_size
t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7,"
t[#t+1] = (vps*5.51+vs)
t[#t+1] = ";Dyes]"
t[#t+1] = "label[10.7,"
t[#t+1] = (vps*5.67+vs)
t[#t+1] = ";on hand]"
base_form = base_form..
"button_exit[11,8;2,1;cancel;Cancel]"..
"button_exit[13,8;2,1;accept;Accept]"
end
t[#t+1] = "image[10,"
t[#t+1] = (vps*5+vs)
t[#t+1] = color_button_size
t[#t+1] = selindic
if painting_with then
base_form = base_form..
"label[1,"..(7.5+vs)..";Selected dye: "..
painting_with.."]"
t[#t+1] = "label[10.7,"
t[#t+1] = (vps*4.90+vs)
t[#t+1] = ";Your selection:]"
t[#t+1] = "label[10.7,"
t[#t+1] = (vps*5.07+vs)
t[#t+1] = ";"
t[#t+1] = unifieddyes.make_readable_color(string.sub(painting_with, 5))
t[#t+1] = "]label[10.7,"
t[#t+1] = (vps*5.24+vs)
t[#t+1] = ";("
t[#t+1] = painting_with
t[#t+1] = ")]"
else
t[#t+1] = "label[10.7,"
t[#t+1] = (vps*5.07+vs)
t[#t+1] = ";Your selection]"
end
minetest.show_formspec(player_name, "unifieddyes:dye_select_form", base_form)
t[#t+1] = "button_exit[10.5,8;2,1;cancel;Cancel]button_exit[12.5,8;2,1;accept;Accept]"
if last_right_click and last_right_click.def and nodepalette ~= "extended" then
if showall then
t[#t+1] = "button[0,8;2,1;show_avail;Show Available]"
t[#t+1] = "label[2,8.25;(Currently showing all 256 colors)]"
else
t[#t+1] = "button[0,8;2,1;show_all;Show All Colors]"
t[#t+1] = "label[2,8.25;(Currently only showing what the right-clicked node can use)]"
end
end
minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t))
end
minetest.register_tool("unifieddyes:airbrush", {
@ -1016,15 +1072,21 @@ minetest.register_tool("unifieddyes:airbrush", {
on_use = unifieddyes.on_airbrush,
on_place = function(itemstack, placer, pointed_thing)
local keys = placer:get_player_control()
local player_name = placer:get_player_name()
local pos = minetest.get_pointed_thing_position(pointed_thing)
local node
local def
if pos then node = minetest.get_node(pos) end
if node then def = minetest.registered_items[node.name] end
unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def}
if not keys.sneak then
unifieddyes.show_airbrush_form(placer)
elseif keys.sneak then
local player_name = placer:get_player_name()
local pos = minetest.get_pointed_thing_position(pointed_thing)
if not pos then return end
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
if not def then return end
if not pos or not def then return end
local newcolor = unifieddyes.color_to_name(node.param2, def)
if not newcolor then
@ -1047,21 +1109,56 @@ minetest.register_craft( {
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "unifieddyes:dye_select_form" then
local player_name = player:get_player_name()
if fields.quit then
if not fields.accept then
unifieddyes.player_selected_dye[player_name] = nil
return
else
local nodepalette = "extended"
local showall = unifieddyes.player_showall[player_name]
local last_right_click = unifieddyes.player_last_right_clicked[player_name]
if last_right_click and last_right_click.def then
if last_right_click.def.palette then
if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
nodepalette = "wallmounted"
elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then
nodepalette = "split"
end
end
end
if fields.show_all then
unifieddyes.player_showall[player_name] = true
unifieddyes.show_airbrush_form(player)
return
elseif fields.show_avail then
unifieddyes.player_showall[player_name] = false
unifieddyes.show_airbrush_form(player)
return
elseif fields.quit then
if fields.accept then
local dye = unifieddyes.player_selected_dye[player_name]
if not dye then
minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but no color was selected!")
return
end
unifieddyes.player_current_dye[player_name] = dye
unifieddyes.player_selected_dye[player_name] = nil
elseif not showall
and not unifieddyes.palette_has_color[nodepalette.."_"..string.sub(dye, 5)] then
minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the")
minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).")
if unifieddyes.player_current_dye[player_name] then
minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".")
else
minetest.chat_send_player(player_name, "*** Ignoring it.")
end
return
else
unifieddyes.player_current_dye[player_name] = dye
unifieddyes.player_selected_dye[player_name] = nil
minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.")
return
end
else -- assume "Cancel" or Esc.
unifieddyes.player_selected_dye[player_name] = nil
return
end
else
@ -1071,7 +1168,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local inv = player:get_inventory()
local creative = creative and creative.is_enabled_for(player_name)
local dye = "dye:"..s3
if minetest.registered_items[dye] and (creative or inv:contains_item("main", dye)) then
if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and
(minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then
unifieddyes.player_selected_dye[player_name] = dye
unifieddyes.show_airbrush_form(player)
end
@ -1079,30 +1178,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
end)
-- build a table to convert from classic/89-color palette to extended palette
-- the first five entries are for the old greyscale - white, light, grey, dark, black
unifieddyes.convert_classic_palette = {
240,
244,
247,
251,
253
}
for hue = 0, 11 do
-- light
local paletteidx = unifieddyes.getpaletteidx("dye:light_"..unifieddyes.HUES[hue+1], false)
unifieddyes.convert_classic_palette[paletteidx] = hue*2 + 48
for sat = 0, 1 do
for val = 0, 2 do
-- all other shades
local paletteidx = unifieddyes.getpaletteidx("dye:"..unifieddyes.VALS[val+1]..unifieddyes.HUES[hue+1]..unifieddyes.SATS[sat+1], false)
unifieddyes.convert_classic_palette[paletteidx] = hue*2 + sat*24 + (val*48+96)
end
end
end
-- Generate all dyes that are not part of the default minetest_game dyes mod
for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
@ -1145,14 +1220,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
end
end
minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
if h[1] == "spring" then
minetest.register_alias("unifieddyes:"..val.."aqua", "dye:"..val.."spring")
elseif h[1] == "azure" then
minetest.register_alias("unifieddyes:"..val.."skyblue", "dye:"..val.."azure")
elseif h[1] == "rose" then
minetest.register_alias("unifieddyes:"..val.."redviolet", "dye:"..val.."rose")
end
if v > 3 then -- also register the low-sat version
@ -1173,13 +1240,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
groups = { dye=1, not_in_creative_inventory=1 },
})
minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
if h[1] == "spring" then
minetest.register_alias("unifieddyes:"..val.."aqua_s50", "dye:"..val.."spring_s50")
elseif h[1] == "azure" then
minetest.register_alias("unifieddyes:"..val.."skyblue_s50", "dye:"..val.."azure_s50")
elseif h[1] == "rose" then
minetest.register_alias("unifieddyes:"..val.."redviolet_s50", "dye:"..val.."rose_s50")
end
end
end
end
@ -1217,6 +1277,43 @@ minetest.register_craftitem(":dye:light_grey", {
groups = { dye=1, not_in_creative_inventory=1 },
})
-- build a table of color <-> palette associations to reduce the need for
-- realtime lookups with getpaletteidx()
for _, palette in ipairs({"extended", "split", "wallmounted"}) do
local palette2 = palette
for i in ipairs(unifieddyes.SATS) do
local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i]
for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do
for _, val in ipairs(unifieddyes.VALS_EXTENDED) do
local color = val..hue[1]..sat
if unifieddyes.getpaletteidx("dye:"..color, palette2) then
unifieddyes.palette_has_color[palette.."_"..color] = true
end
end
end
end
for y = 0, 15 do
local grey = "grey_"..y
if y == 0 then grey = "black"
elseif y == 4 then grey = "dark_grey"
elseif y == 8 then grey = "grey"
elseif y == 11 then grey = "light_grey"
elseif y == 15 then grey = "white"
end
if unifieddyes.getpaletteidx("dye:"..grey, palette2) then
unifieddyes.palette_has_color[palette.."_"..grey] = true
end
end
end
unifieddyes.palette_has_color["wallmounted_light_red"] = true
-- crafting!
unifieddyes.base_color_crafts = {
{ "red", "flowers:rose", nil, nil, nil, nil, 4 },
{ "vermilion", "dye:red", "dye:orange", nil, nil, nil, 3 },

View File

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B