Module:Recipe: Difference between revisions

From Subnautica Wiki
(adding arrows)
(turning the recipe creation function into its own separate function to allow both SN and BZ calls)
Line 9: Line 9:
local p = {}
local p = {}
local dataSN = mw.loadData('Module:Recipe/SN')
local dataSN = mw.loadData('Module:Recipe/SN')
-- local dataBZ = mw.loadData('Module:Recipe/BZ')
local dataBZ = mw.loadData('Module:Recipe/BZ')
local getArgs = require('Dev:Arguments').getArgs
local getArgs = require('Dev:Arguments').getArgs
local width = 50
local width = 50
Line 82: Line 82:
end
end


function p.SN(frame)
function p.createRecipe(frame, data)
local args = getArgs(frame)
local args = getArgs(frame)
local output = "<div class='recipe'>"
local output = "<div class='recipe'>"
Line 89: Line 89:
-- First, get the ID of the product item provided by template; pagename used by default
-- First, get the ID of the product item provided by template; pagename used by default
local id = args[1] or mw.title.getCurrentTitle().text
local id = args[1] or mw.title.getCurrentTitle().text
local itemID = p.getItemID(id, dataSN)
local itemID = p.getItemID(id, data)
if not itemID then error("Could not find recipe for item '" .. id .. "'") end
if not itemID then error("Could not find recipe for item '" .. id .. "'") end
-- Item is found, start processing it
-- Item is found, start processing it
if dataSN[itemID].original then
if data[itemID].original then
-- If the item is made as part of a different item's recipe
-- If the item is made as part of a different item's recipe
error ("No standalone recipe for item '" .. itemID .. "' (use '" .. dataSN[itemID].original .. "' instead)")
error ("No standalone recipe for item '" .. itemID .. "' (use '" .. data[itemID].original .. "' instead)")
else
else
if dataSN[itemID].recipe and dataSN[itemID].machine then
if data[itemID].recipe and data[itemID].machine then
-- Recipe is found, start creating the output
-- Recipe is found, start creating the output
output = output .. "<div class='recipe__machine'>"
output = output .. "<div class='recipe__machine'>"
local machineID = dataSN[itemID].machine
local machineID = data[itemID].machine
if not dataSN[machineID] then
if not data[machineID] then
error ("Invalid machine listed in recipe for item '" .. itemID .. "'")
error ("Invalid machine listed in recipe for item '" .. itemID .. "'")
end
end
local iconMachine = p.createIcon(machineID, 0, dataSN, false)
local iconMachine = p.createIcon(machineID, 0, data, false)
output = output .. iconMachine .. "</div>"
output = output .. iconMachine .. "</div>"
output = output .. arrow .. "<div class='recipe__ingredients'>"
output = output .. arrow .. "<div class='recipe__ingredients'>"
for i,v in ipairs(dataSN[itemID].recipe) do
for i,v in ipairs(data[itemID].recipe) do
local icon = p.createIcon(v[1], v[2], dataSN, true)
local icon = p.createIcon(v[1], v[2], data, true)
output = output .. icon
output = output .. icon
end
end
Line 115: Line 115:
output = output .. arrow .. "<div class='recipe__output'>"
output = output .. arrow .. "<div class='recipe__output'>"
local outNum = dataSN[itemID].quantity or 1
local outNum = data[itemID].quantity or 1
local iconProduct = p.createIcon(itemID, outNum, dataSN, false)
local iconProduct = p.createIcon(itemID, outNum, data, false)
output = output .. iconProduct
output = output .. iconProduct
if dataSN[itemID].additional then
if data[itemID].additional then
local addOut = dataSN[itemID].additional
local addOut = data[itemID].additional
local addIcon
local addIcon
for i,v in ipairs(addOut) do
for i,v in ipairs(addOut) do
addIcon = p.createIcon(v[1], v[2], dataSN, false)
addIcon = p.createIcon(v[1], v[2], data, false)
output = output .. addIcon
output = output .. addIcon
end
end
Line 134: Line 134:
end
end
end
end
end

function p.SN(frame)
return p.createRecipe(frame, dataSN)
end

function p.BZ(frame)
return p.createRecipe(frame, dataBZ)
end
end



Revision as of 01:08, 11 June 2022

This module standardizes the display of crafting recipes and makes it easy to display a specified item's recipe or all recipes that use a specified ingredient. See Template:RecipeNew for more information. Thanks to BryghtShadow for helping out with the loops!


--[[
	This module standardizes the display of crafting recipes
	and makes it easy to display a specified item's recipe
	or all recipes that use a specified ingredient.
	Thanks to User:BryghtShadow for helping out with the loops!
--]]

-- <nowiki>
local p = {}
local dataSN = mw.loadData('Module:Recipe/SN')
local dataBZ = mw.loadData('Module:Recipe/BZ')
local getArgs = require('Dev:Arguments').getArgs
local width = 50
local widthBig = 75

function p.getItemID(id, data)
	-- removing disambiguations from pagenames
	id = string.gsub(id, " %(Subnautica%)", "")
	id = string.gsub(id, " %(Below Zero%)", "")
	
	-- if item ID is provided directly...
	if data[id] then
		return id
	end
	
	-- ...otherwise try to find by item name
	for k, v in pairs(data) do
		if v.name == id then -- item found
			return k
		end
	end
	
	return nil -- Could not find item
end

function p.createIcon(item, quantity, data, mid)
	local iconOut = ""
	
	local iconWidth = width
	if not mid then
		iconWidth = widthBig
	end
	local iconHeight = iconWidth
	local iconOffset = 0
	
	local name = data[item].name
	
	local image = data[item].image
	local iconBG
	if not image then
		image = name .. " Icon.png"
		if data[item].icon then
			local iconBGSize = data[item].icon.size or "1x1"
			local iconBGType = data[item].icon.bg or "default"
			iconBG = iconBGSize .. " " .. iconBGType
			if iconBGSize == "1x2" then
				iconHeight = iconWidth * 2
			elseif iconBGSize == "3x2" then
				iconHeight = (iconWidth / 3) * 2
			elseif iconBGSize == "2x3" then
				iconHeight = (iconWidth / 2) * 3
			end
			iconOffset = math.max(0, ((iconHeight - iconWidth) / 2))
		else
			iconBG = "1x1 default"
		end
	end
	
	iconOut = "<div class='recipe__icon' style='width:" .. iconWidth .. "px;'>"
	
	if iconBG then
		iconOut = iconOut .. "<span class='recipe__icon__bg'>[[File:" .. iconBG .. " bg.png|" .. iconWidth .. "px|link=]]</span>"
	end
	
	iconOut = iconOut .. "<span class='recipe__icon__img' style='top:" .. iconOffset .. "px;'>[[File:" .. image .. "|" .. iconWidth .. "px|link=" .. name .. "|" .. name .. "]]</span><span class='recipe__icon__pseudo' style='width:" .. iconWidth .. "px;'><span class='recipe__icon__pseudo__img' style='height:" .. iconHeight .. "px;width:" .. iconWidth .. "px;'></span>×0</span>"
	
	if quantity > 1 then
		iconOut = iconOut .. "<span class='recipe__icon__quantity' style='top:" .. iconHeight .. "px;'>×" .. quantity .. "</span>"
	end
	
	return iconOut .. "</div>"
end

function p.createRecipe(frame, data)
	local args = getArgs(frame)
	local output = "<div class='recipe'>"
	local arrow = "<div class='recipe__step'><div class='recipe__step__arrow'>[[File:Item Arrow.png|20px|link=]]</div><span class='recipe__step__pseudo'><span class='recipe__step__pseudo__img'></span>×0</span></div>"
	
	-- First, get the ID of the product item provided by template; pagename used by default
	local id = args[1] or mw.title.getCurrentTitle().text
	local itemID = p.getItemID(id, data)
	if not itemID then error("Could not find recipe for item '" .. id .. "'") end
	
	-- Item is found, start processing it
	if data[itemID].original then
		-- If the item is made as part of a different item's recipe
		error ("No standalone recipe for item '" .. itemID .. "' (use '" .. data[itemID].original .. "' instead)")
	else
		if data[itemID].recipe and data[itemID].machine then
			-- Recipe is found, start creating the output
			output = output .. "<div class='recipe__machine'>"
			local machineID = data[itemID].machine
			if not data[machineID] then
				error ("Invalid machine listed in recipe for item '" .. itemID .. "'")
			end
			local iconMachine = p.createIcon(machineID, 0, data, false)
			output = output .. iconMachine .. "</div>"
			
			output = output .. arrow .. "<div class='recipe__ingredients'>"
			for i,v in ipairs(data[itemID].recipe) do
				local icon = p.createIcon(v[1], v[2], data, true)
				output = output .. icon
			end
			output = output .. "</div>"
			
			output = output .. arrow .. "<div class='recipe__output'>"
			local outNum = data[itemID].quantity or 1
			local iconProduct = p.createIcon(itemID, outNum, data, false)
			output = output .. iconProduct
			if data[itemID].additional then
				local addOut = data[itemID].additional
				local addIcon
				for i,v in ipairs(addOut) do
				    addIcon = p.createIcon(v[1], v[2], data, false)
				    output = output .. addIcon
				end
			end
			output = output .. "</div>"
			
			return output .. "</div>"
		else
			-- If there is no recipe for the item
			error ("Cannot craft item '" .. itemID .. "' (use Template:Uses instead)")
		end
	end
end

function p.SN(frame)
	return p.createRecipe(frame, dataSN)
end

function p.BZ(frame)
	return p.createRecipe(frame, dataBZ)
end

return p
-- </nowiki>