Модуль:ChemCard

Материал из Space Stories Wiki

Для документации этого модуля может быть создана страница Модуль:ChemCard/doc

local data = mw.loadData("Module:ChemCard/data")

local p = {}
p.chem = data.chem or {}
p.react = data.react or {}
p.groupDirection = data.groupDirection or {}

local function safe(val, default)
	if val == nil then return default end
	return val
end

local function textcolor(bg)
	local r = tonumber(bg:sub(2,3),16)
	local g = tonumber(bg:sub(4,5),16)
	local b = tonumber(bg:sub(6,7),16)
	local lum = math.sqrt(0.241*r*r + 0.691*g*g + 0.068*b*b)
	if lum > 100 then return "#000" else return "#FFF" end
end

function p.card(frame)
	local key = frame.args[1]
	local chem = p.chem[key]
	if not chem then return "" end

	local bg = safe(chem.bg, "#101010")
	local border = safe(chem.border, "#777777")
	local color = safe(chem.color, "#FFFFFF")
	local name = safe(chem.name, "Unknown")
	local desc = safe(chem.desc, "")

	local out = '<div class="chem-card" style="background:'..bg..'; border:2px solid '..border..'; padding:8px; border-radius:8px; margin:4px;">'
	out = out .. '<div class="chem-card-header" style="color:'..color..'; font-weight:700; font-size:1.1em; margin-bottom:4px;">'..name..'</div>'
	out = out .. '<div class="chem-card-desc" style="font-size:0.9em; margin-bottom:4px;">'..desc..'</div>'

	if chem.recipes and #chem.recipes > 0 then
		out = out .. '<div class="chem-card-recipes" style="font-size:0.85em; margin-top:4px;">'
		for _, r in ipairs(chem.recipes) do
			local react = p.react[r]
			if react then
				out = out .. '<b>Реакция:</b> '
				local comps = {}
				for k,v in pairs(react.reactants) do
					table.insert(comps, k.." ["..v.amount.."]")
				end
				out = out .. table.concat(comps," + ") .. " → "
				local results = {}
				for k,v in pairs(react.products) do
					table.insert(results, k.." ["..v.."]")
				end
				out = out .. table.concat(results," + ") .. "<br>"
				if react.effects then
					local effs = {}
					for _, e in pairs(react.effects) do
						table.insert(effs, e.name.." ("..e.amount..")")
					end
					out = out .. '<i>Эффекты:</i> '..table.concat(effs,", ")..'<br>'
				end
			end
		end
		out = out .. '</div>'
	end

	out = out .. '</div>'
	return out
end

function p.list(frame)
	local group = frame.args[1]
	local out = '<div class="chem-cards-container">'
	for k,chem in pairs(p.chem) do
		if not group or chem.group == group then
			out = out .. p.card({args={k}})
		end
	end
	out = out .. '</div>'
	return out
end

return p