Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Crafting

From Mine in Abyss
Revision as of 02:42, 17 July 2024 by minecraft>Mudscape (Add hash of json to subname to ensure uniqueness)

This module implements {{crafting}}.

Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former).

Dependencies

See also


cs:Modul:Crafting de:Modul:Herstellen es:Módulo:Fabricación fr:Module:Fabrication it:Modulo:Fabbricazione ja:モジュール:Crafting ko:모듈:Crafting lzh:模組:Crafting nl:Module:Vervaardiging pl:Moduł:Crafting pt:Módulo:Crafting ru:Модуль:Крафт th:มอดูล:Crafting uk:Модуль:Майстрування zh:Module:Crafting



local p = {}

local i18n = {
	moduleArgs = [[Module:ProcessArgs]],
	moduleRecipe = [[Module:Recipe table]],
	moduleSlot = [[Module:Inventory slot]],
	moduleAliases = [[Module:Inventory slot/Aliases]],
	type = 'Crafting'
}
p.i18n = i18n

local slot = require( i18n.moduleSlot )
local recipeTable = require( i18n.moduleRecipe ).table
local aliases = require( i18n.moduleAliases)
local cArgVals = { 'A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3' }
p.cArgVals = cArgVals

function p.table( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( i18n.moduleArgs ).merge( true )
	else
		f = mw.getCurrentFrame()
	end
	
	-- Automatic shapeless positioning
	if args[1] then
		args.shapeless = 1
		if args[7] then
			args.A1 = args[1]
			args.B1 = args[2]
			args.C1 = args[3]
			args.A2 = args[4]
			args.B2 = args[5]
			args.C2 = args[6]
			if args[8] then
				-- ◼◼◼      ◼◼◼
				-- ◼◼◼  OR  ◼◼◼
				-- ◼◼◼      ◼◼◻
				args.A3 = args[7]
				args.B3 = args[8]
				args.C3 = args[9]
				if args[9] then
					local identical = true
					for i = 1, 8 do
						if args[i] ~= args[i + 1] then
							identical = false
							break
						end
					end
					if identical then
						args.shapeless = nil
					end
				end
			else
				-- ◼◼◼
				-- ◼◼◼
				-- ◻◼◻
				args.B3 = args[7]
			end
		elseif args[2] then
			args.A2 = args[1]
			args.B2 = args[2]
			if args[5] then
				-- ◻◻◻      ◻◻◻
				-- ◼◼◼  OR  ◼◼◼
				-- ◼◼◼      ◼◼◻
				args.C2 = args[3]
				args.A3 = args[4]
				args.B3 = args[5]
				args.C3 = args[6]
			elseif args[4] then
				-- ◻◻◻
				-- ◼◼◻
				-- ◼◼◻
				args.A3 = args[3]
				args.B3 = args[4]
			else
				-- ◻◻◻      ◻◻◻
				-- ◼◼◻  OR  ◼◼◻
				-- ◻◼◻      ◻◻◻
				args.B3 = args[3]
			end
		else
			-- ◻◻◻
			-- ◻◼◻
			-- ◻◻◻
			args.B2 = args[1]
			args.shapeless = nil
		end
		
		for i = 1, 9 do
			args[i] = nil
		end
	end
	
	-- Create recipe table, and list of ingredients
	local out, ingredientSets, outputSets = recipeTable( args, {
		uiFunc = 'craftingTable',
		type = i18n.type,
		ingredientArgs = cArgVals,
		outputArgs = { 'Output' },
	} )
	
	local title = mw.title.getCurrentTitle()
	if args.ignoreusage or args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then
		return out
	end
	
	-- SMW
	-- Json contains the full frames, the other SMW properties are just item names.
	local smw_json = {
		["type"] = args.type,
		["shapeless"] = args.shapeless,
		["fixed"] = args.fixed,
		["notfixed"] = args.notfixed,
		["description"] = mw.text.unstrip(args.description or ''), --Remove ref tags
		["name"] = args.name,
		["ingredients"] = args.ingredients,
		["nocat"] = args.nocat,
		["A1"] = args.A1,
		["A2"] = args.A2,
		["A3"] = args.A3,
		["B1"] = args.B1,
		["B2"] = args.B2,
		["B3"] = args.B3,
		["C1"] = args.C1,
		["C2"] = args.C2,
		["C3"] = args.C3,
		["Output"] = args.Output,
		["group"] = args.group
	}
	
	-- Flatten the item sets into a simple list
	local function makeNameList(itemSets)
		local retTable = {}
		local inputRetTable = {}
		local usedNames = {}
		for _, itemSet in pairs(itemSets) do
			for _, item in pairs(itemSet) do
				--local name = item.mod .. ":" .. item.name     -- use instead of just item.name if mods are covered
				if not usedNames[item.name] then
					table.insert(retTable, item.name)
					table.insert(inputRetTable, item.name)
					usedNames[item.name] = true
					
					if aliases[item.name] then
						for _, aliasEntry in ipairs(aliases[item.name])	do
							if not usedNames[aliasEntry] then
								table.insert(retTable, (aliasEntry.name or aliasEntry)) -- Sometimes the alias entry is a table, so try and grab its name from within the table with a fallback to just the entry.
								usedNames[aliasEntry] = true
							end
						end
					end
				end
			end
		end
		return retTable, inputRetTable
	end
	
	local output_names, original_output_names = makeNameList(outputSets)
	local ingredient_names, original_ingredient_names = makeNameList(ingredientSets)
	local group_names = {}
	if args.group then
		for name in string.gmatch(args.group, "[^,]+") do
			table.insert(group_names, mw.text.trim(name))
		end
	end
	
	local json = mw.text.jsonEncode(smw_json)
	local smw_sub = {}
	-- We must have a unique subname since Crafting usage cannot handle when multiple json entries are within one sub object.
	local subname = 'CRAFTING_OUT_'..table.concat(original_output_names,'_'):sub(1,100)..'_IN_'..table.concat(original_ingredient_names,'_'):sub(1,100)..'_'..mw.hash.hashValue("md4",json)
	local smw_sub = { -- the actual SMW sub-object
		['Crafting ingredient'] = ingredient_names,
		['Crafting output'] = output_names,
		['Crafting JSON'] = json,
		['Crafting type'] = args.type
	}
	mw.smw.subobject(smw_sub, subname)
	
	return out
end

return p