<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASidequests</id>
	<title>Module:Sidequests - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASidequests"/>
	<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Module:Sidequests&amp;action=history"/>
	<updated>2026-10-25T18:40:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.dragonminez.com/index.php?title=Module:Sidequests&amp;diff=377&amp;oldid=prev</id>
		<title>Neb: Sync from dragonminez-wiki repository</title>
		<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Module:Sidequests&amp;diff=377&amp;oldid=prev"/>
		<updated>2026-10-13T04:20:23Z</updated>

		<summary type="html">&lt;p&gt;Sync from dragonminez-wiki repository&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData( &amp;#039;Module:Sidequests/data&amp;#039; )&lt;br /&gt;
local LANGUAGES = { en = true, es = true, pt = true }&lt;br /&gt;
&lt;br /&gt;
local TEXT = {&lt;br /&gt;
	quest = { en = &amp;#039;Quest&amp;#039;, es = &amp;#039;Misión&amp;#039;, pt = &amp;#039;Missão&amp;#039; },&lt;br /&gt;
	requirements = { en = &amp;#039;Requirements&amp;#039;, es = &amp;#039;Requisitos&amp;#039;, pt = &amp;#039;Requisitos&amp;#039; },&lt;br /&gt;
	objectives = { en = &amp;#039;Objectives&amp;#039;, es = &amp;#039;Objetivos&amp;#039;, pt = &amp;#039;Objetivos&amp;#039; },&lt;br /&gt;
	rewards = { en = &amp;#039;Rewards&amp;#039;, es = &amp;#039;Recompensas&amp;#039;, pt = &amp;#039;Recompensas&amp;#039; },&lt;br /&gt;
	givenBy = { en = &amp;#039;Given by&amp;#039;, es = &amp;#039;La da&amp;#039;, pt = &amp;#039;Dada por&amp;#039; },&lt;br /&gt;
	tree = { en = &amp;#039;Quest tree only&amp;#039;, es = &amp;#039;Solo desde el árbol de misiones&amp;#039;, pt = &amp;#039;Só pela árvore de missões&amp;#039; },&lt;br /&gt;
	turnIn = { en = &amp;#039;turn in to&amp;#039;, es = &amp;#039;se entrega a&amp;#039;, pt = &amp;#039;entregar para&amp;#039; },&lt;br /&gt;
	anyOrder = { en = &amp;#039;In any order&amp;#039;, es = &amp;#039;En cualquier orden&amp;#039;, pt = &amp;#039;Em qualquer ordem&amp;#039; },&lt;br /&gt;
	repeatable = { en = &amp;#039;Repeatable&amp;#039;, es = &amp;#039;Repetible&amp;#039;, pt = &amp;#039;Repetível&amp;#039; },&lt;br /&gt;
	empty = { en = &amp;#039;No side quests.&amp;#039;, es = &amp;#039;Ninguna misión secundaria.&amp;#039;, pt = &amp;#039;Nenhuma missão secundária.&amp;#039; },&lt;br /&gt;
	category = { en = &amp;#039;Category&amp;#039;, es = &amp;#039;Categoría&amp;#039;, pt = &amp;#039;Categoria&amp;#039; },&lt;br /&gt;
	quests = { en = &amp;#039;Side quests&amp;#039;, es = &amp;#039;Misiones secundarias&amp;#039;, pt = &amp;#039;Missões secundárias&amp;#039; },&lt;br /&gt;
	total = { en = &amp;#039;Total&amp;#039;, es = &amp;#039;Total&amp;#039;, pt = &amp;#039;Total&amp;#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function language( frame )&lt;br /&gt;
	local lang = frame:preprocess( &amp;#039;{{PAGELANGUAGE}}&amp;#039; )&lt;br /&gt;
	if LANGUAGES[ lang ] then&lt;br /&gt;
		return lang&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;en&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function list( items, ordered )&lt;br /&gt;
	if #items == 0 then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local marker = ordered and &amp;#039;#&amp;#039; or &amp;#039;*&amp;#039;&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, item in ipairs( items ) do&lt;br /&gt;
		table.insert( out, marker .. &amp;#039; &amp;#039; .. item )&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;\n&amp;#039; .. table.concat( out, &amp;#039;\n&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function questCell( quest, lang, showGiver )&lt;br /&gt;
	local parts = { &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. quest.name[ lang ] .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; }&lt;br /&gt;
	if quest.repeatable then&lt;br /&gt;
		table.insert( parts, &amp;#039; &amp;lt;span class=&amp;quot;dmz-tag&amp;quot;&amp;gt;&amp;#039; .. TEXT.repeatable[ lang ] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( parts, &amp;#039;&amp;lt;div class=&amp;quot;dmz-sidequest__desc&amp;quot;&amp;gt;&amp;#039; .. quest.desc[ lang ] .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
	if showGiver then&lt;br /&gt;
		local giver&lt;br /&gt;
		if quest.giverText then&lt;br /&gt;
			giver = TEXT.givenBy[ lang ] .. &amp;#039;: &amp;#039; .. quest.giverText[ lang ]&lt;br /&gt;
		else&lt;br /&gt;
			giver = TEXT.tree[ lang ]&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( parts, &amp;#039;&amp;lt;div class=&amp;quot;dmz-sidequest__giver&amp;quot;&amp;gt;&amp;#039; .. giver .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( parts )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function objectivesCell( quest, lang )&lt;br /&gt;
	local items = quest.objectives[ lang ]&lt;br /&gt;
	local ordered = quest.ordered and #items &amp;gt; 1&lt;br /&gt;
	local prefix = &amp;#039;&amp;#039;&lt;br /&gt;
	if not quest.ordered and #items &amp;gt; 1 then&lt;br /&gt;
		prefix = &amp;#039;&amp;lt;div class=&amp;quot;dmz-sidequest__note&amp;quot;&amp;gt;&amp;#039; .. TEXT.anyOrder[ lang ] .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return prefix .. list( items, ordered )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render( quests, lang, showGiver )&lt;br /&gt;
	if #quests == 0 then&lt;br /&gt;
		return &amp;quot;&amp;#039;&amp;#039;&amp;quot; .. TEXT.empty[ lang ] .. &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local out = {&lt;br /&gt;
		&amp;#039;{| class=&amp;quot;wikitable dmz-sidequests&amp;quot;&amp;#039;,&lt;br /&gt;
		&amp;#039;! &amp;#039; .. TEXT.quest[ lang ] .. &amp;#039; !! &amp;#039; .. TEXT.requirements[ lang ] .. &amp;#039; !! &amp;#039; .. TEXT.objectives[ lang ] .. &amp;#039; !! &amp;#039; .. TEXT.rewards[ lang ],&lt;br /&gt;
	}&lt;br /&gt;
	for _, quest in ipairs( quests ) do&lt;br /&gt;
		local requirements = quest.unlock[ lang ]&lt;br /&gt;
		local requirementsText = #requirements &amp;gt; 0 and list( requirements, false ) or data.none[ lang ]&lt;br /&gt;
		table.insert( out, &amp;#039;|- id=&amp;quot;sq-&amp;#039; .. quest.id .. &amp;#039;&amp;quot;&amp;#039; )&lt;br /&gt;
		table.insert( out, &amp;#039;| &amp;#039; .. questCell( quest, lang, showGiver ) )&lt;br /&gt;
		table.insert( out, &amp;#039;| &amp;#039; .. requirementsText )&lt;br /&gt;
		table.insert( out, &amp;#039;| &amp;#039; .. objectivesCell( quest, lang ) )&lt;br /&gt;
		table.insert( out, &amp;#039;| &amp;#039; .. list( quest.rewards[ lang ], false ) )&lt;br /&gt;
	end&lt;br /&gt;
	table.insert( out, &amp;#039;|}&amp;#039; )&lt;br /&gt;
	return table.concat( out, &amp;#039;\n&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function filter( test )&lt;br /&gt;
	local result = {}&lt;br /&gt;
	for _, quest in ipairs( data.quests ) do&lt;br /&gt;
		if test( quest ) then&lt;br /&gt;
			table.insert( result, quest )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function argument( frame, index )&lt;br /&gt;
	local value = frame.args[ index ]&lt;br /&gt;
	if value == nil or mw.text.trim( value ) == &amp;#039;&amp;#039; then&lt;br /&gt;
		value = frame:getParent() and frame:getParent().args[ index ]&lt;br /&gt;
	end&lt;br /&gt;
	return value and mw.text.trim( value ) or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.category( frame )&lt;br /&gt;
	local category = argument( frame, 1 )&lt;br /&gt;
	return render( filter( function ( quest )&lt;br /&gt;
		return quest.category == category&lt;br /&gt;
	end ), language( frame ), true )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.giver( frame )&lt;br /&gt;
	local wanted = {}&lt;br /&gt;
	for id in mw.text.gsplit( argument( frame, 1 ), &amp;#039;,&amp;#039;, true ) do&lt;br /&gt;
		wanted[ mw.text.trim( id ) ] = true&lt;br /&gt;
	end&lt;br /&gt;
	return render( filter( function ( quest )&lt;br /&gt;
		return wanted[ quest.giver ] == true&lt;br /&gt;
	end ), language( frame ), false )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.count( frame )&lt;br /&gt;
	local category = argument( frame, 1 )&lt;br /&gt;
	local giver = argument( frame, &amp;#039;giver&amp;#039; )&lt;br /&gt;
	return #filter( function ( quest )&lt;br /&gt;
		return ( category == &amp;#039;&amp;#039; or quest.category == category ) and ( giver == &amp;#039;&amp;#039; or quest.giver == giver )&lt;br /&gt;
	end )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.categoryName( frame )&lt;br /&gt;
	local names = data.categoryNames[ argument( frame, 1 ) ]&lt;br /&gt;
	if not names then&lt;br /&gt;
		return argument( frame, 1 )&lt;br /&gt;
	end&lt;br /&gt;
	return names[ language( frame ) ]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.summary( frame )&lt;br /&gt;
	local lang = language( frame )&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for _, category in ipairs( data.categories ) do&lt;br /&gt;
		local count = #filter( function ( quest )&lt;br /&gt;
			return quest.category == category&lt;br /&gt;
		end )&lt;br /&gt;
		if count &amp;gt; 0 then&lt;br /&gt;
			table.insert( rows, &amp;#039;|-\n| [[#&amp;#039; .. category .. &amp;#039;|&amp;#039; .. data.categoryNames[ category ][ lang ] .. &amp;#039;]] || &amp;#039; .. count )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;{| class=&amp;quot;wikitable&amp;quot;\n! &amp;#039; .. TEXT.category[ lang ] .. &amp;#039; !! &amp;#039; .. TEXT.quests[ lang ] .. &amp;#039;\n&amp;#039; .. table.concat( rows, &amp;#039;\n&amp;#039; ) .. &amp;#039;\n|-\n! &amp;#039; .. TEXT.total[ lang ] .. &amp;#039; !! &amp;#039; .. #data.quests .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Neb</name></author>
	</entry>
</feed>