[minetest-mod-unifieddyes] 02/09: New upstream version 20170925

Julien Puydt julien.puydt at laposte.net
Fri Oct 6 08:45:56 UTC 2017


This is an automated email from the git hooks/post-receive script.

jpuydt-guest pushed a commit to branch master
in repository minetest-mod-unifieddyes.

commit 891eab5ff63df65695163a8fa41e051968e704cf
Author: Julien Puydt <julien.puydt at laposte.net>
Date:   Tue Sep 26 19:20:44 2017 +0200

    New upstream version 20170925
---
 API.md                                            |  108 ++
 README                                            |  248 -----
 README.md                                         |   16 +
 gentextures-jpg.sh                                |  183 ---
 gentextures.sh                                    |  177 ---
 init.lua                                          | 1233 ++++++++++++++++-----
 listcolors.sh                                     |   79 --
 locale/fr.txt                                     |   87 ++
 locale/pt.txt                                     |   85 ++
 textures/unifieddyes_aqua.png                     |  Bin 161 -> 0 bytes
 textures/unifieddyes_aqua_s50.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_blue_s50.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_cyan_s50.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_aqua.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_aqua_s50.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_blue.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_blue_s50.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_cyan.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_cyan_s50.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_green.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_green_s50.png           |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_lime.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_lime_s50.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_magenta.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_magenta_s50.png         |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_orange.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_orange_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_red.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_red_s50.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_redviolet.png           |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_redviolet_s50.png       |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_skyblue.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_skyblue_s50.png         |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_violet.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_violet_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_yellow.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_dark_yellow_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_darkgrey.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_dye.png                      |  Bin 0 -> 150 bytes
 textures/unifieddyes_green_s50.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_aqua.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_blue.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_cyan.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_green.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_lime.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_magenta.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_orange.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_red.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_redviolet.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_skyblue.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_violet.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_light_yellow.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_lightgrey.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_lime.png                     |  Bin 161 -> 0 bytes
 textures/unifieddyes_lime_s50.png                 |  Bin 161 -> 0 bytes
 textures/unifieddyes_magenta_s50.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_aqua.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_aqua_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_blue.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_blue_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_cyan.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_cyan_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_green.png             |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_green_s50.png         |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_lime.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_lime_s50.png          |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_magenta.png           |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_magenta_s50.png       |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_orange.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_orange_s50.png        |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_red.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_red_s50.png           |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_redviolet.png         |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_redviolet_s50.png     |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_skyblue.png           |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_skyblue_s50.png       |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_violet.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_violet_s50.png        |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_yellow.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_medium_yellow_s50.png        |  Bin 161 -> 0 bytes
 textures/unifieddyes_orange_s50.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_palette.png                  |  Bin 0 -> 207 bytes
 textures/unifieddyes_palette_aquas.png            |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_blues.png            |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_colorwallmounted.png |  Bin 0 -> 136 bytes
 textures/unifieddyes_palette_cyans.png            |  Bin 0 -> 101 bytes
 textures/unifieddyes_palette_extended.png         |  Bin 0 -> 290 bytes
 textures/unifieddyes_palette_greens.png           |  Bin 0 -> 91 bytes
 textures/unifieddyes_palette_greys.png            |  Bin 0 -> 90 bytes
 textures/unifieddyes_palette_limes.png            |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_magentas.png         |  Bin 0 -> 101 bytes
 textures/unifieddyes_palette_oranges.png          |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_reds.png             |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_redviolets.png       |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_skyblues.png         |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_violets.png          |  Bin 0 -> 99 bytes
 textures/unifieddyes_palette_yellows.png          |  Bin 0 -> 101 bytes
 textures/unifieddyes_red_s50.png                  |  Bin 161 -> 0 bytes
 textures/unifieddyes_redviolet.png                |  Bin 161 -> 0 bytes
 textures/unifieddyes_redviolet_s50.png            |  Bin 161 -> 0 bytes
 textures/unifieddyes_skyblue.png                  |  Bin 161 -> 0 bytes
 textures/unifieddyes_skyblue_s50.png              |  Bin 161 -> 0 bytes
 textures/unifieddyes_violet_s50.png               |  Bin 161 -> 0 bytes
 textures/unifieddyes_yellow_s50.png               |  Bin 161 -> 0 bytes
 unifieddyes_base.png                              |  Bin 89 -> 0 bytes
 105 files changed, 1261 insertions(+), 955 deletions(-)

diff --git a/API.md b/API.md
new file mode 100644
index 0000000..a4e0a62
--- /dev/null
+++ b/API.md
@@ -0,0 +1,108 @@
+### API
+
+This section details the Unified Dyes API and how to use it with your mods.
+
+In your node definition, you must include a few things to interface with Unified Dyes. Here is an example:
+
+```lua
+minetest.register_node("mymod:colored_node", {
+   description = "My custom colored node",
+   tiles = { "mymod_custom_colored_node.png" },
+   paramtype = "light",
+   paramtype2 = "color",
+   palette = "unifieddyes_palette_extended.png",
+   place_param2 = 240,
+   groups = {snappy = 1, cracky = 2, ud_param2_colorable = 1}
+   on_construct = unifieddyes.on_construct,
+   after_place_node = unifieddyes.recolor_on_place,
+   after_dig_node = unifieddyes.after_dig_node,
+})
+```
+
+`paramtype2` must be one of:
+- "color" this is an 89-color or 256-color node
+- "colorwallmounted" this is a 32-color node using "wallmounted" mode
+- "colorfacedir" this node uses one of the "split" 89-color palettes.
+
+`palette` must be set to match the `paramtype2` setting, and must be one of:
+- "unifieddyes_palette.png"
+- "unifieddyes_palette_extended.png"
+- "unifieddyes_palette_colorwallmounted.png"
+- or one of the "split" hues palettes (see below).
+
+`place_param2` generally is only needed for the 256-color palette, and should usually be set to 240 (which corresponds to white).
+`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.
+`on_construct` see below.
+`after_place_node` see below.
+`after_dig_node` see below.
+
+#### Function calls
+
+**`unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)`**
+
+Call this within your node's `after_place_node` callback to allow Unified Dyes to automatically color the node using the dye you last used on that kind of node The feature will remain active until the dye runs out, or the user places a different kind of colorable node, or the user cancels the feature.
+
+**`unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)`
+`unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)`**
+
+These two are used to re-orient `wallmounted` nodes after placing. The former allows positioning to floor, ceiling, and four walls, while the latter restricts the rotation to just the four walls. The latter is most often used with a node whose model is designed so that the four wall positions actually place the model "upright", facing +/- X or Z. This is a hacky way to make a node look like it has basic `facedir` capability, while being able to use the 32-color palette.
+
+**`unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2)`**
+
+This serves the same purpose as the `fix_rotation_nsew`, but is used to restrict the node's rotation after it's been hit with the screwdriver.
+
+**`unifieddyes.select_node(pointed_thing)`**
+
+Just what it says on the tin. :-) This function returns a position and node definition of whatever is being pointed at. 
+
+**`unifieddyes.is_buildable_to(placer_name, ...)`**
+
+Again, another obvious one, returns whether or not the pointed node is `buildable_to` (can be overwritten by another node).
+
+**`unifieddyes.get_hsv(name)`**
+
+Accepts an item name, and returns the corresponding hue, saturation, and value (in that order), as strings.
+
+If the item name is a color (not greyscale), then hue will be the basic hue for that color, saturation will be empty string for high saturation or `_s50` for low, and value will be `dark_`, `medium_`, `light_`, or an empty string if it's full color.
+
+If the item name is greyscale, then hue will contain `white`, `light_grey`, `grey`, `dark_grey`, or `black`, saturation will (ironically) be an empty string, and value will be `light_`, `dark_`, or empty string if it's medium grey.
+
+For example:
+"mymod:mynode_red" would return ("red", "", "")
+"mymod:mynode_light_blue" would return ("blue", "", "light_")
+"mymod:mynode_dark_yellow_s50" would return ("yellow", "_s50", "dark_")
+"mymod:mynode_dark_grey" would return ("dark_grey", "", "dark_")
+
+**`unifieddyes.getpaletteidx(color, palette_type)`**
+
+When given a `color` string (in the form of "dye:foo" or "unifieddyes:foo") and `palette_type` (either a boolean or string), this function returns the numerical index into that palette, and the hue name as a string.
+    `false` or `nil`: the 89-color palette
+    `true`: 89 color "split" palette mode, for nodes that need full `facedir` support. In this case, the hue field would match whichever of the 13 "split" palettes the node is using, and the index will be 1-7, representing the shade within that palette. See my coloredwoods mod for more information on how this mode is used.
+    `wallmounted`: the 32-color palette, for nodes using `colorwallmounted` mode.
+    `extended`: the 256-color "extended" palette
+
+**`unifieddyes.on_construct(pos)`**
+
+This function, called in your node definition's on_construct, just sets the `palette = "ext"` metadata key for the node after it's been placed. This can then be read in an LBM to determine if this node needs to be converted from the old 89-color palette to the extended 256-color palette. Although it is good practice to call this for any node that uses the 256-color palette, it isn't strictly necessary as long as the node has never used the 89-color palette and won't be subjected to an LB [...]
+
+**`unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger)`**
+
+This function handles returning dyes to the user when a node is dug. All colorized nodes need to call this in `after_dig_node`.
+
+**`unifieddyes.on_use(itemstack, player, pointed_thing)`**
+
+This function is used internally by Unfiied Dyes to actually make a dye able to colorize a node when you wield and punch with it. Unified Dyes redefines the minetest_game default dye items to call this function.
+
+#### Tables
+
+In addition to the above API calls, Unified Dyes provides several useful tables
+
+`unifieddyes.HUES` contains a list of the 12 hues used by the 89-color palette.
+
+`unifieddyes.HUES_EXTENDED` contains a list of the 24 hues in the 256-color palette. Each line contains the color name and its RGB value expressed as three numbers (rather than the usual `#RRGGBB` string).
+
+`unifieddyes.base_color_crafts` contains a condensed list of crafting recipes for all 24 basic hues, plus black and white, most of which have multiple alternative recipes. Each line contains the name of the color, up to five dye itemstrings (with `nil` in each unused space), and the yield for that craft. 
+
+`unifieddyes.shade_crafts` contains recipes for each of the 10 shades a hue can take on, used with one or two portions of the dye corresponding to that hue. Each line contains the shade name with trailing "_", the saturation name (either `_s50` or empty string), up to three dye itemstrings, and the yield for that craft.
+
+`unifieddyes.greymixes` contains the recipes for the 14 shades of grey. Each line contains the grey shade number from 1-14, up to four dye item names, and the yield for that craft.
diff --git a/README b/README
deleted file mode 100644
index eba6d52..0000000
--- a/README
+++ /dev/null
@@ -1,248 +0,0 @@
-VanessaE's Unified Dyes
-=======================
-
-The purpose of this mod originally was to supply a complete set of colors for 
-Minetest mod authors to use in their recipes.  Since the default dyes mod that 
-is supplied with Minetest "common" is now usable (via flowers, also included in 
-"common"), this mod has become more of an extension pack.
-
-Unified Dyes expands the standard dye set from 15 to 90 colors.
-
-IMPORTANT: This mod is not intended to suggest that you should use the entire 
-palette.  Rather, I was hoping people would just choose maybe the dozen or so 
-most useful colors to use in their mods.
-
-Dependencies: default and dye from Minetest "common". This mod will NOT work 
-without these.  This mod will NOT work without these.  The default dye mod is 
-normally activated only in the standard "build" and "minetest_game" games, or perhaps if 
-someone has a modpack or game that includes them.
-
-Recommends: flowers from common.
-
-License: GPL 2.0 or above
-
-Install: Unzip the distribution file, rename the resultant 
-VanessaE-unifieddyes-blahblah folder to just "unifieddyes", and move it into 
-Minetest's mods folder.
-
-The Palette:
-
-[ http://digitalaudioconcepts.com/vanessa/hobbies/minetest/screenshots/color-swatches.png ] 
-[ The official palette, showing 84 colors and 5 greys. ]
-
-In the image above, the "50%" markings on the left next to each shade mean 50% 
-saturation for all hues in that shade line.  Note that the "light" shades don't 
-have (or need) that variant.  For the greys, the percentages shown are of 
-brightness relative to pure white.  There are three special cases: Light red 
-has been aliased to default pink dye, and dark green has been aliased to 
-default dark greey dye.  Brown dye also exists in the default set, it's just 
-not shown in the palette above.
-
-
-Usage instructions, technical information 
-=========================================
-
-Getting Started
----------------
-
-First thing's first: you're going to need to harvest some materials to make the 
-dyes from.  For this, you need one or more of the following: roses (red), 
-tulips (orange), yellow dandelions (yellow), cactus (green), geraniums (blue), 
-violas (purple), coal (black), or white dandelions (white).  Simply wander 
-around your world and collect whichever of the above you need to get your 
-colors.
-
-[ http://digitalaudioconcepts.com/vanessa/hobbies/minetest/screenshots/unifieddyes1.png ]
-[ The 8 base colors directly obtainable from a material in the world. ]
-
-Simply place one of the above materials into the crafting grid to obtain four 
-portions of dye in that color From those initial 8 colors, you can directly 
-fashion another 11, for a total of 19 standard colors (including the various 
-greys):
-
-[ http://digitalaudioconcepts.com/vanessa/hobbies/minetest/screenshots/unifieddyes2.png ]
-[ The complete 19-color standard set. ]
-
-The standardized colors and their crafting methods are as follows:
-
-* Red (0°): one rose
-* Orange (30°): one tulip, or put one red dye and one yellow dye into the
-  crafting grid to mix them (yields 2)
-* Yellow (60°): one yellow dandelion
-* Lime (90°): mix yellow + green (yields 2)
-* Green (120°): one cactus, or mix yellow + blue (yields 2)
-* Aqua (150°): mix green + cyan (yields 2)
-* Cyan (180°): mix green + blue (yields 2)
-* Sky blue (210°): mix cyan + blue (yields 2)
-* Blue (240°): one geranium
-* Violet (270°): one viola, or mix blue + magenta (yields 2).
-* Magenta (300°): mix blue + red (yields 2)
-* Red-violet (330°): mix magenta + red (yields 2)
-
-* Black (7.5%): one piece of coal
-* Dark grey (25%): mix one white + two black (yields 3)
-* Medium grey (50%): mix one white and one black (yields 2)
-* Light grey (75%): Mix two white and one black (yields 3)
-* White (95%): one white dandelion.
-
-The degree figures are the colors' hues on a standard HSV color wheel, and are 
-what I used in the textures supplied with this mod.  For the greys, the figures 
-in parenthesis indicate the intended brightness of the shade, relative to 
-white.  Note that black and white don't go all the way to the bottom/top of the 
-scale, as doing so may crush some details in textures made in those shades (see 
-below, regarding semi-automatic texture generation).
-
-
-Darker/Lighter colors
----------------------
-
-To obtain a dark (33%) version of a given color, use two portions of black dye 
-along with the base color from the list above, which yields three portions of 
-the final color.
-
-To obtain a medium-brightness (66%) version of a given color, mix one portion 
-the base color with one portion of black dye (for example, medium lime = lime + 
-black).  All such mixtures yield two portions of the final color.
-
-To obtain a light (150% over full) version of a given color, mix one portion of 
-the base color with one portion of white dye.  Yields 2 portions of the final 
-color.
-
-
-Low-saturation colors
----------------------
-
-To get the low saturation (50%) version of one of the base colors, mix one or 
-more of white, black, or a shade of grey with the desired base color:
-
-Dark, low saturation: dark grey dye + color (yields 2), or two blacks + 1 white 
-+ color (yields 4).  For example, dark, low-saturation red = red + dark grey, 
-or red + two black + one white.
-
-Medium brightness, low saturation: medium grey dye + color (yields 2), or black 
-+ white + color (yields 3).  For example, medium, low-saturation green = green 
-+ medium grey, or green + black + white.
-
-Full, low saturation: light grey dye + color (yields 2), or 1 black + 2 whites 
-+ color (yields 4).  For example, bright, low-saturation blue = blue + light 
-grey, or blue + black + 2 white.
-
-There is no low-saturation version of the "light" colors.
-
-Red + white always returns default pink dye, and black + green always returns 
-default dark green dye.
-
-
-RGB values
-----------
-
-All RGB values and filenames for all colors and shades of grey are represented 
-in the file "colors.txt" (which was generated with the bash script 
-"listcolors.sh"), included in the distribution directory.  Note that 
-listcolors.sh is an example only and was written for a different set of 
-textures than what Unified Dyes includes now.
-
-
-Misc. Notes
------------
-
-If you need to use /give commands, the item names for the standard set of 12 
-regular "full" colors (plus pink, brown, and dark green) is simply "dye:color", 
-e.g. "dye:red", "dye:pink", or "dye:skyblue".  Greys have a similar naming 
-convention: dye:white, dye:light_grey, dye:grey, dye:dark_grey, or dye:black.
-
-For everything beyond those initial 19 colors, the item names are of the 
-following format:
-
-unifieddyes:{"light_" or "medium_" or "dark_"}{color}{nothing or "_s50"}.
-
-For example, low saturation dark yellow is "unifieddyes:dark_yellow_s50", while 
-light normal-saturation red-violet would be "unifieddyes:light_redviolet".
-
-See the texture filenames in the textures/ folder for further hints - all of 
-the item names follow the same format as the corresponding filenames, save for 
-having a colon (:) instead of the first underscore (_).
-
-
-Semi-automatic generation of textures 
-=====================================
-
-The texture generator script
-----------------------------
-
-Obviously, in order for this mod or the above template to be useful, you'll 
-need textures.  If you plan to support the entire range of colors offered by 
-Unified Dyes, there is a BASH script included with this mod as well with the 
-above template named gentextures.sh, which will, with an appropriately- colored 
-and appropriately-named source texture, and possibly an overlay texture, 
-generate a complete set of colored and greyscale textures.
-
-The script requires bc (the calculator program) to handle some basic math 
-regarding the hue adjustments, and Imagemagick's "convert" program handles all 
-of the actual conversions.
-
-First thing's first though - you need source textures.  Using your favorite 
-image editor, create a single version of your desired texture.  Draw it in the 
-brightest, deepest shade of RED you can muster without losing any detail, and 
-save it out.  Ideally, you will want the average color of the texture, when 
-taking into account all bright and dark areas, to be as close as possible to 
-the hex value #FF0000 (0 degrees, 100% saturation, pure red) without losing any 
-appreciable #detail.
-
-Save this source texture out as a PNG image, with a filename of 
-"whatever_base.png", where "whatever" is the one-word name of your mod - for 
-example, mymod_base.png.
-
-If you want to add an image on top of the colored blocks, such as a frame, 
-which you want to be the same color throughout all of the textures, create it 
-now.  It should consist only of those parts of the textures that you want to 
-leave unchanged, with some level of alpha transparency everywhere else, 
-depending on how much of the image needs to remain unchanged.  Save it out as a 
-PNG image, using any filename you want, for example myoverlay.png.
-
-Now, use chmod to make the script executable, if necessary, and run it.
-
-If you don't need the overlay, you just need to supply one command line 
-argument: the base name of your mod.  The script will use that parameter as the 
-basis of its texture filenames. For example:
-
-./gentextures.sh mymod
-
-The script will then look for mymod_base.png and copy and convert it into 
-things like mymod_red.png, mymod_dark_blue.png, and so on.
-
-If you want to use an overlay also, skip the above step and run the script with 
-the base name as the first parameter, and the complete filename of your overlay 
-as the second instead.  For example:
-
-./gentextures.sh mymod myoverlay.png
-
-Otherwise, the program will iterate through all of the hues and shades that are 
-supported by unifieddyes (though this is done manually, not by reading anything 
-from the mod), compositing your overlay image in after the recolor step, if 
-you're using that option.
-
-All of the output files will be placed in a new folder, generated-textures/ in 
-the current directory.  Note that the script looks for the above files in the 
-current directory also.
-
-The script has a third mode as well:
-
-./gentextures.sh -t mymod myoverlay.png
-
-In this mode, the script will leave the base texture mymod_base.png unchanged, 
-and instead will rotate the colors of the overlay image and then composite that 
-onto the base texture.  The same color changes will happen with the overlay in 
-this mode, so it's a good idea to make the overlay some fairly saturated shade 
-of red.  Along with that, the base image should be some neutral color; any 
-color is fine as long as the result is what you wanted.
-
-The program attempts to verify that the files you've asked it to use will 
-actually work, and will exit immediately if the any are invalid, missing, etc.
-
-Use your favorite image browser or file manager to review the results in 
-generated-textures/, and if they're right, copy them over to the textures/ 
-folder in your mod.
-
-Note that this script does not generate brown and pink variations of your base 
-texture - you'll have to do those two manually.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..44ddbb2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+VanessaE's Unified Dyes
+=======================
+
+The purpose of this mod originally was to supply a complete set of colors for Minetest mod authors to use for colorized nodes, or to reference in recipes. Since the advent of the default dyes mod in minetest_game, this mod has become more of an extension of the default mod.  Since the advent of param2 colorization, it has also become a library for general color handling.
+
+Unified Dyes expands the standard dye set from 15 colors to 32, 89, or 256 (see the API and usage info).
+
+Dependencies: Minetest engine version 0.4.16 or higher and a corresponding copy of minetest_game.
+
+License: GPL 2.0 or higher.
+
+Install: Unzip the distribution file, rename the resultant folder to just "unifieddyes", move it into Minetest's mods folder, and enable it in your world configuration.
+
+Usage: for detailed usage information, please see [the Unified Dyes Thread](https://forum.minetest.net/viewtopic.php?f=11&t=2178&p=28399) on the Minetest forum.
+
+API: the full API is documented here: https://github.com/minetest-mods/unifieddyes/blob/master/API.md
diff --git a/gentextures-jpg.sh b/gentextures-jpg.sh
deleted file mode 100644
index a7cad60..0000000
--- a/gentextures-jpg.sh
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/bin/bash
-
-# This program auto-generates colorized textures for all 89 of the Unified 
-# Dyes colors, based on one or two input files.
-
-# Copyright (C) 2012-2013, Vanessa Ezekowitz
-# Email: vanessaezekowitz at gmail.com
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-if [ -z "`which convert`" ] ; then {
-	echo "Please install Imagemagick."
-	exit 1
-} fi
-
-if [ -z "`which bc`" ] ; then {
-	echo "Please install GNU bc."
-	exit 1
-} fi
-
-if [ $1 = "-t" ] ; then {
-	TINT_OVERLAY=$1
-	BASE=$2
-	COMPOSITE=$3
-} else {
-	TINT_OVERLAY=""
-	BASE=$1
-	COMPOSITE=$2
-} fi
-
-if [ -z $1 ] || [ $1 == "--help" ] || [ $1 == "-h" ] || [[ $1 == "-t" && -z $3 ]] ; then {
-
-	echo -e "\nUsage:
-\ngentextures.sh basename [overlay_filename]
-gentextures.sh -t basename overlay_filename
-
-\nThis script requires up to three parameters which supply the base 
-filename of the textures, an optional .png overlay, and possibly the 
-'-t' switch.  The 'basename' is the first part of the filename that your 
-textures will use when your mod is done, which should almost always be 
-the same as the one-word name of your mod.  For example, if you supply 
-the word 'mymod', this script will produce filenames like mymod_red.jpg 
-or 'mymod_dark_blue_s50.jpg'.  The texture that this script will read 
-and recolor is derived from this parameter, and will be of the form 
-'basename_base.jpg', i.e. 'mymod_base.jpg'. \nYou can also supply an 
-overlay image filename.  This image needs to be a .png or .gif or some 
-other alpha-capable format supported by ImageMagick, and will be 
-composited onto the output files after they have been colorized, but 
-without being modified.  This is useful when you have some part of your 
-base image that will either get changed undesirably (for example, the 
-mortar among several bricks, or the shading detail of a stone pattern).  
-Simply draw two images: one containing the whole image to be colored, 
-and one containing the parts that should not be changed, with either 
-full or partial alpha transparency where the re-colored base image 
-should show through.  Skilled use of color and alpha on this overlay can 
-lead to some interesting effects. \nIf you add '-t' as the first 
-parameter, the script will switch to 'tint overlay' mode.  For this mode 
-to work, you must also supply the base name as usual, and you must 
-include an overlay image filename.  Rather than re-color the base 
-texture, the script will alter the hue/saturation/value of the overlay 
-texture file instead, and leave the base texture unchanged.  When using 
-this mode, the base texture should be drawn in some neutral color, but 
-any color is fine if it results in what you wanted.\n"
-
-
-	exit 1
-} fi
-
-if [[ ! -e $BASE"_base.jpg" ]]; then {
-	echo -e "\nThe basename '"$BASE"_base.jpg' was not found."
-        echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-if [[ ! -z $COMPOSITE && ! -e $COMPOSITE ]]; then {
-	echo -e "\nThe requested composite file '"$COMPOSITE"' was not found."
-        echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-convert $BASE"_base.jpg" -modulate 1,2,3 tempfile.jpg 1>/dev/null 2>/dev/null
-
-if (( $? )) ; then {
-	echo -e "\nImagemagick failed while testing the base texture file."
-	echo -e "\nEither the base file '"$BASE"_base.jpg' isn't an image,"
-	echo "or it is broken, or Imagemagick itself just didn't work."
-	echo -e "\nPlease check and correct your base image and try again."
-	echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-if [ ! -z $COMPOSITE ] ; then {
-	convert $BASE"_base.jpg" -modulate 1,2,3 $COMPOSITE -composite tempfile.jpg 1>/dev/null 2>/dev/null
-
-	if (( $? )) ; then {
-		echo -e "\nImagemagick failed while testing the composite file."
-		echo -e "\nEither the composite file '"$COMPOSITE"' isn't an image"
-		echo "or it is broken, or Imagemagick itself just didn't work."
-		echo -e "\nPlease check and correct your composite image and try again."
-		echo -e "\nAborting.\n"
-		exit 1
-	} fi
-} fi
-
-rm tempfile.jpg
-
-base_colors="red orange yellow lime green aqua cyan skyblue blue violet magenta redviolet"
-
-echo -e -n "\nGenerating filenames based on "$BASE"_base.jpg"
-if [ ! -z $COMPOSITE ] ; then {
-	echo ","
-	echo -n "using "$COMPOSITE" as an overlay"
-} fi
-
-if [ ! -z $TINT_OVERLAY ] ; then {
-	echo ","
-	echo -n "and tinting the overlay instead of the base texture"
-} fi
-
-echo -e "...\n"
-
-mkdir -p generated-textures
-
-function generate_texture () {
-	name=$1
-	h=$2
-	s=$3
-	v=$4
-	if [ -z $TINT_OVERLAY ]; then {
-		if [ -z $COMPOSITE ]; then {
-			convert $BASE"_base.jpg" -modulate $v,$s,$h -quality 97 "generated-textures/"$BASE"_"$name".jpg"
-		} else {
-			convert $BASE"_base.jpg" -modulate $v,$s,$h -quality 97 $COMPOSITE -composite "generated-textures/"$BASE"_"$name".jpg"
-		} fi
-	} else {
-		convert $COMPOSITE -modulate $v,$s,$h -quality 97 MIFF:- | composite MIFF:- $BASE"_base.jpg" "generated-textures/"$BASE"_"$name".jpg"
-	} fi
-}
-
-hue=0
-for color_name in $base_colors ; do
-	hue2=`echo "scale=10; ("$hue"*200/360)+100" |bc`
-	echo $color_name "("$hue" degrees)"
-	echo "     dark"
-	generate_texture "dark_"$color_name $hue2 100 33
-	echo "     medium"
-	generate_texture "medium_"$color_name $hue2 100 66
-	echo "     full"
-	generate_texture $color_name $hue2 100 100
-	echo "     light"
-	generate_texture "light_"$color_name $hue2 100 150
-	echo "     dark, 50% saturation"
-	generate_texture "dark_"$color_name"_s50" $hue2 50 33
-	echo "     medium, 50% saturation"
-	generate_texture "medium_"$color_name"_s50" $hue2 50 66
-	echo "     full, 50% saturation"
-	generate_texture $color_name"_s50" $hue2 50 100 
-	hue=$((hue+30))
-done
-
-echo "greyscales"
-echo "     black"
-generate_texture black 0 0 15
-echo "     dark grey"
-generate_texture darkgrey 0 0 50
-echo "     medium grey"
-generate_texture grey 0 0 100
-echo "     light grey"
-generate_texture lightgrey 0 0 150
-echo "     white"
-generate_texture white 0 0 190
diff --git a/gentextures.sh b/gentextures.sh
deleted file mode 100644
index 842817e..0000000
--- a/gentextures.sh
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/bin/bash
-
-# This program auto-generates colorized textures for all 89 of the Unified 
-# Dyes colors, based on one or two input files.
-
-# Copyright (C) 2012-2013, Vanessa Ezekowitz
-# Email: vanessaezekowitz at gmail.com
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-if [ -z "`which convert`" ] ; then {
-	echo "Please install Imagemagick."
-	exit 1
-} fi
-
-if [ -z "`which bc`" ] ; then {
-	echo "Please install GNU bc."
-	exit 1
-} fi
-
-if [ $1 = "-t" ] ; then {
-	TINT_OVERLAY=$1
-	BASE=$2
-	COMPOSITE=$3
-} else {
-	TINT_OVERLAY=""
-	BASE=$1
-	COMPOSITE=$2
-} fi
-
-if [ -z $1 ] || [ $1 == "--help" ] || [ $1 == "-h" ] || [[ $1 == "-t" && -z $3 ]] ; then {
-
-	echo -e "\nUsage:
-\ngentextures.sh basename [overlay_filename]
-gentextures.sh -t basename overlay_filename
-\nThis script requires up to three parameters which supply the base filename
-of the textures, an optional overlay, and possibly the '-t' switch.  The
-'basename' is the first part of the filename that your textures will use when
-your mod is done, which should almost always be the same as the one-word name
-of your mod.  For example, if you supply the word 'mymod', this script will
-produce filenames like mymod_red.png or 'mymod_dark_blue_s50.png'.  The
-texture that this script will read and recolor is derived from this parameter,
-and will be of the form 'basename_base.png', i.e. 'mymod_base.png'.
-\nYou can also supply an optional overlay image filename.  This image will be
-composited onto the output files after they have been colorized, but without
-being modified.  This is useful when you have some part of your base image
-that will either get changed undesirably (for example, the mortar among
-several bricks, or the shading detail of a stone pattern).  Simply draw two
-images: one containing the whole image to be colored, and one containing the
-parts that should not be changed, with either full or partial alpha
-transparency where the re-colored base image should show through.  Skilled use
-of color and alpha on this overlay can lead to some interesting effects.
-\nIf you add '-t' as the first parameter, the script will switch to 'tint
-overlay' mode.  For this mode to work, you must also supply the base name as
-usual, and you must include an overlay image filename.  Rather than re-color
-the base texture, the script will alter the hue/saturation/value of the
-overlay texture file instead, and leave the base texture unchanged.  When
-using this mode, the base texture should be drawn in some neutral color, but
-any color is fine if it results in what you wanted.\n"
-	exit 1
-} fi
-
-if [[ ! -e $BASE"_base.png" ]]; then {
-	echo -e "\nThe basename '"$BASE"_base.png' was not found."
-        echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-if [[ ! -z $COMPOSITE && ! -e $COMPOSITE ]]; then {
-	echo -e "\nThe requested composite file '"$COMPOSITE"' was not found."
-        echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-convert $BASE"_base.png" -modulate 1,2,3 tempfile.png 1>/dev/null 2>/dev/null
-
-if (( $? )) ; then {
-	echo -e "\nImagemagick failed while testing the base texture file."
-	echo -e "\nEither the base file '"$BASE"_base.png' isn't an image,"
-	echo "or it is broken, or Imagemagick itself just didn't work."
-	echo -e "\nPlease check and correct your base image and try again."
-	echo -e "\nAborting.\n"
-	exit 1
-} fi
-
-if [ ! -z $COMPOSITE ] ; then {
-	convert $BASE"_base.png" -modulate 1,2,3 $COMPOSITE -composite tempfile.png 1>/dev/null 2>/dev/null
-
-	if (( $? )) ; then {
-		echo -e "\nImagemagick failed while testing the composite file."
-		echo -e "\nEither the composite file '"$COMPOSITE"' isn't an image"
-		echo "or it is broken, or Imagemagick itself just didn't work."
-		echo -e "\nPlease check and correct your composite image and try again."
-		echo -e "\nAborting.\n"
-		exit 1
-	} fi
-} fi
-
-rm tempfile.png
-
-base_colors="red orange yellow lime green aqua cyan skyblue blue violet magenta redviolet"
-
-echo -e -n "\nGenerating filenames based on "$BASE"_base.png"
-if [ ! -z $COMPOSITE ] ; then {
-	echo ","
-	echo -n "using "$COMPOSITE" as an overlay"
-} fi
-
-if [ ! -z $TINT_OVERLAY ] ; then {
-	echo ","
-	echo -n "and tinting the overlay instead of the base texture"
-} fi
-
-echo -e "...\n"
-
-mkdir -p generated-textures
-
-function generate_texture () {
-	name=$1
-	h=$2
-	s=$3
-	v=$4
-	if [ -z $TINT_OVERLAY ]; then {
-		if [ -z $COMPOSITE ]; then {
-			convert $BASE"_base.png" -modulate $v,$s,$h "generated-textures/"$BASE"_"$name".png"
-		} else {
-			convert $BASE"_base.png" -modulate $v,$s,$h $COMPOSITE -composite "generated-textures/"$BASE"_"$name".png"
-		} fi
-	} else {
-		convert $COMPOSITE -modulate $v,$s,$h MIFF:- | composite MIFF:- $BASE"_base.png" "generated-textures/"$BASE"_"$name".png"
-	} fi
-}
-
-hue=0
-for color_name in $base_colors ; do
-	hue2=`echo "scale=10; ("$hue"*200/360)+100" |bc`
-	echo $color_name "("$hue" degrees)"
-	echo "     dark"
-	generate_texture "dark_"$color_name $hue2 100 33
-	echo "     medium"
-	generate_texture "medium_"$color_name $hue2 100 66
-	echo "     full"
-	generate_texture $color_name $hue2 100 100
-	echo "     light"
-	generate_texture "light_"$color_name $hue2 100 150
-	echo "     dark, 50% saturation"
-	generate_texture "dark_"$color_name"_s50" $hue2 50 33
-	echo "     medium, 50% saturation"
-	generate_texture "medium_"$color_name"_s50" $hue2 50 66
-	echo "     full, 50% saturation"
-	generate_texture $color_name"_s50" $hue2 50 100 
-	hue=$((hue+30))
-done
-
-echo "greyscales"
-echo "     black"
-generate_texture black 0 0 15
-echo "     dark grey"
-generate_texture darkgrey 0 0 50
-echo "     medium grey"
-generate_texture grey 0 0 100
-echo "     light grey"
-generate_texture lightgrey 0 0 150
-echo "     white"
-generate_texture white 0 0 190
diff --git a/init.lua b/init.lua
index fc36199..74bb44d 100644
--- a/init.lua
+++ b/init.lua
@@ -29,6 +29,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 --=====================================================================
 
+unifieddyes = {}
+unifieddyes.last_used_dye = {}
+unifieddyes.last_dyed_node = {}
+
+local creative_mode = minetest.settings:get_bool("creative_mode")
+
 -- Boilerplate to support localized strings if intllib mod is installed.
 local S
 if minetest.get_modpath("intllib") then
@@ -37,332 +43,1015 @@ else
 	S = function(s) return s end
 end
 
--- Items/recipes needed to generate the few base colors that are not
--- provided by the standard dyes mod.
+-- helper functions for other mods that use this one
 
--- Lime
+unifieddyes.HUES = {
+	"red",
+	"orange",
+	"yellow",
+	"lime",
+	"green",
+	"aqua",
+	"cyan",
+	"skyblue",
+	"blue",
+	"violet",
+	"magenta",
+	"redviolet"
+}
 
-minetest.register_craftitem(":dye:lime", {
-        description = S("Lime Dye"),
-        inventory_image = "unifieddyes_lime.png",
-	groups = { dye=1, excolor_lime=1, unicolor_lime=1, not_in_creative_inventory=1 }
-})
+-- the names of the various colors here came from http://www.procato.com/rgb+index/
+
+unifieddyes.HUES_EXTENDED = {
+	{ "red",        0xff, 0x00, 0x00 },
+	{ "vermilion",  0xff, 0x40, 0x00 },
+	{ "orange",     0xff, 0x80, 0x00 },
+	{ "amber",      0xff, 0xbf, 0x00 },
+	{ "yellow",     0xff, 0xff, 0x00 },
+	{ "lime",       0xbf, 0xff, 0x00 },
+	{ "chartreuse", 0x80, 0xff, 0x00 },
+	{ "harlequin",  0x40, 0xff, 0x00 },
+	{ "green",      0x00, 0xff, 0x00 },
+	{ "malachite",  0x00, 0xff, 0x40 },
+	{ "spring",     0x00, 0xff, 0x80 },
+	{ "turquoise",  0x00, 0xff, 0xbf },
+	{ "cyan",       0x00, 0xff, 0xff },
+	{ "cerulean",   0x00, 0xbf, 0xff },
+	{ "azure",      0x00, 0x80, 0xff },
+	{ "sapphire",   0x00, 0x40, 0xff },
+	{ "blue",       0x00, 0x00, 0xff },
+	{ "indigo",     0x40, 0x00, 0xff },
+	{ "violet",     0x80, 0x00, 0xff },
+	{ "mulberry",   0xbf, 0x00, 0xff },
+	{ "magenta",    0xff, 0x00, 0xff },
+	{ "fuchsia",    0xff, 0x00, 0xbf },
+	{ "rose",       0xff, 0x00, 0x80 },
+	{ "crimson",    0xff, 0x00, 0x40 }
+}
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:lime 2",
-       recipe = {
-               "dye:yellow",
-               "dye:green",
-		},
-})
+unifieddyes.SATS = {
+	"",
+	"_s50"
+}
 
--- Aqua
+unifieddyes.VALS = {
+	"",
+	"medium_",
+	"dark_"
+}
 
-minetest.register_craftitem(":dye:aqua", {
-        description = S("Aqua Dye"),
-        inventory_image = "unifieddyes_aqua.png",
-	groups = { dye=1, excolor_aqua=1, unicolor_aqua=1, not_in_creative_inventory=1 }
-})
+unifieddyes.VALS_EXTENDED = {
+	"faint_",
+	"pastel_",
+	"light_",
+	"bright_",
+	"",
+	"medium_",
+	"dark_"
+}
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:aqua 2",
-       recipe = {
-               "dye:cyan",
-               "dye:green",
-		},
-})
+unifieddyes.GREYS = {
+	"white",
+	"light_grey",
+	"grey",
+	"dark_grey",
+	"black"
+}
 
--- Sky blue
+local default_dyes = {
+	"black",
+	"blue",
+	"brown",
+	"cyan",
+	"dark_green",
+	"dark_grey",
+	"green",
+	"grey",
+	"magenta",
+	"orange",
+	"pink",
+	"red",
+	"violet",
+	"white",
+	"yellow"
+}
 
-minetest.register_craftitem(":dye:skyblue", {
-        description = S("Sky-blue Dye"),
-        inventory_image = "unifieddyes_skyblue.png",
-	groups = { dye=1, excolor_sky_blue=1, unicolor_sky_blue=1, not_in_creative_inventory=1 }
-})
+-- automatically recolor a placed node to match the last-used dye
+-- should be called in the node's `after_place_node` callback.
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:skyblue 2",
-       recipe = {
-               "dye:cyan",
-               "dye:blue",
-		},
-})
+function unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)
 
--- Red-violet
+	local playername = placer:get_player_name()
+	local stackname = itemstack:get_name()
 
-minetest.register_craftitem(":dye:redviolet", {
-        description = S("Red-violet Dye"),
-        inventory_image = "unifieddyes_redviolet.png",
-	groups = { dye=1, excolor_red_violet=1, unicolor_red_violet=1, not_in_creative_inventory=1 }
-})
+	if unifieddyes.last_dyed_node[playername] ~= stackname then
+		if unifieddyes.last_used_dye[playername] then
+			minetest.chat_send_player(playername, "Switched to \""..stackname.."\" while auto-coloring, color reset to neutral.")
+		end
+		unifieddyes.last_used_dye[playername] = nil
+		unifieddyes.last_dyed_node[playername] = nil
+	end
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:redviolet 2",
-       recipe = {
-               "dye:red",
-               "dye:magenta",
-		},
-})
+	unifieddyes.last_dyed_node[playername] = stackname
 
+	if unifieddyes.last_used_dye[playername] then
+		local lastdye = unifieddyes.last_used_dye[playername]
 
--- Light grey
+		local inv = placer:get_inventory()
+		if (lastdye and lastdye ~= "" and inv:contains_item("main", lastdye.." 1")) or creative_mode then
 
-minetest.register_craftitem(":dye:light_grey", {
-        description = S("Light Grey Dye"),
-        inventory_image = "unifieddyes_lightgrey.png",
-	groups = { dye=1, excolor_lightgrey=1, unicolor_light_grey=1, not_in_creative_inventory=1 }
-})
+			local nodedef = minetest.registered_nodes[stackname]
+			local newname = nodedef.ud_replacement_node or stackname
+			local node = minetest.get_node(pos)
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:light_grey 2",
-       recipe = {
-               "dye:grey",
-               "dye:white",
-		},
-})
+			local palette_type = true -- default to 89-color split, because the others are easier to check for.
+			local oldfdir = node.param2 % 32
 
--- Extra craft for black dye
+			if nodedef.palette == "unifieddyes_palette.png" then
+				palette_type = false
+				oldfdir = 0
+			elseif nodedef.palette == "unifieddyes_palette_colorwallmounted.png" then
+				palette_type = "wallmounted"
+				oldfdir = node.param2 % 8
+			elseif nodedef.palette == "unifieddyes_palette_extended.png" then
+				palette_type = "extended"
+				oldfdir = 0
+			end
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:black 4",
-       recipe = {
-               "default:coal_lump",
-		},
-})
+			local paletteidx, hue = unifieddyes.getpaletteidx(lastdye, palette_type)
+			if palette_type == true then newname = string.gsub(newname, "_grey", "_"..unifieddyes.HUES[hue]) end
 
--- Extra craft for dark grey dye
+			minetest.set_node(pos, { name = newname, param2 = oldfdir + paletteidx })
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:dark_grey 3",
-       recipe = {
-               "dye:black",
-               "dye:black",
-               "dye:white",
-		},
-})
+			local meta = minetest.get_meta(pos)
+			meta:set_string("dye", lastdye)
 
--- Extra craft for light grey dye
+			if not creative_mode then
+				inv:remove_item("main", lastdye.." 1")
+			end
+		else
+			minetest.chat_send_player(playername, "Ran out of "..unifieddyes.last_used_dye[playername]..", resetting to neutral.")
+			unifieddyes.last_used_dye[playername] = nil
+		end
+	end
+end
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:light_grey 3",
-       recipe = {
-               "dye:black",
-               "dye:white",
-               "dye:white",
-		},
-})
+minetest.register_on_leaveplayer(function(player)
+	local playername = player:get_player_name()
+	unifieddyes.last_used_dye[playername] = nil
+	unifieddyes.last_dyed_node[playername] = nil
+end)
 
--- Extra craft for green dye
+-- code borrowed from homedecor
+-- call this function to reset the rotation of a "wallmounted" object on place
 
-minetest.register_craft( {
-       type = "shapeless",
-       output = "dye:green 4",
-       recipe = {
-               "default:cactus",
-		},
-})
+function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
+	local node = minetest.get_node(pos)
+	local yaw = placer:get_look_horizontal()
+	local dir = minetest.yaw_to_dir(yaw) -- -1.5)
+	local pitch = placer:get_look_vertical()
 
--- =================================================================
+	local fdir = minetest.dir_to_wallmounted(dir)
 
--- Generate all of additional variants of hue, saturation, and
--- brightness.
+	if pitch < -(math.pi/8) then
+		fdir = 0
+	elseif pitch > math.pi/8 then
+		fdir = 1
+	end
+	minetest.swap_node(pos, { name = node.name, param2 = fdir })
+end
 
--- "s50" in a file/item name means "saturation: 50%".
--- Brightness levels in the textures are 33% ("dark"), 66% ("medium"),
--- 100% ("full", but not so-named), and 150% ("light").
+-- use this when you have a "wallmounted" node that should never be oriented
+-- to floor or ceiling...
 
-local HUES = {
-	"red",
-	"orange",
-	"yellow",
-	"lime",
-	"green",
-	"aqua",
-	"cyan",
-	"skyblue",
-	"blue",
-	"violet",
-	"magenta",
-	"redviolet"
-}
+function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+	local node = minetest.get_node(pos)
+	local yaw = placer:get_look_horizontal()
+	local dir = minetest.yaw_to_dir(yaw+1.5)
+	local fdir = minetest.dir_to_wallmounted(dir)
+	minetest.swap_node(pos, { name = node.name, param2 = fdir })
+end
 
-local HUES2 = {
-	"Red",
-	"Orange",
-	"Yellow",
-	"Lime",
-	"Green",
-	"Aqua",
-	"Cyan",
-	"Sky-blue",
-	"Blue",
-	"Violet",
-	"Magenta",
-	"Red-violet"
-}
+-- ... and use this one to force that kind of node off of floor/ceiling
+-- orientation after the screwdriver rotates it.
 
+function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2)
+	local new_fdir = new_param2 % 8
+	local color = new_param2 - new_fdir
+	if new_fdir < 2 then
+		new_fdir = 2
+		minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color })
+		return true
+	end
+end
 
-for i = 1, 12 do
+function unifieddyes.select_node(pointed_thing)
+	local pos = pointed_thing.under
+	local node = minetest.get_node_or_nil(pos)
+	local def = node and minetest.registered_nodes[node.name]
 
-	local hue = HUES[i]
-	local hue2 = HUES2[i]
+	if not def or not def.buildable_to then
+		pos = pointed_thing.above
+		node = minetest.get_node_or_nil(pos)
+		def = node and minetest.registered_nodes[node.name]
+	end
+	return def and pos, def
+end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:dark_" .. hue .. "_s50 2",
-        recipe = {
-                "dye:" .. hue,
-                "dye:dark_grey",
-	        },
-	})
+function unifieddyes.is_buildable_to(placer_name, ...)
+	for _, pos in ipairs({...}) do
+		local node = minetest.get_node_or_nil(pos)
+		local def = node and minetest.registered_nodes[node.name]
+		if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then
+			return false
+		end
+	end
+	return true
+end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:dark_" .. hue .. "_s50 4",
-        recipe = {
-                "dye:" .. hue,
-                "dye:black",
-                "dye:black",
-		"dye:white"
-	        },
-	})
+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
+			break
+		end
+	end
 
-	if hue == "green" then
+	if string.find(name, "_light_grey")     then hue = "light_grey"
+	elseif string.find(name, "_lightgrey")  then hue = "light_grey"
+	elseif string.find(name, "_dark_grey")  then hue = "dark_grey"
+	elseif string.find(name, "_darkgrey")   then hue = "dark_grey"
+	elseif string.find(name, "_grey")       then hue = "grey"
+	elseif string.find(name, "_white")      then hue = "white"
+	elseif string.find(name, "_black")      then hue = "black"
+	end
 
-		minetest.register_craft( {
-		type = "shapeless",
-		output = "dye:dark_green 3",
-		recipe = {
-		        "dye:" .. hue,
-		        "dye:black",
-		        "dye:black",
-			},
-		})
+	local sat = ""
+	if string.find(name, "_s50")    then sat = "_s50" end
+
+	local val = ""
+	if string.find(name, "dark_")   then val = "dark_"   end
+	if string.find(name, "medium_") then val = "medium_" end
+	if string.find(name, "light_")  then val = "light_"  end
+
+	return hue, sat, val
+end
+
+-- code partially borrowed from cheapie's plasticbox mod
+
+-- 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
+
+function unifieddyes.getpaletteidx(color, palette_type)
+
+	local origcolor = color
+	local aliases = {
+		["pink"] = "light_red",
+		["brown"] = "medium_orange",
+	}
+
+	local grayscale = {
+		["white"] = 1,
+		["light_grey"] = 2,
+		["grey"] = 3,
+		["dark_grey"] = 4,
+		["black"] = 5,
+	}
+
+	local grayscale_extended = {
+		["white"] = 0,
+		["grey_14"] = 1,
+		["grey_13"] = 2,
+		["grey_12"] = 3,
+		["light_grey"] = 3,
+		["grey_11"] = 4,
+		["grey_10"] = 5,
+		["grey_9"] = 6,
+		["grey_8"] = 7,
+		["grey"] = 7,
+		["grey_7"] = 8,
+		["grey_6"] = 9,
+		["grey_5"] = 10,
+		["grey_4"] = 11,
+		["dark_grey"] = 11,
+		["grey_3"] = 12,
+		["grey_2"] = 13,
+		["grey_1"] = 14,
+		["black"] = 15,
+	}
+
+	local grayscale_wallmounted = {
+		["white"] = 0,
+		["light_grey"] = 1,
+		["grey"] = 2,
+		["dark_grey"] = 3,
+		["black"] = 4,
+	}
+
+	local hues = {
+		["red"] = 1,
+		["orange"] = 2,
+		["yellow"] = 3,
+		["lime"] = 4,
+		["green"] = 5,
+		["aqua"] = 6,
+		["cyan"] = 7,
+		["skyblue"] = 8,
+		["blue"] = 9,
+		["violet"] = 10,
+		["magenta"] = 11,
+		["redviolet"] = 12,
+	}
+
+	local hues_extended = {
+		["red"] = 0,
+		["vermilion"] = 1,
+		["orange"] = 2,
+		["amber"] = 3,
+		["yellow"] = 4,
+		["lime"] = 5,
+		["chartreuse"] = 6,
+		["harlequin"] = 7,
+		["green"] = 8,
+		["malachite"] = 9,
+		["spring"] = 10,
+		["turquoise"] = 11,
+		["cyan"] = 12,
+		["cerulean"] = 13,
+		["azure"] = 14,
+		["sapphire"] = 15,
+		["blue"] = 16,
+		["indigo"] = 17,
+		["violet"] = 18,
+		["mulberry"] = 19,
+		["magenta"] = 20,
+		["fuchsia"] = 21,
+		["rose"] = 22,
+		["crimson"] = 23,
+	}
+
+	local hues_wallmounted = {
+		["red"] = 0,
+		["orange"] = 1,
+		["yellow"] = 2,
+		["green"] = 3,
+		["cyan"] = 4,
+		["blue"] = 5,
+		["violet"] = 6,
+		["magenta"] = 7
+	}
+
+	local shades = {
+		[""] = 1,
+		["s50"] = 2,
+		["light"] = 3,
+		["medium"] = 4,
+		["mediums50"] = 5,
+		["dark"] = 6,
+		["darks50"] = 7,
+	}
+
+	local shades_extended = {
+		["faint"] = 0,
+		["pastel"] = 1,
+		["light"] = 2,
+		["bright"] = 3,
+		[""] = 4,
+		["s50"] = 5,
+		["medium"] = 6,
+		["mediums50"] = 7,
+		["dark"] = 8,
+		["darks50"] = 9
+	}
+
+	local shades_wallmounted = {
+		[""] = 1,
+		["medium"] = 2,
+		["dark"] = 3
+	}
+
+	if string.sub(color,1,4) == "dye:" then
+		color = string.sub(color,5,-1)
+	elseif string.sub(color,1,12) == "unifieddyes:" then
+		color = string.sub(color,13,-1)
 	else
-		minetest.register_craft( {
-		type = "shapeless",
-		output = "unifieddyes:dark_" .. hue .. " 3",
-		recipe = {
-		        "dye:" .. hue,
-		        "dye:black",
-		        "dye:black",
-			},
-		})
+		return
 	end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:medium_" .. hue .. "_s50 2",
-        recipe = {
-                "dye:" .. hue,
-                "dye:grey",
-	        },
-	})
+	if palette_type == "wallmounted" then
+		if grayscale_wallmounted[color] then
+			return (grayscale_wallmounted[color] * 8), 0
+		end
+	elseif palette_type == true then
+		if grayscale[color] then
+			return (grayscale[color] * 32), 0
+		end
+	elseif palette_type == "extended" then
+		if grayscale_extended[color] then
+			return grayscale_extended[color]+240, 0
+		end
+	else
+		if grayscale[color] then
+			return grayscale[color], 0
+		end
+	end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:medium_" .. hue .. "_s50 3",
-        recipe = {
-                "dye:" .. hue,
-		"dye:black",
-                "dye:white",
-	        },
-	})
+	local shade = "" -- assume full
+	if string.sub(color,1,6) == "faint_" then
+		shade = "faint"
+		color = string.sub(color,7,-1)
+	elseif string.sub(color,1,7) == "pastel_" then
+		shade = "pastel"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,6) == "light_" then
+		shade = "light"
+		color = string.sub(color,7,-1)
+	elseif string.sub(color,1,7) == "bright_" then
+		shade = "bright"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,7) == "medium_" then
+		shade = "medium"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,5) == "dark_" then
+		shade = "dark"
+		color = string.sub(color,6,-1)
+	end
+	if string.sub(color,-4,-1) == "_s50" then
+		shade = shade.."s50"
+		color = string.sub(color,1,-5)
+	end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:medium_" .. hue .. " 2",
-        recipe = {
-                "dye:" .. hue,
-                "dye:black",
-	        },
-	})
+	if palette_type == "wallmounted" then
+		if color == "brown" then return 48,1
+		elseif color == "pink" then return 56,7
+		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
+	else
+		if color == "brown" then
+			color = "orange"
+			shade = "medium"
+		elseif color == "pink" then
+			color = "red"
+			shade = "light"
+		end
+		if palette_type == true then -- it's colorfacedir
+			if hues[color] and shades[shade] then
+				return (shades[shade] * 32), hues[color]
+			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 89-color palette
+
+			-- If using this palette, translate new color names back to old.
+
+			if shade == "" then
+				if color == "spring" then
+					color = "aqua"
+				elseif color == "azure" then
+					color = "skyblue"
+				elseif color == "rose" then
+					color = "redviolet"
+				end
+			end
+			if hues[color] and shades[shade] then
+				return (hues[color] * 8 + shades[shade]), hues[color]
+			end
+		end
+	end
+end
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:" .. hue .. "_s50 2",
-        recipe = {
-                "dye:" .. hue,
-                "dye:grey",
-                "dye:white",
-	        },
-	})
+-- 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:
 
-	minetest.register_craft( {
-        type = "shapeless",
-        output = "unifieddyes:" .. hue .. "_s50 4",
-        recipe = {
-                "dye:" .. hue,
-                "dye:white",
-                "dye:white",
-                "dye:black",
-	        },
-	})
+function unifieddyes.on_construct(pos)
+	local meta = minetest.get_meta(pos)
+	meta:set_string("palette", "ext")
+end
 
-	if hue ~= "red" then
-		minetest.register_craft( {
-		type = "shapeless",
-		output = "unifieddyes:light_" .. hue .. " 2",
-		recipe = {
-			"dye:" .. hue,
-			"dye:white",
-			},
-		})
+-- call this in your node's after_dig_node to get the last-used dye back.
+
+function unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger)
+	local prevdye
+
+	if oldmetadata and oldmetadata.fields then
+		prevdye = oldmetadata.fields.dye
+	end
+
+	local inv = digger:get_inventory()
+
+	if prevdye and not (inv:contains_item("main", prevdye) and creative_mode) and minetest.registered_items[prevdye] then
+		if inv:room_for_item("main", prevdye) then
+			inv:add_item("main", prevdye)
+		else
+			minetest.add_item(pos, prevdye)
+		end
 	end
+end
+
+function unifieddyes.on_use(itemstack, player, pointed_thing)
+	local stackname = itemstack:get_name()
+	local playername = player:get_player_name()
+
+	if pointed_thing and pointed_thing.type == "node" then
+		if minetest.is_protected(unifieddyes.select_node(pointed_thing), playername)
+		  and not minetest.check_player_privs(playername, "protection_bypass") then
+			minetest.chat_send_player(playername, "Sorry, someone else owns that spot.")
+			return
+		end
+	end
+
+	if pointed_thing and pointed_thing.type == "object" then
+		pointed_thing.ref:punch(player, 0, itemstack:get_tool_capabilities())
+		return player:get_wielded_item() -- punch may modified the wielded item, load the new and return it
+	end
+
+	if not (pointed_thing and pointed_thing.type == "node") then return end  -- if "using" the dye on nothing at all (e.g. air)
+
+	local pos = minetest.get_pointed_thing_position(pointed_thing)
+	local node = minetest.get_node(pos)
+
+	local nodedef = minetest.registered_nodes[node.name]
+
+	if not nodedef then return end -- target was an unknown node, just bail out
+
+	-- if the node has an on_punch defined, bail out and call that instead, unless "sneak" is pressed.
+	if not player:get_player_control().sneak then
+		local onpunch = nodedef.on_punch(pos, node, player, pointed_thing)
+		if onpunch then
+			return onpunch
+		end
+	end
+
+	if player:get_player_control().sneak then
+		if unifieddyes.last_used_dye[playername] then
+			minetest.chat_send_player(playername, "Shift-punched a node, switching back to neutral color." )
+		end
+		unifieddyes.last_used_dye[playername] = nil
+		return
+	end
+
+	-- if the target is unknown, has no groups defined, or isn't UD-colorable, just bail out
+	if not (nodedef and nodedef.groups and nodedef.groups.ud_param2_colorable) then
+		minetest.chat_send_player(playername, "That node can't be colored.")
+		return
+	end
+
+	local newnode = nodedef.ud_replacement_node
+	local palette_type
+
+	if nodedef.palette == "unifieddyes_palette_extended.png" then
+		palette_type = "extended"
+	elseif nodedef.palette == "unifieddyes_palette.png" then
+		palette_type = false
+	elseif nodedef.paramtype2 == "colorfacedir" then
+		palette_type = true
+	elseif nodedef.paramtype2 == "colorwallmounted" then
+		palette_type = "wallmounted"
+	end
+
+	if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {protection_bypass=true}) then
+		minetest.record_protection_violation(pos, playername)
+		return
+	end
+
+	local pos2 = unifieddyes.select_node(pointed_thing)
+	local paletteidx, hue = unifieddyes.getpaletteidx(stackname, palette_type)
+
+	if paletteidx then
+
+		if unifieddyes.last_used_dye[playername] ~= stackname then
+			minetest.chat_send_player(playername, "Color "..stackname.." selected, auto-coloring activated." )
+			unifieddyes.last_used_dye[playername] = stackname
+		end
+
+		local meta = minetest.get_meta(pos)
+		local prevdye = meta:get_string("dye")
+		local inv = player:get_inventory()
+
+		if not (inv:contains_item("main", prevdye) and creative_mode) and minetest.registered_items[prevdye] then
+			if inv:room_for_item("main", prevdye) then
+				inv:add_item("main", prevdye)
+			else
+				minetest.add_item(pos, prevdye)
+			end
+		end
+
+		meta:set_string("dye", stackname)
+
+		if prevdye == stackname then
+			local a,b = string.find(stackname, ":")
+			minetest.chat_send_player(playername, "That node is already "..string.sub(stackname, a + 1).."." )
+			return
+		elseif not creative_mode then
+			itemstack:take_item()
+		end
+
+		node.param2 = paletteidx
+
+		local oldpaletteidx, oldhuenum = unifieddyes.getpaletteidx(prevdye, palette_type)
+		local oldnode = minetest.get_node(pos)
+
+		local oldhue = nil
+		for _, i in ipairs(unifieddyes.HUES) do
+			if string.find(oldnode.name, "_"..i) and not
+				( string.find(oldnode.name, "_redviolet") and i == "red" ) then
+				oldhue = i
+				break
+			end
+		end
+
+		if newnode then -- this path is used when the calling mod want to supply a replacement node
+			if palette_type == "wallmounted" then
+				node.param2 = paletteidx + (minetest.get_node(pos).param2 % 8)
+			elseif palette_type == true then  -- it's colorfacedir
+				if oldhue ~=0 then -- it's colored, not grey
+					if oldhue ~= nil then -- it's been painted before
+						if hue ~= 0 then -- the player's wielding a colored dye
+							newnode = string.gsub(newnode, "_"..oldhue, "_"..unifieddyes.HUES[hue])
+						else -- it's a greyscale dye
+							newnode = string.gsub(newnode, "_"..oldhue, "_grey")
+						end
+					else -- it's never had a color at all
+						if hue ~= 0 then -- and if the wield is greyscale, don't change the node name
+							newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue])
+						end
+					end
+				else
+					if hue ~= 0 then  -- greyscale dye on greyscale node = no hue change
+						newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue])
+					end
+				end
+				node.param2 = paletteidx + (minetest.get_node(pos).param2 % 32)
+			else -- it's the 89-color palette, or the extended palette
+				node.param2 = paletteidx
+			end
+			node.name = newnode
+			minetest.swap_node(pos, node)
+			if palette_type == "extended" then
+				meta:set_string("palette", "ext")
+			end
+			if not creative_mode then
+				return itemstack
+			end
+		else -- this path is used when you're just painting an existing node, rather than replacing one.
+			newnode = oldnode  -- note that here, newnode/oldnode are a full node, not just the name.
+			if palette_type == "wallmounted" then
+				newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 8)
+			elseif palette_type == true then -- it's colorfacedir
+				if oldhue then
+					if hue ~= 0 then
+						newnode.name = string.gsub(newnode.name, "_"..oldhue, "_"..unifieddyes.HUES[hue])
+					else
+						newnode.name = string.gsub(newnode.name, "_"..oldhue, "_grey")
+					end
+				elseif string.find(minetest.get_node(pos).name, "_grey") and hue ~= 0 then
+					newnode.name = string.gsub(newnode.name, "_grey", "_"..unifieddyes.HUES[hue])
+				end
+				newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 32)
+			else -- it's the 89-color palette, or the extended palette
+				newnode.param2 = paletteidx
+			end
+			minetest.swap_node(pos, newnode)
+			if palette_type == "extended" then
+				meta:set_string("palette", "ext")
+			end
+			if not creative_mode then
+				return itemstack
+			end
+		end
+	else
+		local a,b = string.find(stackname, ":")
+		if a then
+			minetest.chat_send_player(playername, "That node can't be colored "..string.sub(stackname, a + 1).."." )
+		end
+	end
+end
+
+-- re-define default dyes slightly, to add on_use
 
-	minetest.register_craftitem("unifieddyes:dark_" .. hue .. "_s50", {
-		description = S("Dark " .. hue2 .. " Dye (low saturation)"),
-		inventory_image = "unifieddyes_dark_" .. hue .. "_s50.png",
-		groups = { dye=1, ["unicolor_dark_"..hue.."_s50"]=1, not_in_creative_inventory=1 }
+for _, color in ipairs(default_dyes) do
+	minetest.override_item("dye:"..color, {
+		on_use = unifieddyes.on_use
 	})
+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
+	local hue = h[1]
+	local r = h[2]
+	local g = h[3]
+	local b = h[4]
+
+	for v = 0, 6 do
+		local val = unifieddyes.VALS_EXTENDED[v+1]
+
+		local factor = 40
+		if v > 3 then factor = 75 end
+
+		local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
+		local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
+		local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
+
+		-- full-sat color
+
+		local desc = hue:gsub("%a", string.upper, 1).." Dye"
+
+		if val ~= "" then
+			desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc
+		end
+
+		local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
+		if minetest.registered_items["dye:"..val..hue] then
+			minetest.override_item("dye:"..val..hue, {
+				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+				on_use = unifieddyes.on_use
+			})
+		else
+			if (val..hue) ~= "medium_orange"
+			  and (val..hue) ~= "light_red" then
+				minetest.register_craftitem(":dye:"..val..hue, {
+					description = S(desc),
+					inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+					groups = { dye=1, not_in_creative_inventory=1 },
+					on_use = unifieddyes.on_use
+				})
+			end
+		end
+		minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
+
+		if v > 3 then -- also register the low-sat version
+
+			local pr = 0.299
+			local pg = 0.587
+			local pb = 0.114
+
+			local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
+			local r3 = math.floor(p+(r2-p)*0.5)
+			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)
+
+			minetest.register_craftitem(":dye:"..val..hue.."_s50", {
+				description = S(desc.." (low saturation)"),
+				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+				groups = { dye=1, not_in_creative_inventory=1 },
+				on_use = unifieddyes.on_use
+			})
+			minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
+		end
+	end
+end
+
+-- register the greyscales too :P
+
+for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes
+
+	if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately.
 
-	if hue ~= "green" then
-		minetest.register_craftitem("unifieddyes:dark_" .. hue, {
-			description = S("Dark " .. hue2 .. " Dye"),
-			inventory_image = "unifieddyes_dark_" .. hue .. ".png",
-			groups = { dye=1, ["unicolor_dark_"..hue]=1, not_in_creative_inventory=1 }
+		local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
+		local name = "grey_"..y
+		local desc = "Grey Dye #"..y
+
+		minetest.register_craftitem(":dye:"..name, {
+			description = S(desc),
+			inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200",
+			groups = { dye=1, not_in_creative_inventory=1 },
+			on_use = unifieddyes.on_use
 		})
+		minetest.register_alias("unifieddyes:"..name, "dye:"..name)
 	end
+end
 
-	minetest.register_craftitem("unifieddyes:medium_" .. hue .. "_s50", {
-		description = S("Medium " .. hue2 .. " Dye (low saturation)"),
-		inventory_image = "unifieddyes_medium_" .. hue .. "_s50.png",
-		groups = { dye=1, ["unicolor_medium_"..hue.."_s50"]=1, not_in_creative_inventory=1 }
-	})
+minetest.override_item("dye:grey", {
+	inventory_image = "unifieddyes_dye.png^[colorize:#888888:200",
+	on_use = unifieddyes.on_use
+})
 
-	minetest.register_craftitem("unifieddyes:medium_" .. hue, {
-		description = S("Medium " .. hue2 .. " Dye"),
-		inventory_image = "unifieddyes_medium_" .. hue .. ".png",
-		groups = { dye=1, ["unicolor_medium_"..hue]=1, not_in_creative_inventory=1 }
-	})
+minetest.override_item("dye:dark_grey", {
+	inventory_image = "unifieddyes_dye.png^[colorize:#444444:200",
+	on_use = unifieddyes.on_use
+})
+
+minetest.register_craftitem(":dye:light_grey", {
+	description = S("Light grey Dye"),
+	inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200",
+	groups = { dye=1, not_in_creative_inventory=1 },
+	on_use = unifieddyes.on_use
+})
+
+unifieddyes.base_color_crafts = {
+	{ "red",		"flowers:rose",				nil,				nil,			nil,			nil,		4 },
+	{ "vermilion",	"dye:red",					"dye:orange",		nil,			nil,			nil,		3 },
+	{ "orange",		"flowers:tulip",			nil,				nil,			nil,			nil,		4 },
+	{ "orange",		"dye:red",					"dye:yellow",		nil,			nil,			nil,		2 },
+	{ "amber",		"dye:orange",				"dye:yellow",		nil,			nil,			nil,		2 },
+	{ "yellow",		"flowers:dandelion_yellow",	nil,				nil,			nil,			nil,		4 },
+	{ "lime",		"dye:yellow",				"dye:chartreuse",	nil,			nil,			nil,		2 },
+	{ "lime",		"dye:yellow",				"dye:yellow",		"dye:green",	nil,			nil,		3 },
+	{ "chartreuse",	"dye:yellow",				"dye:green",		nil,			nil,			nil,		2 },
+	{ "harlequin",	"dye:chartreuse",			"dye:green",		nil,			nil,			nil,		2 },
+	{ "harlequin",	"dye:yellow",				"dye:green",		"dye:green",	nil,			nil,		3 },
+	{ "green", 		"default:cactus",			nil,				nil,			nil,			nil,		4 },
+	{ "green", 		"dye:yellow",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "malachite",	"dye:green",				"dye:spring",		nil,			nil,			nil,		2 },
+	{ "malachite",	"dye:green",				"dye:green",		"dye:cyan",		nil,			nil,		3 },
+	{ "malachite",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		nil,		4 },
+	{ "spring",		"dye:green",				"dye:cyan",			nil,			nil,			nil,		2 },
+	{ "spring",		"dye:green",				"dye:green",		"dye:blue",		nil,			nil,		3 },
+	{ "turquoise",	"dye:spring",				"dye:cyan",			nil,			nil,			nil,		2 },
+	{ "turquoise",	"dye:green",				"dye:cyan",			"dye:cyan",		nil,			nil,		3 },
+	{ "turquoise",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		"dye:blue",	5 },
+	{ "cyan",		"dye:green",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "cerulean",	"dye:cyan",					"dye:azure",		nil,			nil,			nil,		2 },
+	{ "cerulean",	"dye:cyan",					"dye:cyan",			"dye:blue",		nil,			nil,		3 },
+	{ "cerulean",	"dye:green",				"dye:green",		"dye:blue",		"dye:blue",		"dye:blue",	5 },
+	{ "azure",		"dye:cyan",					"dye:blue",			nil,			nil,			nil,		2 },
+	{ "azure",		"dye:green",				"dye:blue",			"dye:blue",		nil,			nil,		3 },
+	{ "sapphire",	"dye:azure",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "sapphire",	"dye:cyan",					"dye:blue",			"dye:blue",		nil,			nil,		3 },
+	{ "sapphire",	"dye:green",				"dye:blue",			"dye:blue",		"dye:blue",		nil,		4 },
+	{ "blue",		"flowers:geranium",			nil,				nil,			nil,			nil,		4 },
+	{ "indigo",		"dye:blue",					"dye:violet",		nil,			nil,			nil,		2 },
+	{ "violet",		"flowers:viola",			nil,				nil,			nil,			nil,		4 },
+	{ "violet",		"dye:blue",					"dye:magenta",		nil,			nil,			nil,		2 },
+	{ "mulberry",	"dye:violet",				"dye:magenta",		nil,			nil,			nil,		2 },
+	{ "mulberry",	"dye:violet",				"dye:blue",			"dye:red",		nil,			nil,		3 },
+	{ "magenta",	"dye:blue",					"dye:red",			nil,			nil,			nil,		2 },
+	{ "fuchsia",	"dye:magenta",				"dye:rose",			nil,			nil,			nil,		2 },
+	{ "fuchsia",	"dye:blue",					"dye:red",			"dye:rose",		nil,			nil,		3 },
+	{ "fuchsia",	"dye:red",					"dye:violet",		nil,			nil,			nil,		2 },
+	{ "rose",		"dye:magenta",				"dye:red",			nil,			nil,			nil,		2 },
+	{ "rose",		"dye:red",					"dye:red",			"dye:blue",		nil,			nil,		3 },
+	{ "crimson",	"dye:rose",					"dye:red",			nil,			nil,			nil,		2 },
+	{ "crimson",	"dye:magenta",				"dye:red",			"dye:red",		nil,			nil,		3 },
+	{ "crimson",	"dye:red",					"dye:red",			"dye:red",		"dye:blue",		nil,		4 },
+
+	{ "black",		"default:coal_lump",		nil,				nil,			nil,			nil,		4 },
+	{ "white",		"flowers:dandelion_white",	nil,				nil,			nil,			nil,		4 },
+}
+
+unifieddyes.shade_crafts = {
+	{ "faint_",		"",			"dye:white",		"dye:white",	"dye:white",	4 },
+	{ "pastel_",	"",			"dye:white",		"dye:white",	nil,			3 },
+	{ "light_",		"",			"dye:white",		nil,			nil,			2 },
+	{ "bright_",	"",			"color",			"dye:white",	nil,			3 },
+	{ "",			"_s50",		"dye:light_grey",	nil,			nil,			2 },
+	{ "",			"_s50",		"dye:black",		"dye:white",	"dye:white",	3 },
+	{ "medium_",	"",			"dye:black",		nil,			nil,			2 },
+	{ "medium_",	"_s50",		"dye:grey",			nil,			nil,			2 },
+	{ "medium_",	"_s50",		"dye:black",		"dye:white",	nil,			3 },
+	{ "dark_",		"",			"dye:black",		"dye:black",	nil,			3 },
+	{ "dark_",		"_s50",		"dye:dark_grey",	nil,			nil,			2 },
+	{ "dark_",		"_s50",		"dye:black",		"dye:black",	"dye:white",	4 },
+}
 
-	minetest.register_craftitem("unifieddyes:" .. hue .. "_s50", {
-		description = S(hue2 .. " Dye (low saturation)"),
-		inventory_image = "unifieddyes_" .. hue .. "_s50.png",
-		groups = { dye=1, ["unicolor_"..hue.."_s50"]=1, not_in_creative_inventory=1 }
+for _,i in ipairs(unifieddyes.base_color_crafts) do
+	local color = i[1]
+	local yield = i[7]
+
+	minetest.register_craft( {
+		type = "shapeless",
+		output = "dye:"..color.." "..yield,
+		recipe = {
+			i[2],
+			i[3],
+			i[4],
+			i[5],
+			i[6],
+		},
 	})
 
-	if hue ~= "red" then
-		minetest.register_craftitem("unifieddyes:light_" .. hue, {
-			description = S("Light " .. hue2 .. " Dye"),
-			inventory_image = "unifieddyes_light_" .. hue .. ".png",
-			groups = { dye=1, ["unicolor_light_"..hue]=1, not_in_creative_inventory=1 }
-		})
+	for _,j in ipairs(unifieddyes.shade_crafts) do
+		local firstdye = j[3]
+		if firstdye == "color" then firstdye = "dye:"..color end
+
+		-- ignore black, white, anything containing the word "grey"
+
+		if color ~= "black" and color ~= "white" and not string.find(color, "grey") then
+
+			minetest.register_craft( {
+				type = "shapeless",
+				output = "dye:"..j[1]..color..j[2].." "..yield,
+				recipe = {
+					"dye:"..color,
+					firstdye,
+					j[4],
+					j[5]
+				},
+			})
+		end
 	end
-	minetest.register_alias("unifieddyes:"..hue, "dye:"..hue)
-	minetest.register_alias("unifieddyes:pigment_"..hue, "dye:"..hue)
 end
 
-minetest.register_alias("unifieddyes:light_red", "dye:pink")
-minetest.register_alias("unifieddyes:dark_green", "dye:dark_green")
+-- greys
+
+unifieddyes.greymixes = {
+	{ 1,	"dye:black",			"dye:black",		"dye:black",		"dye:dark_grey",	4 },
+	{ 2,	"dye:black",			"dye:black",		"dye:dark_grey",	nil,				3 },
+	{ 3,	"dye:black",			"dye:dark_grey",	nil,				nil,				2 },
+	{ 4,	"dye:white",			"dye:black",		"dye:black",		nil,				3 },
+	{ 5,	"dye:dark_grey",		"dye:dark_grey",	"dye:grey",			nil,				3 },
+	{ 6,	"dye:dark_grey",		"dye:grey",			nil,				nil,				2 },
+	{ 7,	"dye:dark_grey",		"dye:grey",			"dye:grey",			nil,				3 },
+	{ 8,	"dye:white",			"dye:black",		nil,				nil,				2 },
+	{ 9,	"dye:grey", 			"dye:grey",			"dye:light_grey",	nil,				3 },
+	{ 10,	"dye:grey",				"dye:light_grey",	"dye:light_grey",	nil,				3 },
+	{ 11,	"dye:white",			"dye:white",		"dye:black",		nil,				3 },
+	{ 12,	"dye:light_grey",		"dye:light_grey",	"dye:white",		nil,				3 },
+	{ 13,	"dye:light_grey",		"dye:white",		nil,				nil,				2 },
+	{ 14,	"dye:white", 			"dye:white",		"dye:light_grey",	nil,				3 },
+}
+
+for _, i in ipairs(unifieddyes.greymixes) do
+	local shade = i[1]
+	local dye1 = i[2]
+	local dye2 = i[3]
+	local dye3 = i[4]
+	local dye4 = i[5]
+	local yield = i[6]
+	local color = "grey_"..shade
+	if shade == 4 then
+		color = "dark_grey"
+	elseif shade == 8 then
+		color = "grey"
+	elseif shade == 11 then
+		color = "light_grey"
+	end
+
+	minetest.register_craft( {
+		type = "shapeless",
+		output = "dye:"..color.." "..yield,
+		recipe = {
+			dye1,
+			dye2,
+			dye3,
+			dye4,
+		},
+	})
+end
+
+-- we can't make dark orange anymore because brown/medium orange conflicts
+
+minetest.register_craft( {
+	type = "shapeless",
+	output = "dye:dark_orange",
+	recipe = {
+		"dye:brown",
+		"dye:brown"
+	},
+})
+
+minetest.register_alias("dye:light_red",  "dye:pink")
+minetest.register_alias("dye:medium_orange", "dye:brown")
+
+minetest.register_alias("unifieddyes:black",      "dye:black")
+minetest.register_alias("unifieddyes:dark_grey",  "dye:dark_grey")
+minetest.register_alias("unifieddyes:light_grey", "dye:light_grey")
+minetest.register_alias("unifieddyes:white",      "dye:white")
+
+minetest.register_alias("unifieddyes:grey_0",     "dye:black")
+minetest.register_alias("unifieddyes:grey_4",     "dye:dark_grey")
+minetest.register_alias("unifieddyes:grey_8",     "dye:grey")
+minetest.register_alias("unifieddyes:grey_11",    "dye:light_grey")
+minetest.register_alias("unifieddyes:grey_15",    "dye:white")
 
 minetest.register_alias("unifieddyes:white_paint", "dye:white")
 minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white")
@@ -371,5 +1060,13 @@ minetest.register_alias("unifieddyes:grey_paint", "dye:grey")
 minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey")
 minetest.register_alias("unifieddyes:carbon_black", "dye:black")
 
+-- aqua -> spring, skyblue -> azure, and redviolet -> rose aliases
+-- note that technically, lime should be aliased, but can't be (there IS
+-- lime in the new color table, it's just shifted up a bit)
+
+minetest.register_alias("unifieddyes:aqua", "unifieddyes:spring")
+minetest.register_alias("unifieddyes:skyblue", "unifieddyes:azure")
+minetest.register_alias("unifieddyes:redviolet", "unifieddyes:rose")
+
 print(S("[UnifiedDyes] Loaded!"))
 
diff --git a/listcolors.sh b/listcolors.sh
deleted file mode 100644
index 53e1806..0000000
--- a/listcolors.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-
-# This program lists out the RGB triads for the colors used in each of the 89
-# dyes found in the Unified Dyes mod.
-
-# Copyright (C) 2012-2013, Vanessa Ezekowitz
-# Email: vanessaezekowitz at gmail.com
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-pushd . >/dev/null
-
-cd textures
-
-echo -e "\n\nFull-saturation colors:"
-echo -e "-----------------------\n"
-
-for i in `ls *dark*.png|grep -v _s50|grep -v paint|grep -v black` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-for i in `ls *medium*.png|grep -v _s50|grep -v paint|grep -v black` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-for i in `ls *.png|grep -v medium |grep -v dark|grep -v _s50|grep -v paint|grep -v black|grep -v titanium` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-
-echo -e "\nLow-saturation colors:"
-echo -e "----------------------\n"
-
-for i in `ls *dark*_s50.png|grep -v paint|grep -v black` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-for i in `ls *medium*_s50.png|grep -v paint|grep -v black` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-for i in `ls *_s50.png|grep -v dark|grep -v medium|grep -v paint|grep -v black` ; do
-	rgb=`convert $i -crop 1x1+8+11 -depth 8 txt: |grep "0,0: (" |cut -f 2- -d "(" |cut -f 1-3 -d ","`
-	color=`basename $i .png | sed 's/_/ /g; s/unifieddyes //; s/s50/50% saturation/'`
-	printf "%-32s %-12s %s\n" "$color" "$rgb" "$i"
-done |sort
-
-echo -e "\nGreyscale:"
-echo -e "----------\n"
-
-printf "%-32s %-12s %s\n" "black" "  0,  0,  0" "unifieddyes_black.png"
-printf "%-32s %-12s %s\n" "dark grey" " 64, 64, 64" "unifieddyes_darkgrey_paint.png"
-printf "%-32s %-12s %s\n" "medium grey" "128,128,128" "unifieddyes_grey_paint.png"
-printf "%-32s %-12s %s\n" "light grey" "192,192,192" "unifieddyes_lightgrey_paint.png"
-printf "%-32s %-12s %s\n" "white" "255,255,255" "unifieddyes_white_paint.png"
-
-popd >/dev/null
diff --git a/locale/fr.txt b/locale/fr.txt
new file mode 100644
index 0000000..f8e48e2
--- /dev/null
+++ b/locale/fr.txt
@@ -0,0 +1,87 @@
+# Template
+
+Lime Dye = Teinture citron-vert
+Aqua Dye = Teinture aqua
+Sky-blue Dye = Teinture bleu ciel
+Red-violet Dye = Teinture rouge-violet
+Light Grey Dye = Teinture gris clair
+
+Dark Red Dye (low saturation) = Teinture rouge foncé (basse saturation)
+Dark Orange Dye (low saturation) = Teinture orange foncé (basse saturation)
+Dark Yellow Dye (low saturation) = Teinture jaune foncé (basse saturation)
+Dark Lime Dye (low saturation) = Teinture citron-vert foncé (basse saturation)
+Dark Green Dye (low saturation) = Teinture vert foncé (basse saturation)
+Dark Aqua Dye (low saturation) = Teinture aqua foncé (basse saturation)
+Dark Cyan Dye (low saturation) = Teinture cyan foncé (basse saturation)
+Dark Sky-blue Dye (low saturation) = Teinture bleu ciel foncé (basse saturation)
+Dark Blue Dye (low saturation) = Teinture bleu foncé (basse saturation)
+Dark Violet Dye (low saturation) = Teinture violet foncé (basse saturation)
+Dark Magenta Dye (low saturation) = Teinture magenta foncé (basse saturation)
+Dark Red-violet Dye (low saturation) = Teinture rouge-violet foncé (basse saturation)
+
+Dark Red Dye = Teinture rouge foncé
+Dark Orange Dye = Teinture orange foncé
+Dark Yellow Dye = Teinture jaune foncé
+Dark Lime Dye = Teinture citron-vert foncé
+Dark Green Dye = Teinture vert foncé
+Dark Aqua Dye = Teinture aqua foncé
+Dark Cyan Dye = Teinture cyan foncé
+Dark Sky-blue Dye = Teinture bleu ciel foncé
+Dark Blue Dye = Teinture bleu foncé
+Dark Violet Dye = Teinture violet foncé
+Dark Magenta Dye = Teinture magenta foncé
+Dark Red-violet Dye = Teinture rouge-violet foncé
+
+Medium Red Dye (low saturation) = Teinture rouge moyen (basse saturation)
+Medium Orange Dye (low saturation) = Teinture orange moyen (basse saturation)
+Medium Yellow Dye (low saturation) = Teinture jaune moyen (basse saturation)
+Medium Lime Dye (low saturation) = Teinture citron-vert moyen (basse saturation)
+Medium Green Dye (low saturation) = Teinture vert moyen (basse saturation)
+Medium Aqua Dye (low saturation) = Teinture aqua moyen (basse saturation)
+Medium Cyan Dye (low saturation) = Teinture cyan moyen (basse saturation)
+Medium Sky-blue Dye (low saturation) = Teinture bleu ciel moyen (basse saturation)
+Medium Blue Dye (low saturation) = Teinture bleu moyen (basse saturation)
+Medium Violet Dye (low saturation) = Teinture violet moyen (basse saturation)
+Medium Magenta Dye (low saturation) = Teinture magenta moyen (basse saturation)
+Medium Red-violet Dye (low saturation) = Teinture rouge-violet moyen (basse saturation)
+
+Medium Red Dye = Teinture rouge moyen
+Medium Orange Dye = Teinture orange moyen
+Medium Yellow Dye = Teinture jaune moyen
+Medium Lime Dye = Teinture citron-vert moyen
+Medium Green Dye = Teinture vert moyen
+Medium Aqua Dye = Teinture aqua moyen
+Medium Cyan Dye = Teinture cyan moyen
+Medium Sky-blue = Teinture bleu ciel moyen
+Medium Blue Dye = Teinture bleu moyen
+Medium Violet Dye = Teinture violet moyen
+Medium Magenta Dye = Teinture magenta moyen
+Medium Red-violet Dye = Teinture rouge-violet moyen
+
+Red Dye (low saturation) = Teinture rouge (basse saturation)
+Orange Dye (low saturation) = Teinture orange (basse saturation)
+Yellow Dye (low saturation) = Teinture jaune (basse saturation)
+Lime Dye (low saturation) = Teinture citron-vert (basse saturation)
+Green Dye (low saturation) = Teinture vert (basse saturation)
+Aqua Dye (low saturation) = Teinture aqua (basse saturation)
+Cyan Dye (low saturation) = Teinture cyan (basse saturation)
+Sky-blue Dye (low saturation) = Teinture bleu ciel (basse saturation)
+Blue Dye (low saturation) = Teinture bleu (basse saturation)
+Violet Dye (low saturation) = Teinture violet (basse saturation)
+Magenta Dye (low saturation) = Teinture magenta (basse saturation)
+Red-violet Dye (low saturation) = Teinture rouge-violet (basse saturation)
+
+Red Dye = Teinture rouge
+Orange Dye = Teinture orange
+Yellow Dye = Teinture jaune
+Lime Dye = Teinture citron-vert
+Green Dye = Teinture vert
+Aqua Dye = Teinture aqua
+Cyan Dye = Teinture cyan
+Sky-blue Dye = Teinture bleu ciel
+Blue Dye = Teinture bleu
+Violet Dye = Teinture violet
+Magenta Dye = Teinture magenta
+Red-violet Dye = Teinture rouge-violet
+
+[UnifiedDyes] Loaded! = [UnifiedDyes] chargé !
diff --git a/locale/pt.txt b/locale/pt.txt
new file mode 100644
index 0000000..def3571
--- /dev/null
+++ b/locale/pt.txt
@@ -0,0 +1,85 @@
+Lime Dye = Corante Lima
+Aqua Dye = Corante Água
+Sky-blue Dye = Corante Azul-Céu
+Red-violet Dye = Corante Vermelho-Violeta
+Light Grey Dye = Corante Cinza Claro
+
+Dark Red Dye (low saturation) = Corante Vermelho Escuro (baixa saturação)
+Dark Orange Dye (low saturation) = Corante Laranja Escuro (baixa saturação)
+Dark Yellow Dye (low saturation) = Corante Amarelo Escuro (baixa saturação)
+Dark Lime Dye (low saturation) = Corante Lima Escuro (baixa saturação)
+Dark Green Dye (low saturation) = Corante Verde Escuro (baixa saturação)
+Dark Aqua Dye (low saturation) = Corante Água Escuro (baixa saturação)
+Dark Cyan Dye (low saturation) = Corante Ciano Escuro (baixa saturação)
+Dark Sky-blue Dye (low saturation) = Corante Azul-Céu Escuro (baixa saturação)
+Dark Blue Dye (low saturation) = Corante Azul Escuro (baixa saturação)
+Dark Violet Dye (low saturation) = Corante Violeta Escuro (baixa saturação)
+Dark Magenta Dye (low saturation) = Corante Magenta Escuro (baixa saturação)
+Dark Red-violet Dye (low saturation) = Corante Vermelho-Violeta Escuro (baixa saturação)
+
+Dark Red Dye = Corante Vermelho Escuro
+Dark Orange Dye = Corante Laranja Escuro
+Dark Yellow Dye = Corante Amarelo Escuro
+Dark Lime Dye = Corante Lima Escuro
+Dark Green Dye = Corante Verde Escuro
+Dark Aqua Dye = Corante Água Escuro
+Dark Cyan Dye = Corante Ciano Escuro
+Dark Sky-blue Dye = Corante Azul-Céu Escuro
+Dark Blue Dye = Corante Azul Escuro
+Dark Violet Dye = Corante Violeta Escuro
+Dark Magenta Dye = Corante Magenta Escuro
+Dark Red-violet Dye = Corante Vermelho-Violeta Escuro
+
+Medium Red Dye (low saturation) = Corante Vermelho Médio (baixa saturação)
+Medium Orange Dye (low saturation) = Corante Laranja Médio (baixa saturação)
+Medium Yellow Dye (low saturation) = Corante Amarelo Médio (baixa saturação)
+Medium Lime Dye (low saturation) = Corante Lima Médio (baixa saturação)
+Medium Green Dye (low saturation) = Corante Verde Médio (baixa saturação)
+Medium Aqua Dye (low saturation) = Corante Água Médio (baixa saturação)
+Medium Cyan Dye (low saturation) = Corante Ciano Médio (baixa saturação)
+Medium Sky-blue Dye (low saturation) = Corante Azul-Céu Médio (baixa saturação)
+Medium Blue Dye (low saturation) = Corante Azul Médio (baixa saturação)
+Medium Violet Dye (low saturation) = Corante Violeta Médio (baixa saturação)
+Medium Magenta Dye (low saturation) = Corante Magenta Médio (baixa saturação)
+Medium Red-violet Dye (low saturation) = Corante Vermelho-Violeta Médio (baixa saturação)
+
+Medium Red Dye = Corante Vermelho Médio
+Medium Orange Dye = Corante Laranja Médio
+Medium Yellow Dye = Corante Amarelo Médio
+Medium Lime Dye = Corante Lima Médio
+Medium Green Dye = Corante Verde Médio
+Medium Aqua Dye = Corante Água Médio
+Medium Cyan Dye = Corante Ciano Médio
+Medium Sky-blue = Corante Azul-Céu Médio
+Medium Blue Dye = Corante Azul Médio
+Medium Violet Dye = Corante Violeta Médio
+Medium Magenta Dye = Corante Magenta Médio
+Medium Red-violet Dye = Corante Vermelho-Violeta Médio
+
+Red Dye (low saturation) = Corante Vermelho (baixa saturação)
+Orange Dye (low saturation) = Corante Laranja (baixa saturação)
+Yellow Dye (low saturation) = Corante Amarelo (baixa saturação)
+Lime Dye (low saturation) = Corante Lima (baixa saturação)
+Green Dye (low saturation) = Corante Vermelho (baixa saturação)
+Aqua Dye (low saturation) = Corante Água (baixa saturação)
+Cyan Dye (low saturation) = Corante Ciano (baixa saturação)
+Sky-blue Dye (low saturation) = Corante Azul-Céu (baixa saturação)
+Blue Dye (low saturation) = Corante Azul (baixa saturação)
+Violet Dye (low saturation) = Corante Violeta (baixa saturação)
+Magenta Dye (low saturation) = Corante Magenta (baixa saturação)
+Red-violet Dye (low saturation) = Corante Vermelho-Violeta (baixa saturação)
+
+Red Dye = Corante Vermelho
+Orange Dye = Corante Laranja
+Yellow Dye = Corante Amarelo
+Lime Dye = Corante Lima
+Green Dye = Corante Verde
+Aqua Dye = Corante Água
+Cyan Dye = Corano Ciano
+Sky-blue Dye = Corante Azul-Céu
+Blue Dye = Corante Azul
+Violet Dye = Corante Violeta
+Magenta Dye = Corante Magenta
+Red-violet Dye = Corante Vermelho-Violeta
+
+[UnifiedDyes] Loaded! = [UnifiedDyes] Carregado!
diff --git a/textures/unifieddyes_aqua.png b/textures/unifieddyes_aqua.png
deleted file mode 100644
index da73e21..0000000
Binary files a/textures/unifieddyes_aqua.png and /dev/null differ
diff --git a/textures/unifieddyes_aqua_s50.png b/textures/unifieddyes_aqua_s50.png
deleted file mode 100644
index d737e67..0000000
Binary files a/textures/unifieddyes_aqua_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_blue_s50.png b/textures/unifieddyes_blue_s50.png
deleted file mode 100644
index 33ab950..0000000
Binary files a/textures/unifieddyes_blue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_cyan_s50.png b/textures/unifieddyes_cyan_s50.png
deleted file mode 100644
index 7f304b7..0000000
Binary files a/textures/unifieddyes_cyan_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_aqua.png b/textures/unifieddyes_dark_aqua.png
deleted file mode 100644
index 6a146ea..0000000
Binary files a/textures/unifieddyes_dark_aqua.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_aqua_s50.png b/textures/unifieddyes_dark_aqua_s50.png
deleted file mode 100644
index 5dbf4bd..0000000
Binary files a/textures/unifieddyes_dark_aqua_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_blue.png b/textures/unifieddyes_dark_blue.png
deleted file mode 100644
index 2a62a38..0000000
Binary files a/textures/unifieddyes_dark_blue.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_blue_s50.png b/textures/unifieddyes_dark_blue_s50.png
deleted file mode 100644
index 4eceeff..0000000
Binary files a/textures/unifieddyes_dark_blue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_cyan.png b/textures/unifieddyes_dark_cyan.png
deleted file mode 100644
index 4cfbee4..0000000
Binary files a/textures/unifieddyes_dark_cyan.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_cyan_s50.png b/textures/unifieddyes_dark_cyan_s50.png
deleted file mode 100644
index 857c470..0000000
Binary files a/textures/unifieddyes_dark_cyan_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_green.png b/textures/unifieddyes_dark_green.png
deleted file mode 100644
index 19caa48..0000000
Binary files a/textures/unifieddyes_dark_green.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_green_s50.png b/textures/unifieddyes_dark_green_s50.png
deleted file mode 100644
index 686a49e..0000000
Binary files a/textures/unifieddyes_dark_green_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_lime.png b/textures/unifieddyes_dark_lime.png
deleted file mode 100644
index 927ddf8..0000000
Binary files a/textures/unifieddyes_dark_lime.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_lime_s50.png b/textures/unifieddyes_dark_lime_s50.png
deleted file mode 100644
index f274909..0000000
Binary files a/textures/unifieddyes_dark_lime_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_magenta.png b/textures/unifieddyes_dark_magenta.png
deleted file mode 100644
index 4f622b8..0000000
Binary files a/textures/unifieddyes_dark_magenta.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_magenta_s50.png b/textures/unifieddyes_dark_magenta_s50.png
deleted file mode 100644
index 1c461dc..0000000
Binary files a/textures/unifieddyes_dark_magenta_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_orange.png b/textures/unifieddyes_dark_orange.png
deleted file mode 100644
index 10bfdd2..0000000
Binary files a/textures/unifieddyes_dark_orange.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_orange_s50.png b/textures/unifieddyes_dark_orange_s50.png
deleted file mode 100644
index 2a794de..0000000
Binary files a/textures/unifieddyes_dark_orange_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_red.png b/textures/unifieddyes_dark_red.png
deleted file mode 100644
index 504c359..0000000
Binary files a/textures/unifieddyes_dark_red.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_red_s50.png b/textures/unifieddyes_dark_red_s50.png
deleted file mode 100644
index 4e7f01b..0000000
Binary files a/textures/unifieddyes_dark_red_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_redviolet.png b/textures/unifieddyes_dark_redviolet.png
deleted file mode 100644
index 79f1b15..0000000
Binary files a/textures/unifieddyes_dark_redviolet.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_redviolet_s50.png b/textures/unifieddyes_dark_redviolet_s50.png
deleted file mode 100644
index 889329e..0000000
Binary files a/textures/unifieddyes_dark_redviolet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_skyblue.png b/textures/unifieddyes_dark_skyblue.png
deleted file mode 100644
index dc6e928..0000000
Binary files a/textures/unifieddyes_dark_skyblue.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_skyblue_s50.png b/textures/unifieddyes_dark_skyblue_s50.png
deleted file mode 100644
index ac32c49..0000000
Binary files a/textures/unifieddyes_dark_skyblue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_violet.png b/textures/unifieddyes_dark_violet.png
deleted file mode 100644
index b093fd0..0000000
Binary files a/textures/unifieddyes_dark_violet.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_violet_s50.png b/textures/unifieddyes_dark_violet_s50.png
deleted file mode 100644
index c507491..0000000
Binary files a/textures/unifieddyes_dark_violet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_yellow.png b/textures/unifieddyes_dark_yellow.png
deleted file mode 100644
index 7bb6225..0000000
Binary files a/textures/unifieddyes_dark_yellow.png and /dev/null differ
diff --git a/textures/unifieddyes_dark_yellow_s50.png b/textures/unifieddyes_dark_yellow_s50.png
deleted file mode 100644
index c391292..0000000
Binary files a/textures/unifieddyes_dark_yellow_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_darkgrey.png b/textures/unifieddyes_darkgrey.png
deleted file mode 100644
index 61b13d0..0000000
Binary files a/textures/unifieddyes_darkgrey.png and /dev/null differ
diff --git a/textures/unifieddyes_dye.png b/textures/unifieddyes_dye.png
new file mode 100644
index 0000000..ee792e5
Binary files /dev/null and b/textures/unifieddyes_dye.png differ
diff --git a/textures/unifieddyes_green_s50.png b/textures/unifieddyes_green_s50.png
deleted file mode 100644
index 8f8fb73..0000000
Binary files a/textures/unifieddyes_green_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_light_aqua.png b/textures/unifieddyes_light_aqua.png
deleted file mode 100644
index 80458e2..0000000
Binary files a/textures/unifieddyes_light_aqua.png and /dev/null differ
diff --git a/textures/unifieddyes_light_blue.png b/textures/unifieddyes_light_blue.png
deleted file mode 100644
index 19f001d..0000000
Binary files a/textures/unifieddyes_light_blue.png and /dev/null differ
diff --git a/textures/unifieddyes_light_cyan.png b/textures/unifieddyes_light_cyan.png
deleted file mode 100644
index 1ff5580..0000000
Binary files a/textures/unifieddyes_light_cyan.png and /dev/null differ
diff --git a/textures/unifieddyes_light_green.png b/textures/unifieddyes_light_green.png
deleted file mode 100644
index e549c6f..0000000
Binary files a/textures/unifieddyes_light_green.png and /dev/null differ
diff --git a/textures/unifieddyes_light_lime.png b/textures/unifieddyes_light_lime.png
deleted file mode 100644
index e5d797e..0000000
Binary files a/textures/unifieddyes_light_lime.png and /dev/null differ
diff --git a/textures/unifieddyes_light_magenta.png b/textures/unifieddyes_light_magenta.png
deleted file mode 100644
index 08bed5b..0000000
Binary files a/textures/unifieddyes_light_magenta.png and /dev/null differ
diff --git a/textures/unifieddyes_light_orange.png b/textures/unifieddyes_light_orange.png
deleted file mode 100644
index b92b000..0000000
Binary files a/textures/unifieddyes_light_orange.png and /dev/null differ
diff --git a/textures/unifieddyes_light_red.png b/textures/unifieddyes_light_red.png
deleted file mode 100644
index ecc8bd8..0000000
Binary files a/textures/unifieddyes_light_red.png and /dev/null differ
diff --git a/textures/unifieddyes_light_redviolet.png b/textures/unifieddyes_light_redviolet.png
deleted file mode 100644
index 2e01d6f..0000000
Binary files a/textures/unifieddyes_light_redviolet.png and /dev/null differ
diff --git a/textures/unifieddyes_light_skyblue.png b/textures/unifieddyes_light_skyblue.png
deleted file mode 100644
index 9fc1a44..0000000
Binary files a/textures/unifieddyes_light_skyblue.png and /dev/null differ
diff --git a/textures/unifieddyes_light_violet.png b/textures/unifieddyes_light_violet.png
deleted file mode 100644
index 41d45fa..0000000
Binary files a/textures/unifieddyes_light_violet.png and /dev/null differ
diff --git a/textures/unifieddyes_light_yellow.png b/textures/unifieddyes_light_yellow.png
deleted file mode 100644
index ed140d1..0000000
Binary files a/textures/unifieddyes_light_yellow.png and /dev/null differ
diff --git a/textures/unifieddyes_lightgrey.png b/textures/unifieddyes_lightgrey.png
deleted file mode 100644
index 97ab01f..0000000
Binary files a/textures/unifieddyes_lightgrey.png and /dev/null differ
diff --git a/textures/unifieddyes_lime.png b/textures/unifieddyes_lime.png
deleted file mode 100644
index 5e6d5bf..0000000
Binary files a/textures/unifieddyes_lime.png and /dev/null differ
diff --git a/textures/unifieddyes_lime_s50.png b/textures/unifieddyes_lime_s50.png
deleted file mode 100644
index d02762e..0000000
Binary files a/textures/unifieddyes_lime_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_magenta_s50.png b/textures/unifieddyes_magenta_s50.png
deleted file mode 100644
index aaf9d51..0000000
Binary files a/textures/unifieddyes_magenta_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_aqua.png b/textures/unifieddyes_medium_aqua.png
deleted file mode 100644
index 3659c18..0000000
Binary files a/textures/unifieddyes_medium_aqua.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_aqua_s50.png b/textures/unifieddyes_medium_aqua_s50.png
deleted file mode 100644
index fcd8869..0000000
Binary files a/textures/unifieddyes_medium_aqua_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_blue.png b/textures/unifieddyes_medium_blue.png
deleted file mode 100644
index 4da240d..0000000
Binary files a/textures/unifieddyes_medium_blue.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_blue_s50.png b/textures/unifieddyes_medium_blue_s50.png
deleted file mode 100644
index bd6e0f9..0000000
Binary files a/textures/unifieddyes_medium_blue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_cyan.png b/textures/unifieddyes_medium_cyan.png
deleted file mode 100644
index e8015f6..0000000
Binary files a/textures/unifieddyes_medium_cyan.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_cyan_s50.png b/textures/unifieddyes_medium_cyan_s50.png
deleted file mode 100644
index de14506..0000000
Binary files a/textures/unifieddyes_medium_cyan_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_green.png b/textures/unifieddyes_medium_green.png
deleted file mode 100644
index ecc5f06..0000000
Binary files a/textures/unifieddyes_medium_green.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_green_s50.png b/textures/unifieddyes_medium_green_s50.png
deleted file mode 100644
index c9681b3..0000000
Binary files a/textures/unifieddyes_medium_green_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_lime.png b/textures/unifieddyes_medium_lime.png
deleted file mode 100644
index 2060bac..0000000
Binary files a/textures/unifieddyes_medium_lime.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_lime_s50.png b/textures/unifieddyes_medium_lime_s50.png
deleted file mode 100644
index 6eadc25..0000000
Binary files a/textures/unifieddyes_medium_lime_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_magenta.png b/textures/unifieddyes_medium_magenta.png
deleted file mode 100644
index 0f6144d..0000000
Binary files a/textures/unifieddyes_medium_magenta.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_magenta_s50.png b/textures/unifieddyes_medium_magenta_s50.png
deleted file mode 100644
index d5ca0dd..0000000
Binary files a/textures/unifieddyes_medium_magenta_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_orange.png b/textures/unifieddyes_medium_orange.png
deleted file mode 100644
index d131b9c..0000000
Binary files a/textures/unifieddyes_medium_orange.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_orange_s50.png b/textures/unifieddyes_medium_orange_s50.png
deleted file mode 100644
index 7e08bcf..0000000
Binary files a/textures/unifieddyes_medium_orange_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_red.png b/textures/unifieddyes_medium_red.png
deleted file mode 100644
index 28bc56d..0000000
Binary files a/textures/unifieddyes_medium_red.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_red_s50.png b/textures/unifieddyes_medium_red_s50.png
deleted file mode 100644
index 0eef916..0000000
Binary files a/textures/unifieddyes_medium_red_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_redviolet.png b/textures/unifieddyes_medium_redviolet.png
deleted file mode 100644
index 1143e27..0000000
Binary files a/textures/unifieddyes_medium_redviolet.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_redviolet_s50.png b/textures/unifieddyes_medium_redviolet_s50.png
deleted file mode 100644
index a314935..0000000
Binary files a/textures/unifieddyes_medium_redviolet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_skyblue.png b/textures/unifieddyes_medium_skyblue.png
deleted file mode 100644
index f1e935f..0000000
Binary files a/textures/unifieddyes_medium_skyblue.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_skyblue_s50.png b/textures/unifieddyes_medium_skyblue_s50.png
deleted file mode 100644
index bd2423e..0000000
Binary files a/textures/unifieddyes_medium_skyblue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_violet.png b/textures/unifieddyes_medium_violet.png
deleted file mode 100644
index dd8b5fa..0000000
Binary files a/textures/unifieddyes_medium_violet.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_violet_s50.png b/textures/unifieddyes_medium_violet_s50.png
deleted file mode 100644
index 4b6de6a..0000000
Binary files a/textures/unifieddyes_medium_violet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_yellow.png b/textures/unifieddyes_medium_yellow.png
deleted file mode 100644
index 578f5b9..0000000
Binary files a/textures/unifieddyes_medium_yellow.png and /dev/null differ
diff --git a/textures/unifieddyes_medium_yellow_s50.png b/textures/unifieddyes_medium_yellow_s50.png
deleted file mode 100644
index ce141da..0000000
Binary files a/textures/unifieddyes_medium_yellow_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_orange_s50.png b/textures/unifieddyes_orange_s50.png
deleted file mode 100644
index fe62b73..0000000
Binary files a/textures/unifieddyes_orange_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_palette.png b/textures/unifieddyes_palette.png
new file mode 100644
index 0000000..f6c288a
Binary files /dev/null and b/textures/unifieddyes_palette.png differ
diff --git a/textures/unifieddyes_palette_aquas.png b/textures/unifieddyes_palette_aquas.png
new file mode 100644
index 0000000..26f0a65
Binary files /dev/null and b/textures/unifieddyes_palette_aquas.png differ
diff --git a/textures/unifieddyes_palette_blues.png b/textures/unifieddyes_palette_blues.png
new file mode 100644
index 0000000..b83e22d
Binary files /dev/null and b/textures/unifieddyes_palette_blues.png differ
diff --git a/textures/unifieddyes_palette_colorwallmounted.png b/textures/unifieddyes_palette_colorwallmounted.png
new file mode 100644
index 0000000..8d3133b
Binary files /dev/null and b/textures/unifieddyes_palette_colorwallmounted.png differ
diff --git a/textures/unifieddyes_palette_cyans.png b/textures/unifieddyes_palette_cyans.png
new file mode 100644
index 0000000..0b0b094
Binary files /dev/null and b/textures/unifieddyes_palette_cyans.png differ
diff --git a/textures/unifieddyes_palette_extended.png b/textures/unifieddyes_palette_extended.png
new file mode 100644
index 0000000..2ff0323
Binary files /dev/null and b/textures/unifieddyes_palette_extended.png differ
diff --git a/textures/unifieddyes_palette_greens.png b/textures/unifieddyes_palette_greens.png
new file mode 100644
index 0000000..b381841
Binary files /dev/null and b/textures/unifieddyes_palette_greens.png differ
diff --git a/textures/unifieddyes_palette_greys.png b/textures/unifieddyes_palette_greys.png
new file mode 100644
index 0000000..e0d87aa
Binary files /dev/null and b/textures/unifieddyes_palette_greys.png differ
diff --git a/textures/unifieddyes_palette_limes.png b/textures/unifieddyes_palette_limes.png
new file mode 100644
index 0000000..b104c6e
Binary files /dev/null and b/textures/unifieddyes_palette_limes.png differ
diff --git a/textures/unifieddyes_palette_magentas.png b/textures/unifieddyes_palette_magentas.png
new file mode 100644
index 0000000..16abf00
Binary files /dev/null and b/textures/unifieddyes_palette_magentas.png differ
diff --git a/textures/unifieddyes_palette_oranges.png b/textures/unifieddyes_palette_oranges.png
new file mode 100644
index 0000000..cae1f4d
Binary files /dev/null and b/textures/unifieddyes_palette_oranges.png differ
diff --git a/textures/unifieddyes_palette_reds.png b/textures/unifieddyes_palette_reds.png
new file mode 100644
index 0000000..7f63bb3
Binary files /dev/null and b/textures/unifieddyes_palette_reds.png differ
diff --git a/textures/unifieddyes_palette_redviolets.png b/textures/unifieddyes_palette_redviolets.png
new file mode 100644
index 0000000..30d6c9a
Binary files /dev/null and b/textures/unifieddyes_palette_redviolets.png differ
diff --git a/textures/unifieddyes_palette_skyblues.png b/textures/unifieddyes_palette_skyblues.png
new file mode 100644
index 0000000..59396b1
Binary files /dev/null and b/textures/unifieddyes_palette_skyblues.png differ
diff --git a/textures/unifieddyes_palette_violets.png b/textures/unifieddyes_palette_violets.png
new file mode 100644
index 0000000..6238217
Binary files /dev/null and b/textures/unifieddyes_palette_violets.png differ
diff --git a/textures/unifieddyes_palette_yellows.png b/textures/unifieddyes_palette_yellows.png
new file mode 100644
index 0000000..0a458a7
Binary files /dev/null and b/textures/unifieddyes_palette_yellows.png differ
diff --git a/textures/unifieddyes_red_s50.png b/textures/unifieddyes_red_s50.png
deleted file mode 100644
index 6aef4c6..0000000
Binary files a/textures/unifieddyes_red_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_redviolet.png b/textures/unifieddyes_redviolet.png
deleted file mode 100644
index 2cb0692..0000000
Binary files a/textures/unifieddyes_redviolet.png and /dev/null differ
diff --git a/textures/unifieddyes_redviolet_s50.png b/textures/unifieddyes_redviolet_s50.png
deleted file mode 100644
index a438d9d..0000000
Binary files a/textures/unifieddyes_redviolet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_skyblue.png b/textures/unifieddyes_skyblue.png
deleted file mode 100644
index 85aa3c5..0000000
Binary files a/textures/unifieddyes_skyblue.png and /dev/null differ
diff --git a/textures/unifieddyes_skyblue_s50.png b/textures/unifieddyes_skyblue_s50.png
deleted file mode 100644
index 1d6834b..0000000
Binary files a/textures/unifieddyes_skyblue_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_violet_s50.png b/textures/unifieddyes_violet_s50.png
deleted file mode 100644
index 620e42c..0000000
Binary files a/textures/unifieddyes_violet_s50.png and /dev/null differ
diff --git a/textures/unifieddyes_yellow_s50.png b/textures/unifieddyes_yellow_s50.png
deleted file mode 100644
index a3b5f0b..0000000
Binary files a/textures/unifieddyes_yellow_s50.png and /dev/null differ
diff --git a/unifieddyes_base.png b/unifieddyes_base.png
deleted file mode 100644
index 912cc93..0000000
Binary files a/unifieddyes_base.png and /dev/null differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/minetest-mod-unifieddyes.git



More information about the Pkg-games-commits mailing list