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

Documentation for this module may be created at Module:Item/Mod/doc

local mods = require('Module:Item/ModList')
local item = {}

function joinWithConnector(list, connector)
	connector = connector or 'and'
    local n = #list
    if n == 0 then
        return ''
    elseif n == 1 then
        return list[1]
    elseif n == 2 then
        return list[1] .. ' ' .. connector ..  ' ' .. list[2]
    elseif n >= 3 then
        local firstPart = table.concat(list, ', ', 1, n - 1)
        return firstPart .. ', ' .. connector ..  ' ' .. list[n]
    end
end
function startsWith(str, prefix)
	return str:sub(1, #prefix) == prefix
end
function length(obj)
	local count = 0
	for _ in pairs(obj) do 
		count = count + 1 
	end
	return count;
end
function nonEmpty(value, fallback)
	if value == nil or value == '' then
        return fallback
    else
        return value
    end
end

function parseArgs(args)
	local keys = {}
	for k, _ in pairs(args) do
		if type(k) == 'number' then
			table.insert(keys, k)
		end
	end
	return keys
end
function debugResult(var, debugFlag)
   if debugFlag == '1' then 
       return '<pre>' .. var .. '</pre>'
   else
       return mw.getCurrentFrame():preprocess(var)
   end
end


function parseNotes(args)
	local notes = ''
	local categories = {}
	local keys = parseArgs(args)
	local currentPage = mw.title.getCurrentTitle()

    for i = 2, #keys do
		local argIndex = keys[i]
		local key = args[argIndex]
		local mod = mods[key]

		if mod ~= nil then
			if type(mod) == 'function' then
				mod = mod(args)
			end
            if  mod['hide_mod_category'] ~= true
            and currentPage 
            and not startsWith(currentPage.text, mod['mod_category'] .. '/') then
			    table.insert(categories, "''[[" .. mod['mod_category'] .. '|'.. mod['label'] .."]]''")
            end
			if mod.notes ~= '' then
                notes = notes .. '|' .. mod.notes
            end
		end
	end
    categories = joinWithConnector(categories, args["connector"])
    if categories ~= '' then
		notes =  '|Also grants ' .. categories .. notes
	end

	for i = 1, 2 do
		local note = args['note_' .. i] or ''
		if note ~= '' then
			notes = notes .. '|' .. note
		end
	end
	return notes
end

function item.parseDescription(args)
	local parsedEffects = {}
	local categories = {}
	local addCat = not args['no_cat']
	local keys = parseArgs(args)

	for i = 2, #keys do
		local argIndex = keys[i]
		local key = args[argIndex]
		local mod = mods[key]

		if mod ~= nil then
			if type(mod) == 'function' then
				mod = mod(args)
			end
			if addCat then
				table.insert(categories, '[[' .. mod.category .. ']]')
			end
			if mod.description ~= '' then
				table.insert(parsedEffects, mod.description)
			end
		end
	end
	
	if (#keys - #parsedEffects) ~= 1 and addCat then
		table.insert(categories, '[[Category:ItemModError]]')
	end

	return {
		description = joinWithConnector(parsedEffects, args['connector']),
		categories = table.concat(categories)
	}
end

function item.description(frame) 
	local parent = frame:getParent().args
	local title = parent['title'] or mw.title.getCurrentTitle().text or 'unknown'
	local label = parent['label'] or parent[1]
    local parsedEffects =  item.parseDescription(parent)
    local baseSentence = "When equipped, the '''" .. mw.text.nowiki(title) .. "''' grants the ''" .. mw.text.nowiki(label) .. "'' [[Mods|mod]]"
    local fullSentence
    
    if parsedEffects.description == '' then 
    	fullSentence = baseSentence .. '.'
    else 
    	fullSentence = baseSentence .. ', which allows the player to ' .. parsedEffects.description .. '.'
    end
    return fullSentence .. parsedEffects.categories
end

function item.table(frame) 
	local parent = frame:getParent().args
	local name = parent['title'] or '%PAGE%'
	local label = parent['label'] or parent[1]
	local notes = parseNotes(parent) 

	return '\n{{Mod|' .. name .. '|' .. label  .. notes .. '}}'
end

function item.documentation(frame)
	local doc = {}
	local args = {
		misc = '<span style="background:#FF9999">misc</span>',
		skin = '<span style="background:#FF9999">skin</span>',
		gem_chance = '<span style="background:#FF9999">gem_chance</span>',
		block_chance = '<span style="background:#FF9999">block_chance</span>'
	}
	table.insert(doc, '{|class="article-table" border="0" cellpadding="1" cellspacing="1" width="100%"')
	table.insert(doc, '|-')
	table.insert(doc, '! scope="col" style="width:15%" |Parameter')
	table.insert(doc, '! scope="col" style="width:10%" |Value')
	table.insert(doc, '! scope="col" style="width:75%" |Meaning')
	table.insert(doc, '|-')
	table.insert(doc, '| rowspan=' .. length(effect) .. ' | <span style="background:#FF9999">Mod</span>')
	
	for k, v in pairs(effect) do
		table.insert(doc, "|'''" .. k .. "'''")
    	if type(v) == 'function' then
    		local defaultValue = v({}).description
    		local value = v(args).description
    		if(defaultValue == value) then
    			table.insert(doc, '|' .. nonEmpty(defaultValue, "''No default value''"))
    		else 
    			table.insert(doc, '|' .. '{{Bullet}} ' .. nonEmpty(defaultValue, "''No default value''") .. '<br>{{Bullet}} ' .. value)
    		end
        else
            table.insert(doc, '|' .. v)
    	end
    table.insert(doc, '|-')
	end
	table.insert(doc, '|}')
	return debugResult(table.concat(doc, '\n'), frame.args['debug'])
end

return item