Module:Mod
This module is used on 34000+ pages.
To avoid major disruption and server load, do not make unnecessary edits to this module. Test changes to this module first using its /sandbox and /testcases subpages . All of the changes can then be applied to this module in a single edit.
Consider discussing changes on the talk page or on Discord before implementing them.
Module for handling for modifiers with Cargo support.
List of currently implemented templates
The above documentation is transcluded from Module:Mod/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
--
-- Module for mod related templates
--
local util = require('Module:Util')
local getArgs = require('Module:Arguments').getArgs
local game = require('Module:Game')
local p = {}
-- ----------------------------------------------------------------------------
-- Utility / Helper functions
-- ----------------------------------------------------------------------------
local h = {}
-- Validate single value properties and set them
h.validate = {}
function h.validate.not_nil (args)
return function (arg)
if g_args[arg] == nil then
error(string.format('%s must not be nil', arg))
end
end
end
function h.validate.number (args)
return function (arg)
g_args[arg] = util.cast.number(g_args[arg], args)
return g_args[arg]
end
end
function h.handle_mapped_property_args (map)
local properties = {}
for _, data in ipairs(map) do
if data.func ~= nil then
data.func(data.name)
end
if data.property ~= nil then
properties[data.property] = g_args[data.name]
end
end
g_frame:callParserFunction('#set:', properties)
end
function h.create_header(row)
local stat = mw.html.create('span')
local text, nsub = mw.ustring.gsub(row['Has stat text'], '%d+', '?')
stat
:attr('class', 'mod-table-header-stat')
:wikitext(text)
:done()
local mgroup = mw.html.create('span')
mgroup
:attr('class', 'mod-table-header-modgroup')
:wikitext(row['Has mod group'])
:done()
local tbl = mw.html.create('table')
tbl
:attr('class', 'wikitable mw-collapsible mw-collapsed mod-table')
:tag('tr')
:tag('th')
:attr('class', 'mod-table-header')
:attr('colspan', g_args.colspan)
:tag('span')
:attr('class', 'mod-table-header-container')
:wikitext(tostring(stat) .. tostring(mgroup))
:done()
:done()
return tbl
end
function h.format_mod(tbl, row, tags)
local tr = tbl:tag('tr')
tr
:tag('td')
:wikitext(string.format('[[%s|%s]]', row[1], row['Has name']))
:attr('class', 'mod-table-cell-name')
:done()
:tag('td')
:wikitext(row['Has level requirement'])
:attr('class', 'mod-table-cell-level')
:done()
:tag('td')
:wikitext(row['Has stat text'])
:attr('class', 'mod-table-cell-stat')
:done()
:tag('td')
:wikitext(table.concat(tags, ', '))
:attr('class', 'mod-table-cell-tags')
:done()
end
-- ----------------------------------------------------------------------------
-- Templates
-- ----------------------------------------------------------------------------
--
-- Template: Mod
--
-- p.mod{id = "LocalIncreasedPhysicalDamagePercentUniqueOneHandSword2", name = "", mod_group = "LocalPhysicalDamagePercent", domain = "1", generation_type = "3", required_level = "1", mod_type = "LocalPhysicalDamagePercent", stat_text = "150% increased Physical Damage", stat1_id = "local_physical_damage_+%", stat1_min = "150", stat1_max = "150"}
function p.mod(frame)
-- Get args
g_args = getArgs(frame, {
parentFirst = true
})
g_frame = util.misc.get_frame(frame)
--
-- Validation & semantic properties
--
-- Validate single value properties and set them
local map = {
{
name = 'id',
property = 'Is mod',
wikitext = 'Mod Id',
},
{
name = 'name',
property = 'Has name',
wikitext = 'Name',
},
{
name = 'mod_group',
property = 'Has mod group',
wikitext = 'Group',
},
{
name = 'mod_type',
property = 'Has mod type',
wikitext = 'Mod type',
},
{
name = 'domain',
property = 'Has mod domain',
func = h.validate.number{min=1, max=11},
wikitext = 'Mod domain',
display = function (value)
return game.constants.mod.domains[value]['short_upper'] .. ' (Id: ' .. value .. ')'
end,
},
{
name = 'generation_type',
property = 'Has mod generation type',
func = h.validate.number{min=1, max=10},
wikitext = 'Generation type',
display = function (value)
return game.constants.mod.generation_types[value]['short_upper'] .. ' (Id: ' .. value .. ')'
end,
},
{
name = 'required_level',
property = 'Has level requirement',
func = h.validate.number{min=0, max=100},
wikitext = 'Req. level',
},
{
name = 'stat_text',
property = 'Has stat text',
wikitext = 'Effect',
},
{
name = 'granted_buff_id',
property = 'Has granted buff id',
wikitext = 'Granted Buff Id',
},
{
name = 'granted_buff_value',
property = 'Has granted buff value',
wikitext = 'Granted Buff Value',
},
{
name = 'granted_skill',
property = 'Has granted skill id',
wikitext = 'Granted Skill',
},
}
h.handle_mapped_property_args(map)
-- Validate & set multi value property
if g_args['tags'] == nil then
g_args['tags'] = {}
else
local tags = mw.text.split(g_args['tags'], ', ')
g_args['tags'] = tags
properties = {}
properties['Has tag'] = table.concat(tags, ';')
properties['+sep'] = ';'
g_frame:callParserFunction('#set:', properties)
end
-- Validate % set the stat multi value property
local i
local id
local value
for i=1, 5 do
local id = {
id = 'stat' .. i .. '_id',
min = 'stat' .. i .. '_min',
max = 'stat' .. i .. '_max',
}
local value = {
id = g_args[id.id],
min = g_args[id.min],
max = g_args[id.max],
}
if not (value.id == nil and value.min == nil and value.max == nil) then
local onenil = nil
for _, k in ipairs({'id', 'min', 'max'}) do
if value[k] == nil then
onenil = k
break
end
end
if onenil ~= nil then
error('"' .. id[onenil] .. '" is not set')
end
properties = {}
properties['Is stat number'] = i
properties['Has stat id'] = value.id
properties['Has minimum stat value'] = h.validate.number({})(id.min)
properties['Has maximum stat value'] = h.validate.number({})(id.max)
g_frame:callParserFunction(string.format('#subobject: stat %s', i), properties)
end
end
-- Validate & set spawn weight multi value property
i = 0
id = nil
value = nil
repeat
i = i + 1
id = {
tag = string.format('spawn_weight%s_tag', i),
value = string.format('spawn_weight%s_value', i),
}
value = {
tag = g_args[id.tag],
value = g_args[id.value],
}
if value.tag ~= nil and value.value ~= nil then
properties = {}
properties['Is tag number'] = i
properties['Has tag'] = value.tag
properties['Has spawn weight'] = h.validate.number({min=0})(id.value)
g_frame:callParserFunction(string.format('#subobject: spawn weight %s', i), properties)
elseif not (value.tag == nil and value.value == nil) then
error ('Both ' .. id.tag .. ' and ' .. id.value .. ' must be specified')
end
until value.tag == nil
-- Validate & set generation weight multi value property
i = 0
id = nil
value = nil
repeat
i = i + 1
id = {
tag = string.format('generation_weight%s_tag', i),
value = string.format('generation_weight%s_value', i),
}
value = {
tag = g_args[id.tag],
value = g_args[id.value],
}
if value.tag ~= nil and value.value ~= nil then
properties = {}
properties['Is tag number'] = i
properties['Has tag'] = value.tag
properties['Has generation weight'] = h.validate.number({min=0})(id.value)
g_frame:callParserFunction(string.format('#subobject: generation weight %s', i), properties)
elseif not (value.tag == nil and value.value == nil) then
error ('Both ' .. id.tag .. ' and ' .. id.value .. ' must be specified')
end
until value.tag == nil
--
-- Display
--
local container = mw.html.create('div')
container
:attr('class', 'modbox')
-- core stats
local tbl = container:tag('table')
tbl
:attr('class', 'wikitable')
for _, data in ipairs(map) do
local text
if data.display == nil then
text = g_args[data.name]
else
text = data.display(g_args[data.name])
end
tbl
:tag('tr')
:tag('th')
:wikitext(string.format('[[Property:%s|%s]]', data.property, data.wikitext))
:done()
:tag('td')
:wikitext(text)
:done()
:done()
:done()
end
tbl
:tag('tr')
:tag('th')
:wikitext('[[Property:Has tag|Tags]]')
:done()
:tag('td')
:wikitext(table.concat(g_args['tags'], ', '))
:done()
:done()
:done()
-- stat table
tbl = container:tag('table')
tbl
:attr('class', 'wikitable sortable')
:tag('tr')
:tag('th')
:attr('colspan', 4)
:wikitext('Stats')
:done()
:done()
:tag('tr')
:tag('th')
:wikitext('[[Property:Is stat number|#]]')
:done()
:tag('th')
:wikitext('[[Property:Has stat id|Stat Id]]')
:done()
:tag('th')
:wikitext('[[Property:Has minimum stat value|Minimum]]')
:done()
:tag('th')
:wikitext('[[Property:Has maximum stat value|Maximum]]')
:done()
:done()
:done()
for i=1, 5 do
local value = {
id = g_args['stat' .. i .. '_id'],
min = g_args['stat' .. i .. '_min'],
max = g_args['stat' .. i .. '_max'],
}
if value.id then
tbl
:tag('tr')
:tag('td')
:wikitext(i)
:done()
:tag('td')
:wikitext(value.id)
:done()
:tag('td')
:wikitext(value.min)
:done()
:tag('td')
:wikitext(value.max)
:done()
:done()
:done()
end
end
-- spawn weight table
tbl = container:tag('table')
tbl
:attr('class', 'wikitable sortable')
:tag('tr')
:tag('th')
:attr('colspan', 3)
:wikitext('Spawn Weights')
:done()
:done()
:tag('tr')
:tag('th')
:wikitext('[[Property:Is tag number|#]]')
:done()
:tag('th')
:wikitext('[[Property:Has tag|Tag]]')
:done()
:tag('th')
:wikitext('[[Property:Has spawn weight|Weight]]')
:done()
:done()
:done()
i = 0
value = nil
repeat
i = i + 1
value = {
tag = g_args[string.format('spawn_weight%s_tag', i)],
value = g_args[string.format('spawn_weight%s_value', i)],
}
if value.tag then
tbl
:tag('tr')
:tag('td')
:wikitext(i)
:done()
:tag('td')
:wikitext(value.tag)
:done()
:tag('td')
:wikitext(value.value)
:done()
:done()
:done()
end
until value.tag == nil
-- generation weight table
tbl = container:tag('table')
tbl
:attr('class', 'wikitable sortable')
:tag('tr')
:tag('th')
:attr('colspan', 3)
:wikitext('Generation Weights')
:done()
:done()
:tag('tr')
:tag('th')
:wikitext('[[Property:Is tag number|#]]')
:done()
:tag('th')
:wikitext('[[Property:Has tag|Tag]]')
:done()
:tag('th')
:wikitext('[[Property:Has generation weight|Weight]]')
:done()
:done()
:done()
i = 0
value = nil
repeat
i = i + 1
value = {
tag = g_args[string.format('generation_weight%s_tag', i)],
value = g_args[string.format('generation_weight%s_value', i)],
}
if value.tag then
tbl
:tag('tr')
:tag('td')
:wikitext(i)
:done()
:tag('td')
:wikitext(value.tag)
:done()
:tag('td')
:wikitext(value.value)
:done()
:done()
:done()
end
until value.tag == nil
-- Generic messages on the page
out = {}
if mw.ustring.find(g_args['id'], '_') then
out[#out+1] = g_frame:expandTemplate{ title = 'Incorrect title', args = { title=g_args['id'] } } .. '\n\n\n'
end
if g_args['name'] then
out[#out+1] = string.format("'''%s''' is the internal id of modifier '''%s'''.\n", g_args['id'], g_args['name'])
else
out[#out+1] = string.format("'''%s''' is the internal id of an unnamed modifier.\n", g_args['id'], g_args['name'])
end
-- Categories
cats = {'Mods'}
-- Done -> output
return tostring(container) .. util.misc.add_category(cats) .. '\n' .. table.concat(out)
end
--
-- Template: SMW query mods
--
function p.query_mods(frame)
-- Args
g_args = getArgs(frame, {
parentFirst = true
})
g_frame = util.misc.get_frame(frame)
g_args.colspan = 4
local conditions = {}
conditions[#conditions+1] = 'concept'
if g_args.tag then
conditions[#conditions+1] = string.format('[[Has subobject::<q>[[-Has subobject::+]] [[Has spawn weight::>>0]] [[Has tag::%s]]</q>]]', g_args.tag)
end
g_args.header_level = g_args.header_level or 2
-- Fields
local fields = {}
fields[#fields+1] = '?Is mod'
fields[#fields+1] = '?Has name'
fields[#fields+1] = '?Has level requirement'
fields[#fields+1] = '?Has mod group'
fields[#fields+1] = '?Has stat text'
-- parameters
local parameters = {}
parameters.sort = 'Has mod group, '
parameters.limit = 1000 -- lets see
local data = {}
data.header = {
prefix = 'Prefix',
suffix = 'Suffix',
}
local out = {}
for _, v in ipairs({'prefix', 'suffix'}) do
out[#out+1] = string.format('<h%i>%s</h%i>', g_args.header_level, data.header[v], g_args.header_level)
conditions[1] = string.format('[[Concept:Spawnable named %s item mods]]', v)
local query
local results
--
-- Query tags
--
query = {}
query[#query+1] = string.format('[[-Has subobject::<q>%s</q>]]', table.concat(conditions, ' '))
query[#query+1] = '[[Has tag::+]]'
query[#query+1] = '[[Has spawn weight::+]]'
--query[#query+1] = '[[Has spawn weight::>>0]]'
query[#query+1] = '?Has tag'
query[#query+1] = '?Has spawn weight#' -- need native number
query.limit = 1000
query.offset = 0
-- Tag order is very important
query.sort = ', Is tag number'
local tags = {}
-- this works because lua only considers nil to be false >_>
while query.offset do
results = util.smw.query(query, g_frame)
query.offset = query.offset + #results
-- terminates the while if enough reuslts have been fetched
if query.offset % 1000 ~= 0 then
query.offset = nil
end
for _, row in ipairs(results) do
local page, _ = string.gsub(row[1], '#_[%x]+', '')
if tags[page] == nil then
tags[page] = {}
end
local text
if tonumber(row['Has spawn weight']) > 0 then
text = '[[File:Yes.png|yes|link=]]'
else
text = '[[File:No.png|no|link=]]'
end
tags[page][#tags[page]+1] = string.format('%s %s', row['Has tag'], text)
end
end
--
-- Query mods
--
query = {}
for _, v in ipairs(conditions) do
query[#query+1] = v
end
for _, v in ipairs(fields) do
query[#query+1] = v
end
for k, v in pairs(parameters) do
query[k] = v
end
results = util.smw.query(query, g_frame)
local last = ''
local tbl = ''
for _, row in ipairs(results) do
local current = string.gsub(row['Is mod'], '%d+.*', '%%d.*')
if string.match(last, current) then
h.format_mod(tbl, row, tags[row[1]])
else
out[#out+1] = tostring(tbl)
tbl = h.create_header(row)
h.format_mod(tbl, row, tags[row[1]])
end
last = row['Is mod']
end
-- add the last table
out[#out+1] = tostring(tbl)
end
return table.concat(out, '')
end
--
-- Template: SMW mod table
--
-- =p.mod_list{'Strength1', 'shitty name', 'test', 'test2', userparam='extra_rows=2, show_jewels=1'}
-- =p.mod_list{'ColdCritMultiplier', 'shitty name', 'test', 'test2', userparam='extra_rows=2, show_jewels=1'}
-- =p.mod_list{'MapMultipleExilesMap2Tier', 'asdasda', 'Area yields 15% more Items<br>8% increased Rarity of Items found in this Area<br>Area is inhabited by 2 additional Rogue Exiles<br>Extra monsters ignore rarity bias (Hidden)<br>+14% Monster pack size', userparam='extra_rows=1, type=map, effect_rowid=2'}
function p.mod_list(frame)
local types = {'map', 'jewel'}
-- Args
g_args = getArgs(frame, {
parentFirst = true
})
g_frame = util.misc.get_frame(frame)
--
local args = util.string.split_args(g_args.userparam, {sep=', '})
g_args.userparam = args
args.extra_rows = (tonumber(args.extra_rows) or 0)
if args.show_tags == nil then
args.show_tags = true
else
args.show_tags = util.cast.boolean(args.show_tags)
end
args.effect_rowid = (tonumber(args.effect_rowid) or 0) + 1
tr = mw.html.create('tr')
tr
:tag('td')
:attr('data-sort-value', g_args[2] or g_args[1])
:wikitext(string.format('[[%s|%s]]', g_args[1], g_args[2] or g_args[1]))
:done()
local i = 2
local row_max = i + args.extra_rows
local text
while i < row_max do
i = i + 1
text = g_args[i] or ''
text = table.concat(mw.text.split(text, ';', true), '<br>')
if args.type == 'map' and i == args.effect_rowid then
text = mw.text.split(text, '<br>', true)
local map = {
'%d+%% increased Quantity of Items found in this Area',
'%d+%% increased Rarity of Items found in this Area',
'%+%d+%% Monster pack size',
}
out = {}
local valid
for k, v in pairs(text) do
valid = true
for _, pattern in ipairs(map) do
if mw.ustring.find(v, pattern) ~= nil then
valid = false
break
end
end
if valid then
table.insert(out, v)
end
end
text = table.concat(out, '<br>')
end
tr
:tag('td')
:wikitext(text)
:done()
end
local query
local result
if args.type == 'map' then
query = {
string.format('[[-Has subobject::%s]]', g_args[1]),
'[[Has stat id::+]]',
'?Has stat id',
'?Has minimum stat value',
'?Has maximum stat value',
}
result = util.smw.query(query, g_frame)
local stat_map = {
['map_item_drop_quantity_+%'] = {disp=0, sort=0},
['map_item_drop_rarity_+%'] = {disp=0, sort=0},
['map_pack_size_+%'] = {disp=0, sort=0},
}
local stat
for _, row in ipairs(result) do
stat = stat_map[row['Has stat id']]
if stat ~= nil then
stat.sort = (row['Has minimum stat value'] + row['Has maximum stat value']) / 2
if row['Has minimum stat value'] ~= row['Has minimum stat value'] then
stat.disp = string.format('(%s to %s)', row['Has minimum stat value'], row['Has maximum stat value'])
else
stat.disp = row['Has minimum stat value']
end
end
end
for _, k in ipairs({'map_item_drop_quantity_+%', 'map_item_drop_rarity_+%', 'map_pack_size_+%'}) do
stat = stat_map[k]
tr
:tag('td')
:attr('data-sort-value', stat.sort)
:wikitext(stat.disp)
:done()
:done()
end
end
local tags
if args.show_tags or args.type == 'jewel' then
query = {
string.format('[[-Has subobject::%s]]', g_args[1]),
'[[Has tag::+]]',
'?Has tag',
'?Has spawn weight',
sort='Is tag number',
}
tags = {}
result = util.smw.query(query, g_frame)
end
if args.type == 'jewel' then
local jewels = {
dex=0,
str=0,
int=0,
pris=0,
}
local cast_tbl = {
not_dex={'str', 'int'},
not_int={'str', 'dex'},
not_str={'int', 'dex'},
default={'str','int','dex','pris'},
}
local i = #result
local row
local cast
while i > 0 do
row = result[i]
cast = cast_tbl[row['Has tag']]
if cast ~= nil then
for _, k in ipairs(cast) do
jewels[k] = row['Has spawn weight']
end
end
i = i - 1
end
tr
:tag('td')
:attr('class', 'table-cell-dex')
:wikitext(jewels.dex)
:done()
:tag('td')
:attr('class', 'table-cell-int')
:wikitext(jewels.int)
:done()
:tag('td')
:attr('class', 'table-cell-str')
:wikitext(jewels.str)
:done()
:tag('td')
:attr('class', 'table-cell-prismatic')
:wikitext(jewels.pris)
:done()
:done()
end
if args.show_tags then
for _, row in ipairs(result) do
tags[#tags+1] = string.format('%s %s', row['Has tag'], row['Has spawn weight'])
end
tr
:tag('td')
:wikitext(table.concat(tags, '<br>'))
:done()
:done()
end
return tostring(tr)
end
function p.get_tags(frame)
-- This function queries for the tags for a specific item.
-- Args
local g_args = getArgs(frame, {
parentFirst = true
})
local g_frame = util.misc.get_frame(frame)
local item_name = g_args[1]
local query = {
string.format('[[Has name::%s]]', item_name),
'?Has tags',
'?Has base strength requirement',
'?Has base intelligence requirement',
'?Has base dexterity requirement',
'?Has item class'
}
local results = util.smw.query(query, g_frame)
-- Remove unnecessary symbols and reverse the tag order.
results[1]['Has tags'] = results[1]['Has tags']:gsub('(<MANY>)', ', ')
function table.reverse(a)
local res = {}
for i = #a, 1, -1 do
res[#res+1] = a[i]
end
return res
end
results[1]['Has tags'] = table.concat(table.reverse(util.string.split(results[1]['Has tags'], ', ')), ', ')
return results[1]
end
function p.header(str)
-- Replace numbers with #
s = table.concat(util.string.split(str, '%(%d+%.*%d* to %d+%.*%d*%)'), '#')
s = table.concat(util.string.split(s, '%d+%.*%d*'), '#')
s = s:gsub('<br>', ', ') -- s:gsub('%[%[(.-)%]%]', '%1'):gsub('(%a*)%|', ''):gsub('<br>', ', ')
return s
end
function p.drop_down_table(frame)
-- Misses forsaken masters currently
-- Weapons
-- p.drop_down_table{item = 'Rusted Hatchet', header = 'One Handed Axes'}
-- p.drop_down_table{item = 'Stone Axe', header = 'Two Handed Axes'}
-- p.drop_down_table{item = 'Crude Bow', header = 'Bows'}
-- p.drop_down_table{item = 'Nailed Fist', header = 'Claws'}
-- p.drop_down_table{item = 'Glass Shank', header = 'Daggers'}
-- p.drop_down_table{item = 'Driftwood Club', header = 'Generic One Handed Maces'}
-- p.drop_down_table{item = 'Driftwood Sceptre', header = 'Sceptres'}
-- p.drop_down_table{item = 'Driftwood Maul', header = 'Two Handed Maces'}
-- p.drop_down_table{item = 'Gnarled Branch', header = 'Staves'}
-- p.drop_down_table{item = 'Rusted Sword', header = 'Generic One Handed Swords'}
-- p.drop_down_table{item = 'Rusted Spike', header = 'Thrusting Swords'}
-- p.drop_down_table{item = 'Corroded Blade', header = 'Two Handed Swords'}
-- p.drop_down_table{item = 'Driftwood wand', header = 'Wands'}
-- p.drop_down_table{item = 'Fishing Rod', header = 'Fishing Rods'}
-- Accessories
-- p.drop_down_table{item = 'Amber Amulet', header = 'Amulets'}
-- p.drop_down_table{item = 'Leather Belt', header = 'Belts'}
-- p.drop_down_table{item = 'Blunt Arrow Quiver', header = 'Quivers'}
-- p.drop_down_table{item = 'Coral Ring', header = 'Rings'}
-- Armour
-- p.drop_down_table{item = 'Plate Vest', header = 'Armour Body Armours'}
-- p.drop_down_table{item = 'Shabby Jerkin', header = 'Evasion Body Armours'}
-- p.drop_down_table{item = 'Simple Robe', header = 'Energy Shield Body Armours'}
-- p.drop_down_table{item = 'Scale Vest', header = 'Armour/Evasion Body Armours'}
-- p.drop_down_table{item = 'Chainmail Vest', header = 'Armour/Energy Shield Body Armours'}
-- p.drop_down_table{item = 'Padded Vest', header = 'Energy Shield/Evasion Body Armours'}
-- p.drop_down_table{item = 'Sacrificial Garb', header = 'Armour/Energy Shield/Evasion Body Armours'}
-- p.drop_down_table{item = 'Iron Greaves', header = 'Armour Boots'}
-- p.drop_down_table{item = 'Rawhide Boots', header = 'Evasion Boots'}
-- p.drop_down_table{item = 'Wool Shoes', header = 'Energy Shield Boots'}
-- p.drop_down_table{item = 'Leatherscale Boots', header = 'Armour/Evasion Boots'}
-- p.drop_down_table{item = 'Chain Boots', header = 'Armour/Energy Shield Boots'}
-- p.drop_down_table{item = 'Wrapped Boots', header = 'Energy Shield/Evasion Boots'}
-- p.drop_down_table{item = 'Golden Caligae', header = 'Demigod'}
-- p.drop_down_table{item = 'Iron Gauntlets', header = 'Armour Gloves'}
-- p.drop_down_table{item = 'Rawhide Gloves', header = 'Evasion Gloves'}
-- p.drop_down_table{item = 'Wool Gloves', header = 'Energy Shield Gloves'}
-- p.drop_down_table{item = 'Fishscale Gauntlets', header = 'Armour/Evasion Gloves'}
-- p.drop_down_table{item = 'Chain Gloves', header = 'Armour/Energy Shield Gloves'}
-- p.drop_down_table{item = 'Wrapped Mitts', header = 'Energy Shield/Evasion Gloves'}
-- p.drop_down_table{item = 'Iron Hat', header = 'Armour Helmets'}
-- p.drop_down_table{item = 'Leather Cap', header = 'Evasion Helmets'}
-- p.drop_down_table{item = 'Vine Circlet', header = 'Energy Shield Helmets'}
-- p.drop_down_table{item = 'Battered Helm', header = 'Armour/Evasion Helmets'}
-- p.drop_down_table{item = 'Rusted Coif', header = 'Armour/Energy Shield Helmets'}
-- p.drop_down_table{item = 'Scare Mask', header = 'Energy Shield/Evasion Helmets'}
-- p.drop_down_table{item = 'Splintered Tower Shield', header = 'Armour Shields'}
-- p.drop_down_table{item = 'Goathide Buckler', header = 'Evasion Shields'}
-- p.drop_down_table{item = 'Twig Spirit Shield', header = 'Energy Shield Shields'}
-- p.drop_down_table{item = 'Rotted Round Shield', header = 'Armour/Evasion Shields'}
-- p.drop_down_table{item = 'Plank Kite Shield', header = 'Armour/Energy Shield Shields'}
-- p.drop_down_table{item = 'Spiked Bundle', header = 'Energy Shield/Evasion Shields'}
-- Args
local g_args = getArgs(frame, {
parentFirst = true
})
local g_frame = util.misc.get_frame(frame)
local get_tags = p.get_tags{g_args.item}
local tags = {}
tags = util.string.split(get_tags['Has tags'], ', ')
local header = g_args['header']
if header == nil then
header = table.concat(tags, ', ')
end
-- Conditions
local conditions = {}
conditions[1] = 'concept' -- Reserve for Concepts.
conditions[#conditions+1] = string.format('[[Has subobject::<q> [[Has spawn weight::>>0]] [[Has tag::%s]] </q>]]', table.concat(tags, ' || '))
-- Fields
local fields = {
'?Is mod',
'?Has name',
'?Has level requirement',
'?Has mod group',
'?Has mod type',
'?Has stat text'
}
-- Parameters
local parameters = {
sort = 'Has mod group, Has mod type, Has level requirement',
limit = 1000 -- lets see
}
local data = {}
data = {
prefix = {
header = 'Prefix',
condition = '[[Concept:Spawnable named prefix item mods]]',
},
suffix = {
header = 'Suffix',
condition = '[[Concept:Spawnable named suffix item mods]]',
},
corrupted = {
header = 'Corrupted',
condition = '[[Concept:Spawnable corrupted mods]]',
},
master = {
header = 'Forsaken masters',
condition = '[[Concept:AAAAAAAAAAAAAAAAAAAA]]',
},
}
-- Define the output.
local out = {}
out[#out+1] = string.format('==%s== \n', header)
out[#out+1] = '<div style="float: right; text-align:center"><div class="mw-collapsible-collapse-all" style="cursor:pointer;">[Collapse All]</div><hr><div class="mw-collapsible-expand-all" style="cursor:pointer;">[Expand All]</div></div>'
out[#out+1] = string.format('The table below displays the available [[modifiers]] for [[item]]s such as %s.<br><br><br>', g_frame:expandTemplate{title = 'Item link', args = {get_tags[1]}})
local results = {}
for i_type, generation_type in ipairs({'prefix', 'suffix', 'corrupted'}) do -- Change to data eventually.
--
-- Query mods
--
conditions[1] = data[generation_type]['condition']
local query = {}
for _, v in ipairs(conditions) do
query[#query+1] = v
end
for _, v in ipairs(fields) do
query[#query+1] = v
end
for k, v in pairs(parameters) do
query[k] = v
end
results[generation_type] = util.smw.query(query, g_frame)
local container = mw.html.create('div')
:attr('style', 'vertical-align:top; display:inline-block;')
local headers = container
headers
:tag('h3')
:wikitext(string.format('%s', data[generation_type]['header']))
:done()
:done()
local results_tags = {}
local tags_weighting = {}
local last
for i, v in ipairs(results[generation_type]) do -- Loop through all the results from the smw query.
-- Query tags
local pagename = results[generation_type][i][1]
query_tags = {
string.format('[[-Has subobject::%s]]', pagename),
'?Has tag',
'?Has spawn weight',
'?Is tag number',
sort='Is tag number',
}
results_tags[i] = util.smw.query(query_tags, g_frame)
tags_weighting[i] = {}
tags_weighting[i][1] = results_tags[i][1]
local tags_spawn = {}
for f, row in ipairs(results_tags[i]) do
local spawn_weight = row['Has spawn weight']:gsub(',', '') -- Remove the thousand separator that the numbers may have.
tags_weighting[i][row['Has tag']] = tonumber(spawn_weight)
end
local j = 0
repeat
j = j+1
if (tags_weighting[i][tags[j]] or -1) > 0 then
if results[generation_type][i]['Has mod type'] ~= last then -- If the current mod type is different to the last mod type, create a new table.
local mod_appl = 'Global' -- Assume the mod is global if local isn't specified in the mod id.
if results[generation_type][i]['Is mod']:find('Local') ~= nil then
mod_appl = 'Local'
end
local tbl_caption = p.header(results[generation_type][i]['Has stat text'])
last = results[generation_type][i]['Has mod type']
tbl = container:tag('table')
tbl
:attr('class', 'mw-collapsible mw-collapsed')
:attr('style', 'text-align:left; line-height:1.60em; width:800px;') -- white-space:nowrap;
:tag('th')
:attr('style', 'text-align:left; line-height:1.40em; border-bottom:1pt solid dimgrey;')
:attr('colspan', '3')
:wikitext(string.format('%s (%s)', g_frame:expandTemplate{title = 'c', args = {'mod', tbl_caption}}, mod_appl))
:done()
:done()
end
local mod_name = results[generation_type][i]['Has name']
if mod_name == '' then
mod_name = results[generation_type][i]['Is mod']
end
tbl
:tag('tr')
:tag('td')
:attr('width', '150')
:wikitext(string.format('[[%s|%s]]', results[generation_type][i][1], mod_name:gsub('%s', ' ')))
:done()
:tag('td')
:attr('width', '1')
:wikitext(string.format('%s %s',game.level_requirement['short_upper']:gsub('%s', ' '), results[generation_type][i]['Has level requirement']))
:done()
:tag('td')
:attr('width', '*')
:wikitext(string.format('%s', g_frame:expandTemplate{title = 'c', args = {'mod', results[generation_type][i]['Has stat text']:gsub('<br>', ', ')}}))
:done()
end
until (tags_weighting[i][tags[j]] or -1) >= 0
end
out[#out+1] = tostring(container)
end
return table.concat(out,'')
end
return p