juanchi/mods/minetest_game/player_api/base_texture.lua

150 lines
4.3 KiB
Lua

player_api.hair_colors = {
black = {
color = "#000000",
ratio = 175,
},
gray = {},
light_brown = {
color = "#7a4c20",
ratio = 150,
},
brown = {
color = "#7a4c20",
ratio = 192,
},
red = {
color = "#ed6800",
ratio = 140,
},
blonde = {
color = "#a7ad06",
ratio = 112,
},
}
local hair_colors_redux = {}
for key, value in pairs(player_api.hair_colors) do
hair_colors_redux[#hair_colors_redux+1] = key
end
player_api.skin_colors = {
normal = nil,
light_brown = {
color = "#bea080",
ratio = 225,
},
brown = {
color = "#a56d40",
ratio = 150,
},
black = {
color = "#462409",
ratio = 127,
},
}
local skin_colors_redux = {}
for key, value in pairs(player_api.skin_colors) do
skin_colors_redux[#skin_colors_redux+1] = key
end
player_api.eye_colors = {"brown", "gray", "green", "blue", "hazel", "violet", "black", "pink"}
function player_api.get_base_texture_table(player)
local meta = player:get_meta()
local base_texture_str = meta:get_string("base_texture")
if base_texture_str == nil or base_texture_str == "" then
player_api.set_base_textures(player)
end
local base_texture = minetest.deserialize(base_texture_str)
return base_texture
end
function player_api.set_base_texture(player, base_texture)
local meta = player:get_meta()
meta:set_string("base_texture", minetest.serialize(base_texture))
end
function player_api.create_base_texture(gender)
local base_texture = {}
local hair_color = hair_colors_redux[math.random(#hair_colors_redux)]
local eye_color = "player_"..player_api.eye_colors[math.random(#player_api.eye_colors)].."_eye.png"
if gender == "male" then
base_texture["eyebrowns"] = {texture = "player_eyebrowns_default.png", color = nil}
base_texture["eye"] = eye_color
base_texture["mouth"] = {texture = "player_male_mouth_default.png", color = nil}
base_texture["hair"] = {texture = "player_male_hair_default.png", color = hair_color}
else
base_texture["eyebrowns"] = {texture = "player_eyebrowns_default.png", color = nil}
base_texture["eye"] = eye_color
base_texture["mouth"] = {texture = "player_female_mouth_default.png", color = nil}
base_texture["hair"] = {texture = "player_female_hair_default.png", color = hair_color}
end
base_texture["skin"] = {texture = "player_skin.png", color =
skin_colors_redux[math.random(#skin_colors_redux)]}
return base_texture
end
function player_api.set_base_textures(player)
local meta = player:get_meta()
local gender = meta:get_string("gender")
local base_texture = player_api.create_base_texture(gender)
player_api.set_base_texture(player, base_texture)
end
local function colorize_texture(base_texture, what, texture)
if base_texture[what]["color"] then
local value
if what == "skin" then
value = player_api.skin_colors[base_texture[what]["color"]]
else --"hair"
value = player_api.hair_colors[base_texture[what]["color"]]
end
if value and value.color then
return texture .. "\\^\\[colorize\\:\\"..value.color.."\\:"..tostring(value.ratio)
else
return texture
end
else
return texture
end
end
function player_api.compose_base_texture(base_texture, def)
local texture = colorize_texture(base_texture, "skin", "[combine:"..def.canvas_size..":0,0="..def.skin_texture)
local ordered_keys = {}
for key in pairs(base_texture) do
table.insert(ordered_keys, key)
end
table.sort(ordered_keys)
for i = 1, #ordered_keys do
local key, value = ordered_keys[i], base_texture[ordered_keys[i]]
if key == "eyebrowns" then
value.texture = colorize_texture(base_texture, "eyebrowns", value.texture)
texture = texture .. ":"..def.eyebrowns_pos.."="..value.texture
elseif key == "eye" then
texture = texture .. ":"..def.eye_right_pos.."="..value
texture = texture .. ":"..def.eye_left_pos.."="..value
elseif key == "mouth" then
texture = texture .. ":"..def.mouth_pos.."="..value.texture
elseif key == "hair" then
if def.hair_preview then
value.texture = string.sub(value.texture, 0, -5).."_preview.png"
end
value.texture = colorize_texture(base_texture, "hair", value.texture)
texture = texture .. ":"..def.hair_pos.."="..value.texture
end
end
if def.scale then
local dimensions = string.split(def.canvas_size, "x")
texture = texture.."^[resize:"..tostring(tonumber(dimensions[1])*def.scale).."x"
..tostring(tonumber(dimensions[2])*def.scale)
end
return texture
end