Module:MonsterVariantsTable: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(Remove border between image and name)
(look only for version type subobjects, not all subobjects, when filtering)
 
Line 31: Line 31:
'?Variant name = variant',
'?Variant name = variant',
'?Version anchor = version',
'?Version anchor = version',
'?-Has subobject#- = subobject',
'?-Version subobject#- = superobject',
'sort=Profession Level A',
'sort=Profession Level A',
'order=asc'
'order=asc'
Line 50: Line 50:
for _, entry in ipairs(data) do
for _, entry in ipairs(data) do
if entry.default then
if entry.default then
entry.page = ('[[%s|%s]]'):format(entry.subobject, entry.name)
entry.page = ('[[%s|%s]]'):format(entry.superobject, entry.name)
table.insert(filtered, entry)
table.insert(filtered, entry)
elseif entry.version == nil then
elseif entry.version == nil then

Latest revision as of 13:31, 7 January 2025

Module documentation
This documentation is transcluded from Module:MonsterVariantsTable/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:MonsterVariantsTable/doc. [edit]
Module:MonsterVariantsTable's function main is invoked by Template:MonsterVariantsTable.
Module:MonsterVariantsTable requires Module:Edit button.
Module:MonsterVariantsTable requires Module:Mw.html extension.
Module:MonsterVariantsTable requires strict.

require('strict')
require('Module:Mw.html extension')
local editbutton = require('Module:Edit button')
local p = {}

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args[1] or args.variant or '')
end

local function formatProfessionLevel(profession, level, high)
	profession = profession or 'Unknown profession'
	local level_text = tostring(level or '?')
	if high then
		level_text = ('%s➨%d'):format(level_text, high)
	end
	return ('%s [[File:%s small icon.png|21x21px|link=%s]]'):format(level_text, profession, profession)
end

function p._main(variant)
	local results = mw.smw.ask{
		('[[Variant of::%s]]'):format(variant),
		'?Image#64px;x64px = img',
		'?Name = name',
		'?= page',
		'?Unlock_level = unlock_lvl',
		'?Unlock profession # = unlock_profession',
		'?Profession_Level_A = combat',
		'?Profession A # = profession',
		'?Version default = default',
		'?Variant name = variant',
		'?Version anchor = version',
		'?-Version subobject#- = superobject',
		'sort=Profession Level A',
		'order=asc'
	}
	mw.logObject(results)
	if results == nil or results[1] == nil then
		return ":''No variants found for "..variant.."''"
	end

	local filtered = p.filter_versions(results)
	local sorted = p.sort_by_combat(filtered)

	return p.create_table(sorted)
end

function p.filter_versions(data)
	local filtered = {}
	for _, entry in ipairs(data) do
		if entry.default then
			entry.page = ('[[%s|%s]]'):format(entry.superobject, entry.name)
			table.insert(filtered, entry)
		elseif entry.version == nil then
			table.insert(filtered, entry)
		end
	end
	return filtered
end

function p.sort_by_combat(data)
	table.sort(data, function(a, b)
		-- Determine combat values
		local combatA = a.combat or a.unlock_lvl or math.huge
		local combatB = b.combat or b.unlock_lvl or math.huge
		-- Sort in ascending order
		return combatA < combatB
	end)
	return data
end

function p.insert_row(tbl, entry)
	local edit = editbutton("'''?''' (edit)", entry.name)
	tbl:tr()
		:td{ entry.img, addClass = 'plinkt-image no-border' }:done()
		:td{ entry.page, addClass = 'plinkt-link no-border' }:done()
		:td()
			:IF(entry.unlock_profession)
				:wikitext(entry.unlock_lvl and formatProfessionLevel(entry.unlock_profession, entry.unlock_lvl) or edit)
			:ELSE()
				:addClass('table-na')
				:wikitext('N/A')
			:END()
		:done()
		:td()
			:wikitext(entry.combat and formatProfessionLevel(entry.profession, entry.combat) or edit)
		:done()
	:done()

	return tbl
end

function p.create_table(results)
	local out = mw.html.create('table')
		:addClass('wikitable sortable align-right-3 align-right-4')
		:tr()
			:th{ 'Monster', attr = { colspan = 2 } }:done()
			:th('Unlocked at'):done()
			:th('Combat level'):done()
		:done()

	for _, entry in ipairs(results) do
		out = p.insert_row(out, entry)
	end

	return out
end

return p