<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACombat_Achievements</id>
	<title>Module:Combat Achievements - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACombat_Achievements"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Combat_Achievements&amp;action=history"/>
	<updated>2026-04-29T13:37:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Combat_Achievements&amp;diff=2434&amp;oldid=prev</id>
		<title>Hefner: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Combat_Achievements&amp;diff=2434&amp;oldid=prev"/>
		<updated>2024-03-30T22:16:37Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:16, 30 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Combat_Achievements&amp;diff=2433&amp;oldid=prev</id>
		<title>Bosses&gt;Cook Me Plox: why be efficient when u could just be ugly?</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Combat_Achievements&amp;diff=2433&amp;oldid=prev"/>
		<updated>2024-02-21T17:19:13Z</updated>

		<summary type="html">&lt;p&gt;why be efficient when u could just be ugly?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local tables = require(&amp;#039;Module:Tables&amp;#039;)&lt;br /&gt;
local VariablesLua = mw.ext.VariablesLua&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local prose = {&lt;br /&gt;
	monster = &amp;#039;&amp;#039;,&lt;br /&gt;
	taskamount = 0,&lt;br /&gt;
	ptsamount = 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local headers = {&lt;br /&gt;
	monster = &amp;quot;Monster&amp;quot;,&lt;br /&gt;
	name = &amp;quot;Name&amp;quot;,&lt;br /&gt;
	description = { text = &amp;quot;Description&amp;quot;, attr = { class = &amp;#039;unsortable&amp;#039; } },&lt;br /&gt;
	tier = &amp;quot;Tier&amp;quot;,&lt;br /&gt;
	_type = &amp;quot;Type&amp;quot;,&lt;br /&gt;
	completion = &amp;#039;&amp;lt;span style=&amp;quot;cursor:help; border-bottom:1px dotted;&amp;quot; title=&amp;quot;Estimated percentage of players (with at least one CA completion) who have completed this achievement, based on wiki crowdsourcing&amp;quot;&amp;gt;Comp%&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local tiers = {&lt;br /&gt;
	easy = 1,&lt;br /&gt;
	medium = 2,&lt;br /&gt;
	hard = 3,&lt;br /&gt;
	elite = 4,&lt;br /&gt;
	master = 5,&lt;br /&gt;
	grandmaster = 6&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function getData(category)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local params = {&lt;br /&gt;
		category[1],&lt;br /&gt;
		&amp;quot;?Combat Achievement JSON&amp;quot;,&lt;br /&gt;
		limit = 1000&lt;br /&gt;
	}&lt;br /&gt;
	local data = mw.smw.ask(params) or {}&lt;br /&gt;
	&lt;br /&gt;
	for _, task in ipairs(data) do&lt;br /&gt;
		local raw = task[&amp;#039;Combat Achievement JSON&amp;#039;]&lt;br /&gt;
		if raw ~= nil then&lt;br /&gt;
			local json = mw.text.jsonDecode(raw)&lt;br /&gt;
			table.insert(out, json)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sortByTierAndMonster(k1, k2) &lt;br /&gt;
	local k1_tier = tiers[string.lower(k1.tier)]&lt;br /&gt;
	local k2_tier = tiers[string.lower(k2.tier)]&lt;br /&gt;
	if k1_tier &amp;lt; k2_tier then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif k1_tier &amp;gt; k2_tier then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif k1.monster &amp;lt; k2.monster then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif k1.monster &amp;gt; k2.monster then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function completionCell(id)&lt;br /&gt;
	local completion_percent = mw.loadJsonData(&amp;quot;Module:Combat Achievements/completion.json&amp;quot;)[tonumber(id)]&lt;br /&gt;
	if (completion_percent ~= nil) then&lt;br /&gt;
		local color = &amp;quot;&amp;quot;&lt;br /&gt;
		if (completion_percent &amp;lt; 0.1) then&lt;br /&gt;
			completion_percent = &amp;quot;&amp;lt;0.1&amp;quot;&lt;br /&gt;
			color = &amp;quot;red&amp;quot;&lt;br /&gt;
		elseif (completion_percent &amp;lt; 1) then&lt;br /&gt;
			color = &amp;quot;orange&amp;quot;&lt;br /&gt;
		elseif (completion_percent &amp;lt; 10) then&lt;br /&gt;
			color = &amp;quot;yellow&amp;quot;&lt;br /&gt;
		elseif (completion_percent &amp;lt; 50) then&lt;br /&gt;
			color = &amp;quot;green&amp;quot;&lt;br /&gt;
		elseif (completion_percent &amp;lt;= 100) then&lt;br /&gt;
			color = &amp;quot;blue&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return {text = tostring(completion_percent)..&amp;#039;%&amp;#039;, class = &amp;quot;table-bg-&amp;quot; .. color}&lt;br /&gt;
	else&lt;br /&gt;
		return {text = &amp;quot;N/A&amp;quot;, class=&amp;quot;table-na nohighlight&amp;quot;}&lt;br /&gt;
	end	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTable(data, columns)&lt;br /&gt;
	local taskTable = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable lighttable sortable qc-active ca-tasks&amp;#039;):cssText(&amp;#039;max-width: 800px&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local columnValues = {}&lt;br /&gt;
	for _, v in ipairs(columns) do&lt;br /&gt;
		table.insert(columnValues, headers[v])&lt;br /&gt;
	end&lt;br /&gt;
	tables._row(taskTable:tag(&amp;#039;tr&amp;#039;), columnValues, true)&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(data) do&lt;br /&gt;
		local rowData = {&lt;br /&gt;
			monster = v.monster == &amp;quot;None&amp;quot; and &amp;quot;N/A&amp;quot; or string.format(&amp;quot;[[%s]]&amp;quot;, v.monster),&lt;br /&gt;
			name = string.format(&amp;quot;[[%s]]&amp;quot;, v.name),&lt;br /&gt;
			description = v.task,&lt;br /&gt;
			tier = { text = ( v.tier .. &amp;#039;&amp;amp;nbsp;(&amp;#039; .. tiers[v.tier:lower()] .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. (tiers[v.tier:lower()] == 1 and &amp;#039;pt&amp;#039; or &amp;#039;pts&amp;#039;) .. &amp;#039;)&amp;#039; ), attr = { [&amp;#039;data-sort-value&amp;#039;] = tiers[v.tier:lower()] } },&lt;br /&gt;
			_type = v[&amp;quot;type&amp;quot;],&lt;br /&gt;
			completion = completionCell(v.id)&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		local row = {}&lt;br /&gt;
		for _, column in ipairs(columns) do&lt;br /&gt;
			table.insert(row, rowData[column])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local htmlRow = taskTable:tag(&amp;#039;tr&amp;#039;):attr(&amp;#039;data-ca-task-id&amp;#039;, v.id)&lt;br /&gt;
		tables._row(htmlRow, row, false)&lt;br /&gt;
		&lt;br /&gt;
		prose.taskamount = prose.taskamount + 1&lt;br /&gt;
		prose.ptsamount = prose.ptsamount + tiers[v.tier:lower()]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return taskTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.list(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	&lt;br /&gt;
	local columns = {&amp;quot;name&amp;quot;, &amp;quot;description&amp;quot;, &amp;quot;_type&amp;quot;}&lt;br /&gt;
	local category = {}&lt;br /&gt;
	if args[1] == &amp;#039;all&amp;#039; then&lt;br /&gt;
		category = {&amp;quot;[[Category:Easy Combat Achievements tasks||Medium Combat Achievements tasks||Hard Combat Achievements tasks||Elite Combat Achievements tasks||Master Combat Achievements tasks||Grandmaster Combat Achievements tasks]]&amp;quot;}&lt;br /&gt;
		table.insert(columns, 1, &amp;quot;monster&amp;quot;)&lt;br /&gt;
		table.insert(columns, &amp;quot;tier&amp;quot;)&lt;br /&gt;
	elseif tiers[string.lower(args[1])] ~= nil then&lt;br /&gt;
		-- Get all Combat Achievement tasks for a tier and display its monster&lt;br /&gt;
		category = {string.format(&amp;quot;[[Category:%s Combat Achievements tasks]]&amp;quot;, args[1])}&lt;br /&gt;
		table.insert(columns, 1, &amp;quot;monster&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		-- Get all Combat Achievement tasks for a boss and display its tier&lt;br /&gt;
		category = {string.format(&amp;quot;[[Category:%s achievements]]&amp;quot;, args[1])}&lt;br /&gt;
		table.insert(columns, &amp;quot;tier&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(columns, &amp;quot;completion&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	prose.monster = args.mobname or args[1]&lt;br /&gt;
	&lt;br /&gt;
	local data = getData(category)&lt;br /&gt;
	table.sort(data, sortByTierAndMonster)&lt;br /&gt;
	&lt;br /&gt;
	local rettbl = tostring( makeTable(data, columns) )&lt;br /&gt;
	local strplural = (prose.taskamount ~= 1)&lt;br /&gt;
	local moduleInvokedOnce = VariablesLua.varexists(&amp;#039;caListModuleInvoked&amp;#039;)&lt;br /&gt;
	local retstr = ( string.find( mw.title.getCurrentTitle().text, &amp;#039;Combat Achievements&amp;#039;) and &amp;#039;&amp;#039; or&lt;br /&gt;
		string.format(&amp;#039;&amp;lt;p&amp;gt;There %s %s %s task%s (totalling %s point%s) available for %s.&amp;lt;/p&amp;gt;&amp;#039;,&lt;br /&gt;
			(strplural and &amp;#039;are&amp;#039; or &amp;#039;is&amp;#039;),&lt;br /&gt;
			prose.taskamount,&lt;br /&gt;
			(moduleInvokedOnce and &amp;#039;Combat Achievement&amp;#039; or &amp;#039;[[Combat Achievements|Combat Achievement]]&amp;#039;),&lt;br /&gt;
			(strplural and &amp;#039;s&amp;#039; or &amp;#039;&amp;#039;),&lt;br /&gt;
			prose.ptsamount,&lt;br /&gt;
			(prose.ptsamount ~= 1 and &amp;#039;s&amp;#039; or &amp;#039;&amp;#039;),&lt;br /&gt;
			prose.monster&lt;br /&gt;
		) )&lt;br /&gt;
	&lt;br /&gt;
	VariablesLua.vardefine( &amp;#039;caListModuleInvoked&amp;#039;, 0 )&lt;br /&gt;
&lt;br /&gt;
	return retstr .. rettbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bosses&gt;Cook Me Plox</name></author>
	</entry>
</feed>