<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AQuestreq</id>
	<title>Module:Questreq - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AQuestreq"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Questreq&amp;action=history"/>
	<updated>2026-05-12T16:14:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Questreq&amp;diff=35082&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;--  -- Part of Template:Questreq&#039;s implementation -- For information on how to update this page, please see Module talk:Questreq -- &lt;nowiki&gt; --  local p = {}  -- Load data from quest list local reqData = mw.loadData(&#039;Module:Questreq/data&#039;)  -- Main function function p.main(frame) 	local args = frame:getParent().args 	local name = args[1]:gsub(&#039;&amp;#39;&#039;, &quot;&#039;&quot;) 	local option = tonumber(args[3]) or 9  	local closed = args[4] ~= &#039;open&#039;     if args[2] == &#039;quests&#039; then...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Questreq&amp;diff=35082&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--  -- Part of &lt;a href=&quot;/w/Template:Questreq&quot; title=&quot;Template:Questreq&quot;&gt;Template:Questreq&lt;/a&gt;&amp;#039;s implementation -- For information on how to update this page, please see &lt;a href=&quot;/index.php?title=Module_talk:Questreq&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module talk:Questreq (page does not exist)&quot;&gt;Module talk:Questreq&lt;/a&gt; -- &amp;lt;nowiki&amp;gt; --  local p = {}  -- Load data from quest list local reqData = mw.loadData(&amp;#039;Module:Questreq/data&amp;#039;)  -- Main function function p.main(frame) 	local args = frame:getParent().args 	local name = args[1]:gsub(&amp;#039;&amp;#039;&amp;#039;, &amp;quot;&amp;#039;&amp;quot;) 	local option = tonumber(args[3]) or 9  	local closed = args[4] ~= &amp;#039;open&amp;#039;     if args[2] == &amp;#039;quests&amp;#039; then...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &lt;br /&gt;
-- Part of [[Template:Questreq]]&amp;#039;s implementation&lt;br /&gt;
-- For information on how to update this page, please see [[Module talk:Questreq]]&lt;br /&gt;
-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Load data from quest list&lt;br /&gt;
local reqData = mw.loadData(&amp;#039;Module:Questreq/data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Main function&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local name = args[1]:gsub(&amp;#039;&amp;amp;#39;&amp;#039;, &amp;quot;&amp;#039;&amp;quot;)&lt;br /&gt;
	local option = tonumber(args[3]) or 9 &lt;br /&gt;
	local closed = args[4] ~= &amp;#039;open&amp;#039;&lt;br /&gt;
    if args[2] == &amp;#039;quests&amp;#039; then&lt;br /&gt;
        return p._main_quests(name,option,closed)&lt;br /&gt;
    elseif args[2] == &amp;#039;skills&amp;#039; then &lt;br /&gt;
        return p._main_skills(name)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main_quests(quest,limit,closed)&lt;br /&gt;
 &lt;br /&gt;
    local closedCss = &amp;#039;&amp;#039;&lt;br /&gt;
    if closed then&lt;br /&gt;
        closedCss = &amp;#039;mw-collapsed&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        closedCss = &amp;#039;mw-open&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
	return mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mw-collapsible&amp;#039;)&lt;br /&gt;
			:addClass(closedCss)&lt;br /&gt;
			:addClass(&amp;#039;questreq&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;background&amp;#039;,&amp;#039;none&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;text-align&amp;#039;,&amp;#039;left&amp;#039;)&lt;br /&gt;
			:wikitext(&amp;#039;[[File:Quest point icon.png|21x21px|link=]] Quests:&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding-left&amp;#039;,&amp;#039;25px&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;ul&amp;#039;)&lt;br /&gt;
                    :css(&amp;#039;list-style-type&amp;#039;,&amp;#039;none&amp;#039;)&lt;br /&gt;
                    :css(&amp;#039;list-style-image&amp;#039;,&amp;#039;none&amp;#039;)&lt;br /&gt;
                    :css(&amp;#039;padding-left&amp;#039;,&amp;#039;10px&amp;#039;)&lt;br /&gt;
                    :node( list_reqs(quest,1,limit) )&lt;br /&gt;
				:done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Recursive list function&lt;br /&gt;
-- Level determines how deep the indentation is&lt;br /&gt;
-- Replaces &amp;#039;Started:&amp;#039; modifier&lt;br /&gt;
-- If the quest just listed was found in the big list and the limit for level is not reached&lt;br /&gt;
-- the quest&amp;#039;s requirements will be listed as a sublist 1 level deeper&lt;br /&gt;
--&lt;br /&gt;
function list_reqs(quest,level,limit)&lt;br /&gt;
    local req_name, sub_req_list&lt;br /&gt;
    if quest then&lt;br /&gt;
        local started&lt;br /&gt;
        -- Look for the &amp;#039;Started:&amp;#039; modifier and replace it&lt;br /&gt;
        -- If found, set boolean to true&lt;br /&gt;
        if quest:find(&amp;#039;Started:&amp;#039;) then&lt;br /&gt;
            quest = quest:gsub(&amp;#039;Started:%s*&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
            started = true&lt;br /&gt;
        end&lt;br /&gt;
        -- Look for quest in the list&lt;br /&gt;
        local subreqs = reqData[quest][&amp;#039;quests&amp;#039;]&lt;br /&gt;
        if subreqs then&lt;br /&gt;
            if started then&lt;br /&gt;
                req_name = &amp;#039;Started &amp;#039; .. tidy_link(quest)&lt;br /&gt;
            else&lt;br /&gt;
                req_name = tidy_link(quest)&lt;br /&gt;
            end&lt;br /&gt;
            -- For every requirement, call this function again&lt;br /&gt;
            -- Handled the same, but 1 level deeper&lt;br /&gt;
            -- If limit is reached, denote extra requirements exist with ellipses&lt;br /&gt;
            if subreqs[1] then&lt;br /&gt;
                if level &amp;lt;= limit then&lt;br /&gt;
                    sub_req_list = mw.html.create(&amp;#039;ul&amp;#039;)&lt;br /&gt;
                                    :css(&amp;#039;list-style-type&amp;#039;,&amp;#039;none&amp;#039;)&lt;br /&gt;
                    				:css(&amp;#039;list-style-image&amp;#039;,&amp;#039;none&amp;#039;)&lt;br /&gt;
                                    :css(&amp;#039;padding-left&amp;#039;,&amp;#039;10px&amp;#039;)&lt;br /&gt;
                    for i, q in ipairs(subreqs) do&lt;br /&gt;
                        local sub_list = list_reqs(q,level+1,limit)&lt;br /&gt;
                        sub_req_list:node(sub_list)&lt;br /&gt;
                    end&lt;br /&gt;
                    sub_req_list:done()&lt;br /&gt;
                else&lt;br /&gt;
                    req_name = req_name .. &amp;#039;…&amp;#039;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
        -- If the requirement can&amp;#039;t be found in the big list&lt;br /&gt;
        -- Paste it as is and skip any attempt to make a sublist&lt;br /&gt;
        req_name = quest&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local ret = mw.html.create(&amp;#039;li&amp;#039;)&lt;br /&gt;
    :wikitext(req_name)&lt;br /&gt;
    &lt;br /&gt;
    if sub_req_list then&lt;br /&gt;
        ret:node(sub_req_list)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return ret:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Function to tidy quest names into links&lt;br /&gt;
-- Any parenthetical (e.g. &amp;#039;(quest)&amp;#039;) will be removed from the text, but remain in the link&lt;br /&gt;
-- &amp;#039;Recipe for Disaster/&amp;#039; will be replaced in the RfD subquests, so that only the subquest name appears as text&lt;br /&gt;
-- Returns a link&lt;br /&gt;
-- The &amp;#039;Full:&amp;#039; modifier is removed&lt;br /&gt;
--&lt;br /&gt;
function tidy_link(name)&lt;br /&gt;
	if name then&lt;br /&gt;
		if name:find(&amp;#039;Full:&amp;#039;) then&lt;br /&gt;
			name = name:sub(6)&lt;br /&gt;
		end&lt;br /&gt;
		local alt = name:match(&amp;#039;(.*)%(.*%)&amp;#039;) or name&lt;br /&gt;
 &lt;br /&gt;
		if name:find(&amp;#039;Recipe for Disaster%/&amp;#039;) then&lt;br /&gt;
			alt = name:gsub(&amp;#039;Recipe for Disaster%/&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
 &lt;br /&gt;
		name = string.format(&amp;#039;[[%s|%s]]&amp;#039;,name,alt)&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main_skills(name)&lt;br /&gt;
    --variables needed for parsing and ordering skill reqs&lt;br /&gt;
    local subreqs = reqData[name][&amp;#039;skills&amp;#039;]&lt;br /&gt;
    &lt;br /&gt;
    local imp_reqs = {}         --ironman priority keys&lt;br /&gt;
    local imnp_reqs = {}        --ironman non-priority keys&lt;br /&gt;
    local nimp_reqs = {}        --non-ironman priority keys&lt;br /&gt;
    local nimnp_reqs = {}       --non-ironman non-priority keys&lt;br /&gt;
    local ordered_reqs = {}&lt;br /&gt;
    &lt;br /&gt;
    local boostable_template = &amp;#039; (boostable)&amp;#039;&lt;br /&gt;
    local ironman_template = &amp;#039; ([[File:Ironman_chat_badge.png|10x13px|link=]] [[Ironman]] only)&amp;#039;&lt;br /&gt;
    local kudos_template = &amp;#039; [[%s]]&amp;#039;&lt;br /&gt;
    local skill_template = &amp;#039; [[File:%s_icon.png|21x21px|link=]] [[%s]]&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    --These keys will take priority over regular skill keys (they will be listed first) &lt;br /&gt;
    --set value to true to use, false otherwise&lt;br /&gt;
    local priority_keys = {&lt;br /&gt;
        [&amp;#039;Quest point&amp;#039;] = true,&lt;br /&gt;
        [&amp;#039;Kudos&amp;#039;] = true&lt;br /&gt;
    }&lt;br /&gt;
    --iterate through each subreq and extract info&lt;br /&gt;
    for _,subreq in pairs(subreqs) do &lt;br /&gt;
        --check if current subreq for flags&lt;br /&gt;
        local im_flag = false   --ironman flag&lt;br /&gt;
        local b_flag = false    --boostable flag&lt;br /&gt;
		for _,v in pairs(subreq) do &lt;br /&gt;
			if(v == &amp;#039;ironman&amp;#039;) then &lt;br /&gt;
				im_flag = true &lt;br /&gt;
			elseif(v == &amp;#039;boostable&amp;#039;) then &lt;br /&gt;
				b_flag = true &lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
    &lt;br /&gt;
        --check if priority key and then flag special keys&lt;br /&gt;
        local p_flag = priority_keys[subreq[1]]&lt;br /&gt;
        local k_flag = subreq[1] == &amp;#039;Kudos&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
        --create wikitext string&lt;br /&gt;
        local wikitext&lt;br /&gt;
        if(k_flag) then wikitext = string.format(kudos_template, subreq[1])&lt;br /&gt;
        else wikitext = string.format(skill_template, subreq[1], subreq[1]) end&lt;br /&gt;
        if(im_flag) then wikitext = wikitext .. ironman_template end&lt;br /&gt;
        if(b_flag) then wikitext = wikitext .. boostable_template end&lt;br /&gt;
        &lt;br /&gt;
        --create a 2-element array consisting of {skill level, wikitext}&lt;br /&gt;
        local reqdata = {}&lt;br /&gt;
        table.insert(reqdata, subreq[2])&lt;br /&gt;
        table.insert(reqdata, wikitext)&lt;br /&gt;
    &lt;br /&gt;
        --distribute subreq key to appropriate key array&lt;br /&gt;
		--sorting every subreq might need to be optimized if performance is a concern&lt;br /&gt;
        if(im_flag) then &lt;br /&gt;
            if(p_flag) then&lt;br /&gt;
                table.insert(imp_reqs, reqdata)&lt;br /&gt;
				table.sort(imp_reqs, function(a,b) return a[2] &amp;lt; b[2] end)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(imnp_reqs, reqdata)&lt;br /&gt;
				table.sort(imnp_reqs, function(a,b) return a[2] &amp;lt; b[2] end)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if(p_flag) then &lt;br /&gt;
                table.insert(nimp_reqs, reqdata)&lt;br /&gt;
				table.sort(nimp_reqs, function(a,b) return a[2] &amp;lt; b[2] end)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(nimnp_reqs, reqdata)&lt;br /&gt;
				table.sort(nimnp_reqs, function(a,b) return a[2] &amp;lt; b[2] end)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    --now organize keys in order desired&lt;br /&gt;
    for _,v in pairs(nimp_reqs) do table.insert(ordered_reqs, v) end&lt;br /&gt;
    for _,v in pairs(nimnp_reqs) do table.insert(ordered_reqs, v) end&lt;br /&gt;
    for _,v in pairs(imp_reqs) do table.insert(ordered_reqs, v) end&lt;br /&gt;
    for _,v in pairs(imnp_reqs) do table.insert(ordered_reqs, v) end&lt;br /&gt;
    &lt;br /&gt;
    -----------------------------------------------&lt;br /&gt;
    &lt;br /&gt;
    -- create an html structure&lt;br /&gt;
    local html = mw.html.create(&amp;#039;ul&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;skillreq&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    --parse skill reqs, append to html object, and return finished html&lt;br /&gt;
    for _, v in pairs(ordered_reqs) do&lt;br /&gt;
        html:tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
            :wikitext(v[1])&lt;br /&gt;
            :tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
                :addClass(&amp;#039;SkillClickPic&amp;#039;)&lt;br /&gt;
                :wikitext(v[2])&lt;br /&gt;
            :done()&lt;br /&gt;
        :done()        &lt;br /&gt;
    end&lt;br /&gt;
    return html:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>