Jump to content

Module:Craft Usage

From MISERY wiki
Revision as of 14:37, 23 May 2026 by imported>JarlHiemas
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Craft Usage/doc

local p = {}
local recipeParams = {
  station = 'station',
  time = 'time',
  output = 'output',
  yield = 'yield',
}

local labels = {
	craftTitle = 'Crafting',
	craftInputText = 'The item can be used in the following craft recipes',
	craftOutputText = 'The item can be created in the following craft recipes',
	incineratorTitle = 'Incinerator',
	incineratorInputText = 'The item can be used in the following incinerator recipes',
	incineratorOutputText = 'The item can be created in the following incinerator recipes',
	cookingTitle = 'Cooking',
	cookingInputText = 'The item can be used in the following cooking recipes',
	cookingOutputText = 'The item can be created in the following cooking recipes',
	farmingTitle = 'Farming',
	farmingInputText = 'The item can be used to farm the following items',
	farmingOutputText = 'The item can be grown from the following items',
	waterTitle = 'Water Source',
	waterInputText = 'The item can be used at a water source to gain the following items',
	waterOutputText = 'The item can be gained at a water source by using the following items the following items',
}

function split(str, delimiter)
    local returnTable = {}
    for k, v in string.gmatch(str, "([^" .. delimiter .. "]+)") 
    do
        returnTable[#returnTable+1] = k
    end
    return returnTable
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		parentFirst = true,
		wrapper = { 'Template:Craft_Usage' }
	})

	if not args.item then
		args.item = mw.title.getCurrentTitle().text	
	end

	local title = mw.title.new('Recipes')	
	local content = title:getContent()

	local recipeStringResult = ''
	for recipe in content:gmatch('{{Recipe|[^}]*}}') do
		recipeStringResult = recipeStringResult..recipe
	end

	local recipes = {
		craftRecipes = {},
		incineratorRecipes = {},
		cookingRecipes = {},
		farmingRecipes = {},
		waterRecipes = {}
	}

	for recipeKey, recipe in pairs(split(recipeStringResult, '}}{{')) do
		local typeKey = 'craftRecipes'
		local recipeTable = {}
		local inputText = ''
		local inputs = {}
		local outputs = {}
		for propertyStringKey, propertyString in pairs(split(recipe, '|')) do
			if not (propertyString  == 'Recipe') then
				local propertySplitTable = split(propertyString, '=')

				if not recipeParams[propertySplitTable[1]] then
					inputText = inputText..'[['..propertySplitTable[1]..']]'..' x '..propertySplitTable[2]..'</br>'
					inputs[propertySplitTable[1]] = true
				else
					recipeTable[propertySplitTable[1]] = propertySplitTable[2]
					
					if propertySplitTable[1] == 'output' then
						outputs[propertySplitTable[2]] = true
					elseif propertySplitTable[1] == 'station' then
						inputs[propertySplitTable[2]] = true
					end
				end
			end
		end

		recipeTable['inputText'] = inputText
		
		if recipeTable.station == 'Incinerator' then
			typeKey = 'incineratorRecipes'
		elseif recipeTable.station == 'Cooking' then
			typeKey = 'cookingRecipes'
		elseif recipeTable.station == 'Farming' then
			typeKey = 'farmingRecipes'
		elseif recipeTable.station == 'Water Source' then
			typeKey = 'waterRecipes'
		end

		if (args.mode == 'input' and inputs[args.item]) or (args.mode == 'output' and outputs[args.item]) then
			table.insert(recipes[typeKey], recipeTable)
		end
	end
	
	local wrapper = mw.html.create('div')
	
	if recipes.craftRecipes[1] then
		local craftWrapper = wrapper:tag('div')

		local craftTitleWrapper = craftWrapper:tag('h3')
		local craftTitle = craftTitleWrapper:tag('span'):addClass('mw-headline'):wikitext(labels.craftTitle)
		
		local craftTextLabel = ''
		if args.mode == 'input' then
			craftTextLabel = labels.craftInputText
		elseif args.mode == 'output' then
			craftTextLabel = labels.craftOutputText
		end
	
		local craftText = craftWrapper:tag('p'):wikitext(craftTextLabel)
		
		local _table = craftWrapper:tag('table'):addClass('fandom-table article-table sortable alternating-colors-table')
		local tr = _table:tag('tr')
		tr:tag('th'):wikitext('Ingredients')
		tr:tag('th'):wikitext('Station')
		tr:tag('th'):wikitext('Time')
		tr:tag('th'):wikitext('Output')
	
		for recipeKey, recipe in pairs(recipes.craftRecipes) do
			if recipe.output then
				local tr = _table:tag('tr')
				tr:tag('td'):wikitext(recipe.inputText or " - ")
		
				tr:tag('td'):wikitext(recipe.station and '[['..recipe.station..']]' or " - ")
		
				tr:tag('td'):wikitext(recipe.time or " - ")
		
				tr:tag('td'):wikitext('[['..recipe.output..']]'.." x "..(recipe.yield or 1))
			end
		end
	end

	if recipes.incineratorRecipes[1] then
		local incineratorWrapper = wrapper:tag('div')

		local incineratorTitleWrapper = incineratorWrapper:tag('h3')
		local incineratorTitle = incineratorTitleWrapper:tag('span'):addClass('mw-headline'):wikitext(labels.incineratorTitle)
		
		local incineratorTextLabel = ''
		if args.mode == 'input' then
			incineratorTextLabel = labels.incineratorInputText
		elseif args.mode == 'output' then
			incineratorTextLabel = labels.incineratorOutputText
		end
	
		local incineratorText = incineratorWrapper:tag('p'):wikitext(incineratorTextLabel)
		
		local _table = incineratorWrapper:tag('table'):addClass('fandom-table article-table sortable alternating-colors-table')
		local tr = _table:tag('tr')
		tr:tag('th'):wikitext('Ingredients')
		tr:tag('th'):wikitext('Output')
	
		for recipeKey, recipe in pairs(recipes.incineratorRecipes) do
			if recipe.output then
				local tr = _table:tag('tr')
				tr:tag('td'):wikitext(recipe.inputText or " - ")
		
				tr:tag('td'):wikitext('[['..recipe.output..']]'.." x "..(recipe.yield or 1))
			end
		end
	end

	if recipes.cookingRecipes[1] then
		local cookingWrapper = wrapper:tag('div')

		local cookingTitleWrapper = cookingWrapper:tag('h3')
		local cookingTitle = cookingTitleWrapper:tag('span'):addClass('mw-headline'):wikitext(labels.cookingTitle)
		
		local cookingTextLabel = ''
		if args.mode == 'input' then
			cookingTextLabel = labels.cookingInputText
		elseif args.mode == 'output' then
			cookingTextLabel = labels.cookingOutputText
		end
	
		local cookingText = cookingWrapper:tag('p'):wikitext(cookingTextLabel)
		
		local _table = cookingWrapper:tag('table'):addClass('fandom-table article-table sortable alternating-colors-table')
		local tr = _table:tag('tr')
		tr:tag('th'):wikitext('Ingredients')
		tr:tag('th'):wikitext('Output')
	
		for recipeKey, recipe in pairs(recipes.cookingRecipes) do
			if recipe.output then
				local tr = _table:tag('tr')
				tr:tag('td'):wikitext(recipe.inputText or " - ")
		
				tr:tag('td'):wikitext('[['..recipe.output..']]'.." x "..(recipe.yield or 1))
			end
		end
	end

	if recipes.farmingRecipes[1] then
		local farmingWrapper = wrapper:tag('div')

		local farmingTitleWrapper = farmingWrapper:tag('h3')
		local farmingTitle = farmingTitleWrapper:tag('span'):addClass('mw-headline'):wikitext(labels.farmingTitle)
		
		local farmingTextLabel = ''
		if args.mode == 'input' then
			farmingTextLabel = labels.farmingInputText
		elseif args.mode == 'output' then
			farmingTextLabel = labels.farmingOutputText
		end
	
		local farmingText = farmingWrapper:tag('p'):wikitext(farmingTextLabel)
		
		local _table = farmingWrapper:tag('table'):addClass('fandom-table article-table sortable alternating-colors-table')
		local tr = _table:tag('tr')
		tr:tag('th'):wikitext('Ingredients')
		tr:tag('th'):wikitext('Output')
	
		for recipeKey, recipe in pairs(recipes.farmingRecipes) do
			if recipe.output then
				local tr = _table:tag('tr')
				tr:tag('td'):wikitext(recipe.inputText or " - ")
		
				tr:tag('td'):wikitext('[['..recipe.output..']]'.." x "..(recipe.yield or 1))
			end
		end
	end

	if recipes.waterRecipes[1] then
		local waterWrapper = wrapper:tag('div')

		local waterTitleWrapper = waterWrapper:tag('h3')
		local waterTitle = waterTitleWrapper:tag('span'):addClass('mw-headline'):wikitext(labels.waterTitle)
		
		local waterTextLabel = ''
		if args.mode == 'input' then
			waterTextLabel = labels.waterInputText
		elseif args.mode == 'output' then
			waterTextLabel = labels.waterOutputText
		end
	
		local waterText = waterWrapper:tag('p'):wikitext(waterTextLabel)
		
		local _table = waterWrapper:tag('table'):addClass('fandom-table article-table sortable alternating-colors-table')
		local tr = _table:tag('tr')
		tr:tag('th'):wikitext('Ingredients')
		tr:tag('th'):wikitext('Output')
	
		for recipeKey, recipe in pairs(recipes.waterRecipes) do
			if recipe.output then
				local tr = _table:tag('tr')
				tr:tag('td'):wikitext(recipe.inputText or " - ")
		
				tr:tag('td'):wikitext('[['..recipe.output..']]'.." x "..(recipe.yield or 1))
			end
		end
	end


	return wrapper
end

return p