diff --git a/src/lua_colorlib.c b/src/lua_colorlib.c
index 47ce79de28f2d2b6647229c8eb3dfe3e10e72eb1..0133a526de60d6a4bfc0408f534febaf180fc7cb 100644
--- a/src/lua_colorlib.c
+++ b/src/lua_colorlib.c
@@ -469,13 +469,45 @@ UINT8* LUA_CheckColormap(lua_State *L, int ud)
 	return NULL;
 }
 
+static int lib_colormapGenerate(lua_State *L);
+static int lib_colormapMix(lua_State *L);
+static int lib_colormapBlend(lua_State *L);
+static int lib_colormapTint(lua_State *L);
+static int lib_colormapCopy(lua_State *L);
+static int lib_colormapCopySkinColor(lua_State *L);
+
+static const char *const colormap_fn_opt[] = {
+	"generate",
+	"mix",
+	"blend",
+	"tint",
+	"copy",
+	"copySkincolor",
+	NULL};
+
+static int (*colormap_fn_list[6])(lua_State *L) = {
+	lib_colormapGenerate,
+	lib_colormapMix,
+	lib_colormapBlend,
+	lib_colormapTint,
+	lib_colormapCopy,
+	lib_colormapCopySkinColor
+};
+
 static int colormap_get(lua_State *L)
 {
 	colormap_t *colormap = *((colormap_t **)luaL_checkudata(L, 1, META_COLORMAP));
-	UINT32 i = luaL_checkinteger(L, 2);
-	if (i >= 256)
-		return luaL_error(L, "colormap index %d out of range (0 - %d)", i, 255);
-	lua_pushinteger(L, colormap->map[i]);
+
+	if (lua_isnumber(L, 2))
+	{
+		UINT32 i = luaL_checkinteger(L, 2);
+		if (i >= 256)
+			return luaL_error(L, "colormap index %d out of range (0 - %d)", i, 255);
+		lua_pushinteger(L, colormap->map[i]);
+	}
+	else
+		lua_pushcfunction(L, colormap_fn_list[luaL_checkoption(L, 2, NULL, colormap_fn_opt)]);
+
 	return 1;
 }