Módulo:RecursiveQuestreq

De RuneScape Wiki
Ir para: navegação, pesquisa
Documentação do módulo
Esta documentação é transcluída de Predefinição:Sem documentação/doc. [editar] [atualizar]
Este módulo não possui nenhuma documentação. Por favor, considere adicionar uma documentação em Módulo:RecursiveQuestreq/doc. [editar]
Módulo:RecursiveQuestreq's a função renderSkills é invocada por Predefinição:Recursive Questreq/doc.
Módulo:RecursiveQuestreq's a função renderSkills é invocada por Predefinição:Recursive Questreq.
Módulo:RecursiveQuestreq requer Módulo:Missões necessárias.
Módulo:RecursiveQuestreq requer Módulo:Ícone.

local p = {} -- p stands for package
local skillpic = require('Módulo:Ícone')._main

local function getSkillsDirect(questname)
	local result = mw.smw.ask({'[[' .. questname .. ']]','?Quest JSON'})
	
	if result == nil then -- No such quest
		return {},{[questname]=true}
	end
	if result[1]['Quest JSON'] == nil then -- No such quest
		return {},{[questname]=true}
	end
	
	local jsonText = mw.text.decode(result[1]['Quest JSON'])
	local jsonObj = mw.text.jsonDecode(jsonText)

	local text = mw.text.split(jsonObj['requirements'], '\n', true)
	local skillsTable = {}
	local otherTable = {}
	
	--skip first thing, the quests
	for i = 1,table.getn(text) do
		local line = text[i]
		if line == '' then
			---empty, skip
		elseif(string.find(line, '^*') and string.find(line,"%S %S+ %S")) then --something fairly normal
			local level, skillName = line:match('([0-9]+) %[%[Arquivo:.-%]%] %[%[(.-)%]%]')
			if(tonumber(level) ~= nil) then
				level = tonumber(level)
				skillsTable[skillName] = level
			else --wasn't a skill, just put it in verbatim
				otherTable[string.sub(line,2)] = true -- trim off leading "* "
			end
		elseif(string.find(line,"ecomendados", 1, true)) then
			-- everything after isn't needed, skip and leave
			break
		elseif(string.find(line,"Independente", 1, true)) then
			-- this is not needed for most people. Could later be written to keep track of separately
			break
		elseif(line == "''Para recompensas completas:''") then
			-- just skip this line
		elseif(line:find('questreq')) then
			-- recursive quest requirements, but we already get those from Module:Questreq
		else
			--unknown, this is usually a comment about something not being required, leave it out
			--otherTable[line] = true
		end
	end
	return skillsTable, otherTable
end

function p.getSkillsDirect(frame)
	local questname = frame.args['name']
	local skillsOnly = frame.args['skillonly'] == 'true'
	mw.log(skillsOnly)
	
	local skillsTable,otherTable = getSkillsDirect(questname)
	
	if not skillsOnly then
		for req,_ in pairs(otherTable) do
			table.insert(skillsTable, req)
		end
	end
	
	if(frame.args['dump'] == 'true') then
		skillsTable = mw.dumpObject(skillsTable)
	end
	
	return skillsTable
end

function p.getSkills(questname)
	local questreq = require('Módulo:Missões_necessárias')
    local subquests = questreq.JSON_reqs(questname,1,10);
	
	local lvlret = {}
	local otherret = {}
	local questret = {}
	local qpReq = -1
	
	for subquest,_ in pairs(subquests) do
		
		if string.find(subquest,"pontos de missão", 1, true) then --not a quest, but rather QP data
			qpnum = tonumber(mw.text.split(subquest, " ", true)[1])
			qpReq = math.max(qpReq, qpnum)
			
		elseif string.find(subquest,"[[", 1, true) then --not a quest, but rather some other activity
			table.insert(otherret, subquest)
			
		else
			lvlreqs,otherreq = getSkillsDirect(subquest)
		
			for skill,lvl in pairs(lvlreqs) do
				if (lvlret[skill] == nil) or (lvlret[skill] < lvl) then
					lvlret[skill] = lvl
				end
			end
			
			for other,_ in pairs(otherreq) do
				table.insert(otherret, other)
			end
			
			--record the quest, unless it's actually this quest already
			if subquest ~= questname then
				table.insert(questret, '[['..subquest..']]')
			end
		end
	end
	
	if qpReq > 0 then
		table.insert(questret, qpReq..' [[pontos de missão]]')
	end
	
	table.sort(questret)
	table.sort(otherret)
	
	return lvlret, otherret, questret
end

function p.renderSkills(frame)
	local questname = frame.args['name']
	lvlreqs, otherreqs, subquests = p.getSkills(questname)
	
	ret = mw.html.create('div')
	
	--All skill requirements
	skilltable = ret:tag('table')
						:tag('tr')
							:tag('th')
								:css('text-align','left')
								:wikitext('Requisitos de nível:')
							:done()
						:done()
						:tag('tr')
							:tag('td')
								:addClass('qc-active')
								:tag('ul')
	
	for skill,lvl in pairs(lvlreqs) do
		skilltable:tag('li')
						:wikitext(lvl .. skillpic(skill) .. ' [[' .. skill .. ']]')
				   :done()
	end
	
	-- All quests required
	questtable = ret:tag('table')
					:addClass('mw-collapsible')
					:addClass('mw-collapsed')
					:css('background','none')
                        :tag('tr')
							:tag('th')
								:css('text-align','left')
								:wikitext('Missões necessárias:')
							:done()
						:done()
						:tag('tr')
							:tag('td')
								:addClass('qc-active')
								:tag('ul')
								
	for _,subquest in ipairs(subquests) do
		questtable:tag('li'):wikitext(subquest):done()
	end
	
	-- All other miscellaneous requirements
	othertable = ret:tag('table')
					:addClass('mw-collapsible')
					:addClass('mw-collapsed')
					:css('background','none')
                        :tag('tr')
							:tag('th')
								:css('text-align','left')
								:wikitext('Outros:')
							:done()
						:done()
						:tag('tr')
							:tag('td')
								:tag('ul')
								
	for _,otherreq in ipairs(otherreqs) do
		othertable:tag('li'):wikitext(otherreq):done()
	end
	
	return tostring(ret)
end

return p