Первый фикс

Пачки некоторых позиций увеличены
This commit is contained in:
2024-03-01 20:53:32 +03:00
commit 7c9c708c92
23653 changed files with 767936 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
local doingAnalysis = __DebugAdapter and false
if doingAnalysis then
require("noiseAnalysis")()
else
require("noiseSettings")()
end

View File

@@ -0,0 +1,13 @@
{
"name": "alien-biomes-settings",
"version": "0.0.2",
"title": "Alien Biomes Settings",
"author": "Tec",
"dependencies": [
"base >= 1.1.0",
"alien-biomes >= 0.6.7"
],
"description": "Just more settings for Alien biomes",
"factorio_version": "1.1",
"homepage":"https://github.com/Technus"
}

View File

@@ -0,0 +1,92 @@
[autoplace-control-names]
settings-dirt-aubergine=Tiles: Dirt - Aubergine
settings-dirt-beige=Tiles: Dirt - Beige
settings-dirt-black=Tiles: Dirt - Black
settings-dirt-brown=Tiles: Dirt - Brown
settings-dirt-cream=Tiles: Dirt - Cream
settings-dirt-dustyrose=Tiles: Dirt - Dustyrose
settings-dirt-grey=Tiles: Dirt - Grey
settings-dirt-purple=Tiles: Dirt - Purple
settings-dirt-red=Tiles: Dirt - Red
settings-dirt-tan=Tiles: Dirt - Tan
settings-dirt-violet=Tiles: Dirt - Violet
settings-dirt-white=Tiles: Dirt - White
settings-frozen-snow=Tiles: Frozen - Snow
settings-frozen-ice=Tiles: Frozen - Ice
settings-grass-blue=Tiles: Grass - Blue
settings-grass-green=Tiles: Grass - Green
settings-grass-mauve=Tiles: Grass - Mauve
settings-grass-olive=Tiles: Grass - Olive
settings-grass-orange=Tiles: Grass - Orange
settings-grass-purple=Tiles: Grass - Purple
settings-grass-red=Tiles: Grass - Red
settings-grass-turquoise=Tiles: Grass - Turquoise
settings-grass-violet=Tiles: Grass - Violet
settings-grass-yellow=Tiles: Grass - Yellow
settings-sand-aubergine=Tiles: Sand - Aubergine
settings-sand-beige=Tiles: Sand - Beige
settings-sand-black=Tiles: Sand - Black
settings-sand-brown=Tiles: Sand - Brown
settings-sand-cream=Tiles: Sand - Cream
settings-sand-dustyrose=Tiles: Sand - Dustyrose
settings-sand-grey=Tiles: Sand - Grey
settings-sand-purple=Tiles: Sand - Purple
settings-sand-red=Tiles: Sand - Red
settings-sand-tan=Tiles: Sand - Tan
settings-sand-violet=Tiles: Sand - Violet
settings-sand-white=Tiles: Sand - White
settings-volcanic-blue=Tiles: Volcanic - Blue
settings-volcanic-green=Tiles: Volcanic - Green
settings-volcanic-orange=Tiles: Volcanic - Orange
settings-volcanic-purple=Tiles: Volcanic - Purple
settings-water-normal=Tiles: Water - Normal
settings-water-deep=Tiles: Water - Deep
settings-water-shallow=Tiles: Water - Shallow
settings-water-mud=Tiles: Water - Mud
[autoplace-control-description]
settings-dirt-aubergine=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-beige=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-black=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-brown=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-cream=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-dustyrose=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-grey=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-purple=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-red=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-tan=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-violet=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-dirt-white=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-frozen-snow=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-frozen-ice=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-blue=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-green=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-mauve=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-olive=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-orange=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-purple=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-red=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-turquoise=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-violet=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-grass-yellow=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-aubergine=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-beige=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-black=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-brown=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-cream=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-dustyrose=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-grey=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-purple=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-red=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-tan=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-violet=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-sand-white=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-volcanic-blue=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-volcanic-green=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-volcanic-orange=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-volcanic-purple=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-water-normal=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-water-deep=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-water-shallow=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5
settings-water-mud=NoiseExpression = (NoiseExpression+log2(Frequency)^5)*Size^5 +log2(Richness)^5

View File

@@ -0,0 +1,97 @@
local noise = require("noise")
local tne = noise.to_noise_expression
local util=require("util")
return function()
data:extend {
{
type = "noise-expression",
name = "target",
intended_property = "target",
expression = tne(0)
}
}
local i = 1
for name, tileData in pairs(data.raw.tile) do
if tileData.autoplace and tileData.autoplace.probability_expression ~= nil then
--require("noiseImpression")(tileData.autoplace.probability_expression);
data:extend {
{
type = "noise-expression",
name = "settings-target-" .. name,
intended_property = "target",
expression = util.deepcopy(tileData.autoplace.probability_expression)
},
}
i = i + 1
end
end
local halfCount = math.floor((i - 1) / 2) + 1
local expStep = 2
local exp = (halfCount / 2 - 1) * expStep
local current = 1
local alien = "Tile colors:"
local stat = "Tile equations:"
for name, tileData in pairs(data.raw.tile) do
if tileData.autoplace and tileData.autoplace.probability_expression ~= nil then
local target = noise.var("target")
local limCloserToNul = math.pow(10, exp - (expStep / 2))
local limCloserToInf = math.pow(10, exp + (expStep / 2))
local expr
alien = alien .. "\n" .. name .. " " .. util.RGBtoHEX(tileData.map_color)
tileData.map_color = util.generateColor(current)
if current < halfCount then
if current == 1 then --first
expr = noise.if_else_chain(noise.less_than(target, -limCloserToNul), 1e309, -1e309)
stat = stat .. "\n" .. (name .. " < " .. -limCloserToNul) .. " " .. util.RGBtoHEX(tileData.map_color)
elseif current == halfCount - 1 then --last
expr = noise.if_else_chain(noise.less_than(target, -limCloserToInf), -1e309,
noise.less_than(0, target),
-1e309, 1e309)
stat = stat .. "\n" .. (-limCloserToInf .. " <= " .. name .. " < 0") ..
" " .. util.RGBtoHEX(tileData.map_color)
else
expr = noise.if_else_chain(noise.less_than(target, -limCloserToInf), -1e309,
noise.less_than(-limCloserToNul, target), -1e309, 1e309)
stat = stat ..
"\n" ..
(-limCloserToInf .. " <= " .. name .. " < " .. -limCloserToNul) ..
" " .. util.RGBtoHEX(tileData.map_color)
end
exp = exp - expStep
elseif current > halfCount then
if current == halfCount + 1 then --first
expr = noise.if_else_chain(noise.less_or_equal(target, 0), -1e309,
noise.less_or_equal(limCloserToInf, target), -1e309, 1e309)
stat = stat .. "\n" .. ("0 < " .. name .. " <= " .. limCloserToInf) ..
" " .. util.RGBtoHEX(tileData.map_color)
elseif current == halfCount * 2 - 1 then --last
expr = noise.if_else_chain(noise.less_or_equal(limCloserToNul, target), 1e309, -1e309)
stat = stat .. "\n" .. (limCloserToNul .. " < " .. name) .. " " .. util.RGBtoHEX(tileData.map_color)
else
expr = noise.if_else_chain(noise.less_or_equal(target, limCloserToNul), -1e309,
noise.less_or_equal(limCloserToInf, target), -1e309, 1e309)
stat = stat ..
"\n" ..
(limCloserToNul .. " < " .. name .. " <= " .. limCloserToInf) ..
" " .. util.RGBtoHEX(tileData.map_color)
end
exp = exp + expStep
else --position in middle is expr==Zero
expr = noise.if_else_chain(noise.equals(target, tne(0)), 1e309, -1e309)
stat = stat .. "\n" .. (name .. " == 0") .. " " .. util.RGBtoHEX(tileData.map_color)
end
tileData.autoplace.probability_expression = expr
current = current + 1
end
end
log(alien)
log(stat)
end

View File

@@ -0,0 +1,124 @@
local noise = require("noise")
local pne;
local indentInc = " "
local function escape(str)
str=string.gsub(str,"\t","\\t")
str=string.gsub(str,"\n","\\n")
str=string.gsub(str,"\r","\\r")
str=string.gsub(str,"\\","\\\\")
return string.gsub(str,"\"","\\\"")
end
local function impressLiteral(v,stringBuilder)
stringBuilder.string=stringBuilder.string .. tostring(v.literal_value)
return v
end
local function impressVariable(v,stringBuilder)
stringBuilder.string=stringBuilder.string .."noise.var[\"".. escape(v.variable_name) .. "\"]"
return v
end
local function impressString(v,stringBuilder)
stringBuilder.string=stringBuilder.string .. "\"".. escape(v.literal_value) .."\""
return v
end
local function impressArguments(v,stringBuilder,separator,indent)
local len = #v
for index, argument in ipairs(v) do
pne(argument,stringBuilder,indent)
if len ~= index then
stringBuilder.string=stringBuilder.string .. separator
end
end
return v
end
local function impressFunction(v,stringBuilder,indent)
local indentNew = indent..indentInc..indentInc
local name = "noise[\""..escape(v.function_name).."\"]"
log(v.source_location.filename..":"..v.source_location.line_number .." @ ".. v.function_name.." -> "..name)
if(v.arguments==nil or #v.arguments==0)then
stringBuilder.string=stringBuilder.string .. name .."()"
else
local argumentsBuilder = {string=""}
impressArguments(v.arguments,argumentsBuilder,",\n"..indentNew,indentNew)
stringBuilder.string=stringBuilder.string .. name .."(\n" .. indentNew .. argumentsBuilder.string .. "\n" ..indent.. ")"
end
return v
end
local function impressIfElseChain(v,stringBuilder,indent)
local indentQ = indent..indentInc..indentInc
local indentNew = indent..indentInc
local len = #v.arguments
stringBuilder.string = stringBuilder.string .. " if "
pne(v.arguments[1],stringBuilder,indentQ)
stringBuilder.string = stringBuilder.string .. " then\n"..indentNew.."return "
pne(v.arguments[2],stringBuilder,indentNew)
stringBuilder.string = stringBuilder.string .. "\n"..indent
for index = 4, len, 2 do
stringBuilder.string = stringBuilder.string .. "elseif "
pne(v.arguments[index-1],stringBuilder,indentQ)
stringBuilder.string = stringBuilder.string .. " then\n"..indentNew.."return "
pne(v.arguments[index],stringBuilder,indentNew)
stringBuilder.string = stringBuilder.string .. "\n"..indent
end
stringBuilder.string = stringBuilder.string .. " else\n"..indentNew.."return "
pne(v.arguments[len],stringBuilder,indentNew)
stringBuilder.string = stringBuilder.string .. "\n"..indent .. "end"
end
local function impressOperator(v,stringBuilder,op,indent)
if(#v.arguments==1) then
stringBuilder.string = stringBuilder.string .. op
impressArguments(v.arguments,stringBuilder,op,indent)
else
impressArguments(v.arguments,stringBuilder,op,indent)
end
return v
end
local ops={
["add"]=function (expression,stringBuilder,indent) return impressOperator(expression,stringBuilder,"+",indent) end,
["subtract"]=function (expression,stringBuilder,indent) return impressOperator(expression,stringBuilder,"-",indent) end,
["multiply"]=function (expression,stringBuilder,indent) return impressOperator(expression,stringBuilder,"*",indent) end,
["divide"]=function (expression,stringBuilder,indent) return impressOperator(expression,stringBuilder,"/",indent) end,
["exponentiate"]=function (expression,stringBuilder,indent) return impressOperator(expression,stringBuilder,"^",indent) end,
}
function pne(expression,stringBuilder,indent)
local v = expression.type
if v == "literal-number" or v == "literal-boolean" or v=="literal-object" then
return impressLiteral(expression,stringBuilder)
elseif v == "literal-string" then
return impressString(expression,stringBuilder)
elseif v == "variable" then
return impressVariable(expression,stringBuilder)
elseif v == "function-application" then
if ops[expression.function_name] then
ops[expression.function_name](expression,stringBuilder,indent)
else
return impressFunction(expression,stringBuilder,indent)
end
elseif v == "if-else-chain" then
return impressIfElseChain(expression,stringBuilder,indent)
else
error("Can't turn " .. v .. " into noise impression")
end
end
return function (noiseExpr)
if __DebugAdapter then
local stringBuilder = {string=""}
pne(noiseExpr,stringBuilder,"")
log(stringBuilder.string)
return noiseExpr
end
end

View File

@@ -0,0 +1,83 @@
local noise = require("noise")
local tne = noise.to_noise_expression
local util = require("util")
local tileMetaData=require("tileMetaData")
return function()
for name, tileData in pairs(data.raw.tile) do
local biome = ""
local tileName = name
for unaliased, alias in pairs(tileMetaData.tile_alias) do
if name == unaliased then
tileName = alias
break
end
end
for setting, prefix in pairs(tileMetaData.biome_settings) do
if util.startsWith(tileName, prefix) then
biome = setting
break
end
end
if tileData.autoplace then
if tileData.autoplace.probability_expression ~= nil then
if biome ~= "" then
tileMetaData.biomes_used[biome] = biome
local expr = tileData.autoplace.probability_expression
local a = noise.var("settings-a-" .. biome)
local b = noise.var("settings-b-" .. biome)
local c = noise.var("settings-c-" .. biome)
local d = tileMetaData.get_dynamic_scale(name)
if d~=1 then
a=a*tne(d)
c=c*tne(d)
end
local disabled = noise.var("settings-disabled-" .. biome)
tileData.autoplace.probability_expression = noise.if_else_chain(disabled, -1e309, ((expr + a) / b) + c)
elseif __DebugAdapter then
log(tileName .. " No biome")
end
elseif __DebugAdapter then
log(tileName .. " No expression")
end
end
end
for biome, value in pairs(tileMetaData.biomes_used) do
data:extend { {
type = "autoplace-control",
name = "settings-" .. biome,
order = "zzz-" .. biome .. "-zzz",
richness = true,
category = "resource"
} }
data:extend {
{
type = "noise-expression",
name = "settings-disabled-" .. biome,
expression = noise.equals(noise.var("control-setting:settings-" .. biome .. ":size:multiplier"), tne(0)) --disable button size/coverage==0
},
{
type = "noise-expression",
name = "settings-a-" .. biome,
expression = noise.log2(noise.var("control-setting:settings-" .. biome .. ":frequency:multiplier")) ^ tne(5) --frequency / scale 0.16 to 6 / 6 to 0.16
},
{
type = "noise-expression",
name = "settings-b-" .. biome,
expression = noise.var("control-setting:settings-" .. biome .. ":size:multiplier") ^ tne(3) --size/coverage disable==0 and 0.16 to 6 / 0.16 to 6
},
{
type = "noise-expression",
name = "settings-c-" .. biome,
expression = (noise.log2(noise.var("control-setting:settings-" .. biome .. ":richness:multiplier")) ^ tne(9)) * tne(60) --richness 0.16 to 6
},
}
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

View File

@@ -0,0 +1,111 @@
local util = require("util")
local biomes = {}
local biome_settings = {
["dirt-aubergine"] = "mineral-aubergine-dirt-",
["dirt-beige"] = "mineral-beige-dirt-",
["dirt-black"] = "mineral-black-dirt-",
["dirt-brown"] = "mineral-brown-dirt-",
["dirt-cream"] = "mineral-cream-dirt-",
["dirt-dustyrose"] = "mineral-dustyrose-dirt-",
["dirt-grey"] = "mineral-grey-dirt-",
["dirt-purple"] = "mineral-purple-dirt-",
["dirt-red"] = "mineral-red-dirt-",
["dirt-tan"] = "mineral-tan-dirt-",
["dirt-violet"] = "mineral-violet-dirt-",
["dirt-white"] = "mineral-white-dirt-",
["frozen-snow"] = "frozen-snow-",
["frozen-ice"] = "frozen-ice-",
["grass-blue"] = "vegetation-blue-grass-",
["grass-green"] = "vegetation-green-grass-",
["grass-mauve"] = "vegetation-mauve-grass-",
["grass-olive"] = "vegetation-olive-grass-",
["grass-orange"] = "vegetation-orange-grass-",
["grass-purple"] = "vegetation-purple-grass-",
["grass-red"] = "vegetation-red-grass-",
["grass-turquoise"] = "vegetation-turquoise-grass-",
["grass-violet"] = "vegetation-violet-grass-",
["grass-yellow"] = "vegetation-yellow-grass-",
["sand-aubergine"] = "mineral-aubergine-sand-",
["sand-beige"] = "mineral-beige-sand-",
["sand-black"] = "mineral-black-sand-",
["sand-brown"] = "mineral-brown-sand-",
["sand-cream"] = "mineral-cream-sand-",
["sand-dustyrose"] = "mineral-dustyrose-sand-",
["sand-grey"] = "mineral-grey-sand-",
["sand-purple"] = "mineral-purple-sand-",
["sand-red"] = "mineral-red-sand-",
["sand-tan"] = "mineral-tan-sand-",
["sand-violet"] = "mineral-violet-sand-",
["sand-white"] = "mineral-white-sand-",
["volcanic-blue"] = "volcanic-blue-heat-",
["volcanic-green"] = "volcanic-green-heat-",
["volcanic-orange"] = "volcanic-orange-heat-",
["volcanic-purple"] = "volcanic-purple-heat-",
--["water-normal"] = "water-normal",
--["water-deep"] = "water-deep",
--["water-shallow"] = "water-shallow",
["water-mud"] = "water-mud",
}
biomes.biome_settings=biome_settings
local biomes_used = {}
biomes.biomes_used=biomes_used
local tile_alias = util.deepcopy(alien_biomes.tile_alias)
tile_alias["water"] = "water-normal"
tile_alias["deepwater"] = "water-deep"
tile_alias["water-green"] = "water-normal-green"
tile_alias["deepwater-green"] = "water-deep-green"
tile_alias["frozen-snow-5"] = "frozen-ice-5"
tile_alias["frozen-snow-6"] = "frozen-ice-6"
tile_alias["frozen-snow-7"] = "frozen-ice-7"
tile_alias["frozen-snow-8"] = "frozen-ice-8"
tile_alias["frozen-snow-9"] = "frozen-ice-9"
biomes.tile_alias=tile_alias
local dynamic_ranges = {
["deepwater"] = { -1e72, 10000 },
["water"] = { -1e72, 1e58 },
["water-mud"] = { -10000, 1 },
["water-shallow"] = { -1e72, 10000 },
}
local dynamic_range_default = { -10000, 100 }
local function get_dynamic_range(name)
for key, value in pairs(dynamic_ranges) do
if util.endswith(name,key) then
return value
end
end
return dynamic_range_default
end
biomes.get_dynamic_range=get_dynamic_range
local function get_dynamic_range_scale(name)
local value = get_dynamic_range(name)
return {value[1]/dynamic_range_default[1],value[2]/dynamic_range_default[2]}
end
biomes.get_dynamic_range_scale=get_dynamic_range_scale
local function get_dynamic_scale(name)
local value = get_dynamic_range(name)
local scale = (value[1]/dynamic_range_default[1])*(value[2]/dynamic_range_default[2])
local _, exponent = math.frexp(scale)
return math.ldexp(0.5, exponent)
end
biomes.get_dynamic_scale=get_dynamic_scale
return biomes

View File

@@ -0,0 +1,123 @@
local util = {}
local function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
util.deepcopy = deepcopy
local function endswith(String, ending)
return ending == "" or string.sub(String,-#ending) == ending
end
util.endswith = endswith
local function startsWith(String, Start)
return string.sub(String, 1, string.len(Start)) == Start
end
util.startsWith = startsWith
local function getColor(r, g, b)
return { r = math.floor(r), g = math.floor(g), b = math.floor(b) }
end
util.getColor = getColor
local function HSLtoRGB(h, s, l)
h = h / 360
s = s / 100
l = l / 100
local r, g, b;
if s == 0 then
r, g, b = l, l, l; -- achromatic
else
local function hue2rgb(p, q, t)
if t < 0 then t = t + 1 end
if t > 1 then t = t - 1 end
if t < 1 / 6 then return p + (q - p) * 6 * t end
if t < 1 / 2 then return q end
if t < 2 / 3 then return p + (q - p) * (2 / 3 - t) * 6 end
return p;
end
local q = l < 0.5 and l * (1 + s) or l + s - l * s;
local p = 2 * l - q;
r = hue2rgb(p, q, h + 1 / 3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1 / 3);
end
return getColor(r * 255, g * 255, b * 255)
end
util.HSLtoRGB = HSLtoRGB
local function HSVtoRGB(h, s, v)
local min = math.min
local max = math.max
local abs = math.abs
local k1 = v * (1 - s)
local k2 = v - k1
local r = min(max(3 * abs(((h) / 180) % 2 - 1) - 1, 0), 1)
local g = min(max(3 * abs(((h - 120) / 180) % 2 - 1) - 1, 0), 1)
local b = min(max(3 * abs(((h + 120) / 180) % 2 - 1) - 1, 0), 1)
return getColor(k1 + k2 * r, k1 + k2 * g, k1 + k2 * b)
end
util.HSVtoRGB = HSVtoRGB
local function RGBtoHEX(rgb)
local hexadecimal = '#'
rgb = { rgb.r, rgb.g, rgb.b }
for key, value in pairs(rgb) do
local hex = ''
while (value > 0) do
local index = math.fmod(value, 16) + 1
value = math.floor(value / 16)
hex = string.sub('0123456789ABCDEF', index, index) .. hex
end
if (string.len(hex) == 0) then
hex = '00'
elseif (string.len(hex) == 1) then
hex = '0' .. hex
end
hexadecimal = hexadecimal .. hex
end
return hexadecimal
end
util.RGBtoHEX = RGBtoHEX
local function generateColor(id)
local steps=8
local step=math.floor(256/steps)
local bias=math.floor((256/steps)/2)
local r=(math.floor(id/(steps*steps))%steps)*step+bias
local g=(math.floor(id/steps)%steps)*step+bias
local b=(math.floor(id)%steps)*step+bias
return getColor(r,g,b)
end
util.generateColor = generateColor
return util