T1
T2
"Emits light when powered with electricity. Can be colored in different ways, changing the light color"
- Brightness(number) [0 - 2] - The brightness of the light.
- LightRange(number) [1 - 60] - The range of the light.
local module = {}
--mw.loadData has performance benefits over require as it loads the module onnce per page, not of per invocation.
local Parts = mw.loadData("Module:PartJSON")
local function getRawMaterials(item)
local Materials = {}
local function get(item, amount)
for _, itemEntry in pairs(item.Recipe) do
local itemName = itemEntry[1]
local itemAmount = itemEntry[2]
if not Parts[itemName] or not Parts[itemName]["Recipe"] then
if not Materials[itemName] then
Materials[itemName] = 0
end
Materials[itemName] = Materials[itemName] + (amount * itemAmount)
else
get(Parts[itemName], amount * itemAmount)
end
end
end
if item and item.Recipe then
get(item, 1)
else
return false
end
return Materials
end
local function formatNormalRecipe(recipe)
local formattedRecipe = {}
if recipe then
for _, itemEntry in pairs(recipe) do
local itemName = itemEntry[1]
local itemAmount = itemEntry[2]
formattedRecipe[itemName] = itemAmount
end
return formattedRecipe
end
end
local function formatRecipe(recipe)
if recipe then
local recipeString = ""
local i = 0
for itemName, amount in pairs(recipe) do
local endString = ""
i = i + 1
if not i == #recipe then
endString = ""
else
endString = "\n\n"
end
recipeString = recipeString .. "[[" .. itemName .. "|" .. itemName .. " " .. amount .. "x]]" .. endString
end
return recipeString
else
return "No crafting recipe"
end
end
function module.getField(page)
local args = page.args
local itemName = args[2] or page:getParent():getTitle()
local field = args[1]
if Parts[itemName] then
if field == "Description" then
local part = Parts[itemName]
local description = part.Description
if description then
local descriptionSplit = mw.text.split(description, "\n")
local descriptionFormatted = "''\""
for i, str in pairs(descriptionSplit) do
if i > 1 and #str > 3 then descriptionFormatted = descriptionFormatted .. "''\n\n''" end
if #str > 3 then
descriptionFormatted = descriptionFormatted .. string.gsub(str, "%*%*", "'''") end
end
return descriptionFormatted .. "\" ''"
else
return "No description found"
end
elseif field == "Malleability" then
local malleability = Parts[itemName]["Malleability"]
if malleability == 0 or not malleability then
return "Fixed size"
else
return malleability
end
elseif field == "Raw recipe" then
local item = Parts[itemName]
local rawRecipe = getRawMaterials(item)
module.rr = rawRecipe
module.r = item.Recipe
local recipeFormatted = getRawMaterials(rawRecipe)
if formatRecipe(rawRecipe) == formatRecipe(formatNormalRecipe(item.Recipe)) then
return nil
end
return formatRecipe(rawRecipe)
elseif field == "Recipe" then
local item = Parts[itemName]
local recipe = item.Recipe
module.r = recipe
return formatRecipe(formatNormalRecipe(recipe))
elseif field == "Durability" then
return Parts[itemName]["Durability"] or 3
elseif field == "Configuration" then
local configData = Parts[itemName]["ConfigData"]
if not configData then return end
local formatted = ""
for _, entry in pairs(configData) do
local entryName = entry[1]
local entryType = entry[2]
local default = entry[3]
local range = entry[4]
local description = entry[5]
if type(default) == "table" then
default = {entry[3][1], entry[3][2]}
if default[1] == nil then
default[1] = "inf"
elseif default[2] == nil then
default[2] = "inf"
end
end
if entryType == "number" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(number)[" .. range[1] .. " - " .. range[2] .. "]</sup>"
elseif entryType == "boolean" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(boolean)</sup> "
elseif entryType == "string" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(string)</sup> "
elseif entryType == "Selection" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(selection)</sup> "
elseif entryType == "Coordinate" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(coordinate)</sup> "
elseif entryType == "NumberRange" then
formatted = formatted .. "\n\n * "..entryName.."<sup>(numberRange)["..default[1].." - "..default[2] .. "]</sup>"
end
end
return formatted
elseif field == "ConfigurationLarge" then
local configData = Parts[itemName]["ConfigData"]
if not configData then return "* Cannot be configured." end
local formatted = ""
for _, entry in pairs(configData) do
local entryName = entry[1]
local entryType = entry[2]
local default = entry[3]
local range = entry[4]
local description = entry[5]
if type(default) == "table" then
default = {entry[3][1], entry[3][2]}
if default[1] == nil then
default[1] = "inf"
elseif default[2] == nil then
default[2] = "inf"
end
end
if entryType == "number" then
formatted = formatted .. " \n* "..entryName.."<sup>(number) ["..range[1].." - "..range[2].."]</sup> - "..description
elseif entryType == "boolean" then
formatted = formatted .. " \n* "..entryName.."<sup>(boolean)</sup> - "..description
elseif entryType == "string" then
formatted = formatted .. " \n* "..entryName.."<sup>(string)</sup> - "..description
elseif entryType == "Selection" then
formatted = formatted .. " \n* "..entryName.."<sup>(selection)</sup> - "..description
elseif entryType == "Coordinate" then
formatted = formatted .. " \n* "..entryName.."<sup>(coordinate)</sup> - "..description
elseif entryType == "NumberRange" then
formatted = formatted .. " \n* "..entryName.."<sup>(numberRange) ["..default[1].." - "..default[2].."]</sup> - "..description
end
end
return string.sub(formatted, 2)
elseif field == "Type" then
local categories = Parts[itemName]["Categories"]
local formatted = ""
local invisEnd = " "
for i, type in pairs(categories) do
if i > 1 then
formatted = formatted .. "\n\n"
end
invisEnd = invisEnd .. " [[Category:" .. type .. "]]"
formatted = formatted .. "[[:Category:" .. type .. "|" .. type .. "]]"
end
return formatted .. invisEnd
elseif field == "Flammable" then
if Parts[itemName]["Flammable"] == "true" then
return "Yes"
else
return "No"
end
elseif field == "DefaultColor" or field == "DefaultSize" then
local conn = ""
local ccat = ""
local rgbtable = {}
if field == "DefaultColor" then conn = ", " else conn = " x " end
for i, v in pairs(Parts[itemName][field]) do
ccat = ccat .. v
if i ~= 3 then ccat = ccat .. conn end
rgbtable[i] = v
end
if field == "DefaultColor" then
local rgb = (rgbtable[1] * 0x10000) + (rgbtable[2] * 0x100) + rgbtable[3]
local webcolor = string.format("%x", rgb)
while string.len(webcolor) < 6 do
webcolor = "0" .. webcolor
end
webcolor = "#" .. webcolor
if rgbtable[1] > 76.5 or rgbtable[2] > 76.5 or rgbtable[3] > 76.5 then
ccat = ccat .. '<big><span style="color:' .. webcolor .. '"> ⬢</span></big>'
else
ccat = ccat .. '<big><span style="color:' .. webcolor .. '; text-shadow: 0px 0px 2px DimGray"> ⬢</span></big>'
end
end
return ccat
elseif Parts[itemName][field] then
return (tostring(Parts[itemName][field]))
else
error("unknown field given: " .. tostring(args[1]))
end
else
mw.addWarning("Sorry, part not found. Please fill in the fields manually.")
return "N/A"
end
end
return module