Module:Icons: Difference between revisions
From Melvor Idle
Falterfire (talk | contribs) (Created this for use in other modules.) |
m (Fix extension override handling for skill reqs) |
||
(235 intermediate revisions by 12 users not shown) | |||
Line 1: | Line 1: | ||
-- | local Shared = require("Module:Shared") | ||
local Num = require('Module:Number') | |||
local Overrides = require('Module:Icons/Overrides') | |||
-- Locally index some functions for performance | |||
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Num.formatnum, tostring, type | |||
local p = {} | local p = {} | ||
--Extension overrides for items that have non-png images | |||
--Name level overrides take precedence over type level overrides | |||
local extOverrides = Overrides.extOverrides() | |||
--Some overrides only apply for a specific type | |||
local typeExtOverrides = Overrides.typeExtOverrides() | |||
--When calling for an icon of type Key, instead use type Value | |||
local typeOverrides = Overrides.typeOverrides() | |||
--When calling for an icon for Key, replace with image Value, and optionally override type also | |||
local imgOverrides = Overrides.imgOverrides() | |||
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also | |||
local typeImgOverrides = Overrides.typeImgOverrides() | |||
--When calling for an icon for Key, the link goes to Value | |||
local linkOverrides = Overrides.linkOverrides() | |||
--When calling for an icon for Key + Type, the link goes to Value | |||
local typeLinkOverrides = Overrides.typeLinkOverrides() | |||
-- If no other text override was specified for the given link, use these | |||
local txtOverrides = Overrides.txtOverrides() | |||
-- Ambiguous overrides section | |||
local ambiguousOverrides = Overrides.ambiguousOverrides() | |||
-- For ambiguous overrides, determines the type text to be used in the page link | |||
local ambiguousTypeMap = Overrides.ambiguousTypeMap() | |||
local currencyFormatDefn = Overrides.currencyFormatDefn() | |||
-- Defines icon types for which a section or anchor on a static page should be linked to, rather | |||
-- than the usual page linking | |||
local sectionLinks = Overrides.sectionLinks() | |||
function p.Icon(frame) | function p.Icon(frame) | ||
local args = frame.args ~= nil and frame.args or frame | |||
local link = args[1] | |||
local text = args[2] | |||
local iconType = args.type | |||
local ext = args.ext ~= nil and args.ext ~= '' and args.ext or 'png' | |||
local notext = args.notext ~= nil and args.notext ~= '' | |||
local nolink = args.nolink ~= nil and args.nolink ~= '' | |||
local noicon = args.noicon ~= nil and args.noicon ~= '' | |||
local nospan = args.nospan ~= nil and args.nospan | |||
local menu = args.menu ~= nil and args.menu ~= '' | |||
local imgSize = args.size ~= nil and args.size or 25 | |||
local qty = args.qty | |||
local img = args.img ~= nil and args.img ~= '' and args.img or link | |||
local class = args.class ~= nil and args.class ~= '' and args.class or '' | |||
local altText = args.alt ~= nil and args.alt or (notext and (text or link)) or '' | |||
local linkSection = args.section | |||
local expIcon = args.expicon ~= nil and args.expicon or '' | |||
link = fixPagename(link) | |||
img = fixPagename(img) | |||
img = sgsub(img, '#', '') | |||
img = sgsub(img, '/Training', '') | |||
img = sgsub(img, '/Guide', '') | |||
img = sgsub(img, '/Boosts', '') | |||
-- Remove '#' from links to facilitate linking to things with hashes in | |||
-- their names (e.g. item 'Birthday Cake Piece #1'). Links to sections | |||
-- of a page should instead be performed using the 'section' parameter. | |||
link = sgsub(link, '#', '') | |||
-- Handle types for which links should be to a section of a static page | |||
local sl = sectionLinks[iconType] | |||
if sl ~= nil and not sl.exclude[link] then | |||
if text == nil or text == '' then | |||
text = link | |||
end | |||
linkSection = string.gsub(link, ' ', '') | |||
-- Link overwriting must occur after text & linkSection have been set | |||
link = sl.link | |||
if sl.img ~= nil then | |||
img = sl.img[1] | |||
if sl.img[2] ~= nil then | |||
iconType = sl.img[2] | |||
end | |||
end | |||
end | |||
--MANUAL OVERRIDES | |||
local origType = iconType | |||
local ovrImg = imgOverrides[link] | |||
local ovrTypeImg = typeImgOverrides[iconType] | |||
if ovrTypeImg ~= nil then | |||
ovrImg = ovrTypeImg ~= nil and ovrTypeImg[img] or ovrImg | |||
end | |||
local ovrTxt = txtOverrides[link] | |||
local ovrLink = linkOverrides[link] | |||
local ovrTypeLink = typeLinkOverrides[iconType] | |||
if ovrTypeLink ~= nil and ovrTypeLink[img] ~= nil then | |||
if ovrTypeLink[img] == '' then | |||
nolink = true | |||
else | |||
ovrLink = ovrTypeLink[img] | |||
end | |||
end | |||
local hasText = (text ~= nil and text ~= '') | |||
if ovrImg ~= nil and img == link then | |||
if type(ovrImg) == 'string' then | |||
img = ovrImg | |||
elseif type(ovrImg) == 'table' then | |||
img = ovrImg[1] | |||
if ovrImg[2] ~= nil then iconType = ovrImg[2] end | |||
end | |||
end | |||
-- Type & extension overrides must be after adjustments have been made | |||
-- for any image overrides | |||
local ovrTypeExt, ovrTypeExtTable = nil, typeExtOverrides[iconType] | |||
if ovrTypeExtTable ~= nil then | |||
ovrTypeExt = ovrTypeExtTable[img] | |||
end | |||
local ovrType = typeOverrides[iconType] | |||
local ovrExt = extOverrides.name[img] | |||
if ovrExt == nil then | |||
ovrExt = extOverrides.type[ovrType or iconType] | |||
end | |||
if not hasText and ovrTxt ~= nil then | |||
text = ovrTxt | |||
hasText = true | |||
end | |||
if ovrLink ~= nil then | |||
if not hasText then | |||
text = link | |||
hasText = true | |||
end | |||
link = ovrLink | |||
end | |||
if ovrTypeExt ~= nil then | |||
ext = ovrTypeExt | |||
elseif ovrExt ~= nil then | |||
ext = ovrExt | |||
end | |||
if ovrType ~= nil then | |||
iconType = ovrType | |||
end | |||
-- There are a couple specific double overrides to be included that don't fit in the above lists | |||
-- If the link requires disambiguation or a section, the modify the link accordingly | |||
-- while preserving the displayed text | |||
local isAmbig, hasSection = ambiguousOverrides[link], linkSection ~= nil and linkSection ~= '' | |||
if isAmbig or hasSection then | |||
if not hasText then | |||
text = link | |||
hasText = true | |||
end | |||
if isAmbig then | |||
link = link .. ' (' .. (ambiguousTypeMap[origType] or origType) .. ')' | |||
end | |||
if hasSection then | |||
link = link .. '#' .. linkSection | |||
end | |||
end | |||
local resultText = '' | |||
if not noicon then | |||
-- Image size | |||
local txtSize = tostring(imgSize) | |||
-- Extension and type if one is set | |||
local txtImg = (iconType ~= nil and iconType ~= '' and img .. '_(' .. iconType .. ')' or img) .. '.' .. ext | |||
-- Include a link unless no link -and- no text was requested | |||
local txtLink = '|link=' .. (nolink and '' or link) | |||
resultText = '[[File:' .. txtImg .. '|' .. txtSize .. 'x' .. txtSize .. 'px|alt=' .. altText .. txtLink .. ']]' | |||
if class ~= nil and class ~= '' then | |||
resultText = '<span class="'..class..'">'..resultText..'</span>' | |||
end | |||
end | |||
if not notext then | |||
if nolink then | |||
resultText = resultText .. (noicon and '' or ' ') .. (hasText and text or link) | |||
else | |||
resultText = resultText .. (noicon and '' or ' ') .. '[[' .. link .. (hasText and text ~= link and '|' .. text or '') .. ']]' | |||
end | |||
end | |||
-- Add Quantity to the front if requested | |||
--local resultQty = (qty ~= nil and qty ~= '' and formatnum(qty) .. ' ' or '') | |||
if qty ~= nil and qty ~= '' then | |||
resultText = formatnum(qty) .. ' ' .. resultText | |||
end | |||
if menu then | |||
return '{| class="articletable img-text" style="vertical-align:middle;"\r\n|-\r\n|' .. expIcon .. resultText .. '\r\n|}' | |||
elseif not noicon and not nospan then | |||
return '<span class="img-text">' .. expIcon .. resultText .. '</span>' | |||
else | |||
return resultText | |||
end | |||
end | |||
-- Returns a skill icon based on the realm. | |||
function p._SkillRealmIcon(skill, realmID, size) | |||
local realm = realmID or 'melvorD:Melvor' | |||
local link = fixPagename(skill) | |||
local img = mw.html.create('span') | |||
if realm == 'melvorItA:Abyssal' then | |||
img:addClass('abyss-icon') | |||
end | |||
size = size or 25 | |||
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).png') | |||
:wikitext('|'):wikitext(size):wikitext('x'):wikitext(size):wikitext('px') | |||
:wikitext('|link='):wikitext(link):wikitext(']]') | |||
return tostring(img) | |||
end | |||
function p.SkillRealmIcon(frame) | |||
local args = frame.args ~= nil and frame.args or frame | |||
local skill = args[1] | |||
local realmID = args.realm | |||
local size = tonumber(args.size) | |||
return p._SkillRealmIcon(skill, realmID, size) | |||
end | |||
if | function p._SkillReq(skill, level, showText, realmID) | ||
local realm = realmID or 'melvorD:Melvor' | |||
local link = fixPagename(skill) | |||
local altText = (showText and '') or skill | |||
if level == nil then | |||
level = 'Unknown [[Category:Pages with script errors]]' | |||
end | |||
-- Create skill image. | |||
local img = mw.html.create() | |||
if realm == 'melvorItA:Abyssal' then | |||
img = img:tag('span') | |||
:addClass('abyss-icon') | |||
end | |||
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).png') | |||
:wikitext('|25x25px|link='):wikitext(link) | |||
:wikitext('|alt='):wikitext(altText) | |||
:wikitext(']]') | |||
-- Create text and add image. | |||
local text = mw.html.create('span') | |||
:addClass('img-text') | |||
:node(img) | |||
if showText == true then | |||
text:wikitext(' [[' .. link .. ']]') | |||
end | |||
--28/06/2024. Commented this out to try out red icons for abyssal levels | |||
-- as opposed to the text below. Remove entire section if still commented out after | |||
-- a week or two. | |||
--if realm == 'melvorItA:Abyssal' then | |||
-- text:wikitext(" Abyssal Level ") | |||
--else | |||
text:wikitext(" Level ") | |||
--end | |||
text:wikitext(level) | |||
return tostring(text) | |||
end | |||
function p._MasteryReq(itemName, level, showText) | |||
local iconname = itemName | |||
local linkname = itemName | |||
--First, go with the lowest tier of potions if a potion is mentioned | |||
local s, e = string.find(itemName, 'Potion') | |||
if e ~= nil then | |||
linkname = string.sub(itemName, 1, e) | |||
iconname = linkname..' I' | |||
end | |||
local altTextItem = (showText and '') or linkname | |||
local altTextMastery = (showText and '') or ' Mastery' | |||
local result = mw.html.create('span') | |||
result | |||
:addClass('img-text') | |||
:wikitext('Level ' .. level .. ' ') | |||
:node(p.Icon({linkname, img=iconname, type='item', notext=true, nospan=true, alt=altTextItem})) | |||
:node('[[File:Mastery.svg|25x25px|alt=' .. altTextMastery .. ']]') | |||
if showText then | |||
result | |||
:wikitext('[[' .. linkname .. ']] ') | |||
:wikitext('[[Mastery]]') | |||
end | end | ||
return tostring(result) | |||
end | |||
function p._Currency(currencyID, amount, maxAmount) | |||
local currencyDefn = currencyFormatDefn[currencyID] | |||
if currencyDefn == nil then | |||
error('Invalid currency ID: ' .. currencyID, 2) | |||
end | |||
local fileName, link, altText = currencyDefn.img, currencyDefn.name, currencyDefn.abbr | |||
local function numColour(amount) | |||
if tonumber(amount) < 0 then | |||
return mw.html.create('span') | |||
:css('color', 'red') | |||
:wikitext(formatnum(amount)) | |||
:done() | |||
else | |||
return formatnum(amount) | |||
end | |||
end | |||
local html = mw.html.create('span') | |||
:addClass('img-text') | |||
-- Currency amounts | |||
if tonumber(amount) ~= nil then | |||
local text = mw.html.create('span') | |||
:css('margin-right', '0.2em') | |||
:node(numColour(amount)) | |||
if (tonumber(maxAmount) ~= nil and maxAmount > amount) then | |||
text:wikitext(' - ' .. numColour(maxAmount)) | |||
end | |||
html:node(text:done()) | |||
end | |||
-- Currency icon | |||
if fileName ~= nil then | |||
html:wikitext('[[File:'):wikitext(fileName):wikitext('|25px') | |||
if link ~= nil then | |||
html:wikitext('|link='):wikitext(link) | |||
end | |||
html:wikitext('|alt=') | |||
:wikitext(((altText == nil and '') or altText)) | |||
:wikitext(']]') | |||
end | |||
html:done() | |||
if ((amount ~= nil and tonumber(amount) == nil) | |||
or (maxAmount ~= nil and tonumber(maxAmount) == nil)) then | |||
html:wikitext('[[Category:Pages with non-numeric currency arguments]]') | |||
end | |||
return tostring(html) | |||
end | |||
-- p.Currency() is called by various currency templates: | |||
-- [[Template:GP]], [[Template:SC]], [[Template:RC]] | |||
function p.Currency(frame) | |||
local args = frame.args ~= nil and frame.args or frame | |||
local currID, minVal, maxVal, _ | |||
currID = args[1] | |||
if args[2] ~= nil and args[2] ~= '' then | |||
minVal, _ = string.gsub(args[2], ',', '') | |||
end | |||
if args[3] ~= nil and args[3] ~= '' then | |||
maxVal, _ = string.gsub(args[3], ',', '') | |||
end | |||
return p._Currency((currID or 'nil'), minVal, maxVal) | |||
end | |||
--Adding a shortcut function for this | |||
function p.TotH() | |||
return '<span class="img-text">[[File:TotH.svg|25x25px|link=Throne of the Herald Expansion]]</span>' | |||
end | |||
function p.AoD() | |||
return '<span class="img-text">[[File:AoD.png|25x25px|link=Atlas of Discovery Expansion]]</span>' | |||
end | |||
function p.ItA() | |||
return '<span class="img-text">[[File:ItA.png|25x25px|link=Into the Abyss Expansion]]</span>' | |||
end | |||
function p.Melvor() | |||
return '<span class="img-text">[[File:Melvor_Logo.svg|25x25px|link=Full Version]]</span>' | |||
end | |||
-- Function to retrieve the DLC id used for sorting columns that contain a DLC icon. | |||
-- Passthrough from shared so that caller doesn't have to include Shared Module | |||
function p.getExpansionID(id) | |||
return Shared.getLocalID(id) | |||
end | |||
function p.getExpansionIcon(id) | |||
local ns, _ = Shared.getLocalID(id) | |||
if ns == 'melvorTotH' then | |||
return p.TotH()..' ' | |||
elseif ns == 'melvorAoD' then | |||
return p.AoD()..' ' | |||
elseif ns == 'melvorItA' then | |||
return p.ItA()..' ' | |||
else | |||
return '' | |||
end | |||
end | |||
-- Special function that returns a Melvor idle icon | |||
-- Specifically used for a "DLC" column on tables. | |||
-- Avoids every item from receiving the "base game icon" | |||
function p.getDLCColumnIcon(id) | |||
local icon = p.getExpansionIcon(id) | |||
if icon == '' then | |||
icon = p.Melvor() .. ' ' | |||
end | |||
return icon | |||
end | end | ||
return p | return p |
Latest revision as of 20:57, 26 August 2024
Documentation for this module may be created at Module:Icons/doc
local Shared = require("Module:Shared")
local Num = require('Module:Number')
local Overrides = require('Module:Icons/Overrides')
-- Locally index some functions for performance
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Num.formatnum, tostring, type
local p = {}
--Extension overrides for items that have non-png images
--Name level overrides take precedence over type level overrides
local extOverrides = Overrides.extOverrides()
--Some overrides only apply for a specific type
local typeExtOverrides = Overrides.typeExtOverrides()
--When calling for an icon of type Key, instead use type Value
local typeOverrides = Overrides.typeOverrides()
--When calling for an icon for Key, replace with image Value, and optionally override type also
local imgOverrides = Overrides.imgOverrides()
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also
local typeImgOverrides = Overrides.typeImgOverrides()
--When calling for an icon for Key, the link goes to Value
local linkOverrides = Overrides.linkOverrides()
--When calling for an icon for Key + Type, the link goes to Value
local typeLinkOverrides = Overrides.typeLinkOverrides()
-- If no other text override was specified for the given link, use these
local txtOverrides = Overrides.txtOverrides()
-- Ambiguous overrides section
local ambiguousOverrides = Overrides.ambiguousOverrides()
-- For ambiguous overrides, determines the type text to be used in the page link
local ambiguousTypeMap = Overrides.ambiguousTypeMap()
local currencyFormatDefn = Overrides.currencyFormatDefn()
-- Defines icon types for which a section or anchor on a static page should be linked to, rather
-- than the usual page linking
local sectionLinks = Overrides.sectionLinks()
function p.Icon(frame)
local args = frame.args ~= nil and frame.args or frame
local link = args[1]
local text = args[2]
local iconType = args.type
local ext = args.ext ~= nil and args.ext ~= '' and args.ext or 'png'
local notext = args.notext ~= nil and args.notext ~= ''
local nolink = args.nolink ~= nil and args.nolink ~= ''
local noicon = args.noicon ~= nil and args.noicon ~= ''
local nospan = args.nospan ~= nil and args.nospan
local menu = args.menu ~= nil and args.menu ~= ''
local imgSize = args.size ~= nil and args.size or 25
local qty = args.qty
local img = args.img ~= nil and args.img ~= '' and args.img or link
local class = args.class ~= nil and args.class ~= '' and args.class or ''
local altText = args.alt ~= nil and args.alt or (notext and (text or link)) or ''
local linkSection = args.section
local expIcon = args.expicon ~= nil and args.expicon or ''
link = fixPagename(link)
img = fixPagename(img)
img = sgsub(img, '#', '')
img = sgsub(img, '/Training', '')
img = sgsub(img, '/Guide', '')
img = sgsub(img, '/Boosts', '')
-- Remove '#' from links to facilitate linking to things with hashes in
-- their names (e.g. item 'Birthday Cake Piece #1'). Links to sections
-- of a page should instead be performed using the 'section' parameter.
link = sgsub(link, '#', '')
-- Handle types for which links should be to a section of a static page
local sl = sectionLinks[iconType]
if sl ~= nil and not sl.exclude[link] then
if text == nil or text == '' then
text = link
end
linkSection = string.gsub(link, ' ', '')
-- Link overwriting must occur after text & linkSection have been set
link = sl.link
if sl.img ~= nil then
img = sl.img[1]
if sl.img[2] ~= nil then
iconType = sl.img[2]
end
end
end
--MANUAL OVERRIDES
local origType = iconType
local ovrImg = imgOverrides[link]
local ovrTypeImg = typeImgOverrides[iconType]
if ovrTypeImg ~= nil then
ovrImg = ovrTypeImg ~= nil and ovrTypeImg[img] or ovrImg
end
local ovrTxt = txtOverrides[link]
local ovrLink = linkOverrides[link]
local ovrTypeLink = typeLinkOverrides[iconType]
if ovrTypeLink ~= nil and ovrTypeLink[img] ~= nil then
if ovrTypeLink[img] == '' then
nolink = true
else
ovrLink = ovrTypeLink[img]
end
end
local hasText = (text ~= nil and text ~= '')
if ovrImg ~= nil and img == link then
if type(ovrImg) == 'string' then
img = ovrImg
elseif type(ovrImg) == 'table' then
img = ovrImg[1]
if ovrImg[2] ~= nil then iconType = ovrImg[2] end
end
end
-- Type & extension overrides must be after adjustments have been made
-- for any image overrides
local ovrTypeExt, ovrTypeExtTable = nil, typeExtOverrides[iconType]
if ovrTypeExtTable ~= nil then
ovrTypeExt = ovrTypeExtTable[img]
end
local ovrType = typeOverrides[iconType]
local ovrExt = extOverrides.name[img]
if ovrExt == nil then
ovrExt = extOverrides.type[ovrType or iconType]
end
if not hasText and ovrTxt ~= nil then
text = ovrTxt
hasText = true
end
if ovrLink ~= nil then
if not hasText then
text = link
hasText = true
end
link = ovrLink
end
if ovrTypeExt ~= nil then
ext = ovrTypeExt
elseif ovrExt ~= nil then
ext = ovrExt
end
if ovrType ~= nil then
iconType = ovrType
end
-- There are a couple specific double overrides to be included that don't fit in the above lists
-- If the link requires disambiguation or a section, the modify the link accordingly
-- while preserving the displayed text
local isAmbig, hasSection = ambiguousOverrides[link], linkSection ~= nil and linkSection ~= ''
if isAmbig or hasSection then
if not hasText then
text = link
hasText = true
end
if isAmbig then
link = link .. ' (' .. (ambiguousTypeMap[origType] or origType) .. ')'
end
if hasSection then
link = link .. '#' .. linkSection
end
end
local resultText = ''
if not noicon then
-- Image size
local txtSize = tostring(imgSize)
-- Extension and type if one is set
local txtImg = (iconType ~= nil and iconType ~= '' and img .. '_(' .. iconType .. ')' or img) .. '.' .. ext
-- Include a link unless no link -and- no text was requested
local txtLink = '|link=' .. (nolink and '' or link)
resultText = '[[File:' .. txtImg .. '|' .. txtSize .. 'x' .. txtSize .. 'px|alt=' .. altText .. txtLink .. ']]'
if class ~= nil and class ~= '' then
resultText = '<span class="'..class..'">'..resultText..'</span>'
end
end
if not notext then
if nolink then
resultText = resultText .. (noicon and '' or ' ') .. (hasText and text or link)
else
resultText = resultText .. (noicon and '' or ' ') .. '[[' .. link .. (hasText and text ~= link and '|' .. text or '') .. ']]'
end
end
-- Add Quantity to the front if requested
--local resultQty = (qty ~= nil and qty ~= '' and formatnum(qty) .. ' ' or '')
if qty ~= nil and qty ~= '' then
resultText = formatnum(qty) .. ' ' .. resultText
end
if menu then
return '{| class="articletable img-text" style="vertical-align:middle;"\r\n|-\r\n|' .. expIcon .. resultText .. '\r\n|}'
elseif not noicon and not nospan then
return '<span class="img-text">' .. expIcon .. resultText .. '</span>'
else
return resultText
end
end
-- Returns a skill icon based on the realm.
function p._SkillRealmIcon(skill, realmID, size)
local realm = realmID or 'melvorD:Melvor'
local link = fixPagename(skill)
local img = mw.html.create('span')
if realm == 'melvorItA:Abyssal' then
img:addClass('abyss-icon')
end
size = size or 25
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).png')
:wikitext('|'):wikitext(size):wikitext('x'):wikitext(size):wikitext('px')
:wikitext('|link='):wikitext(link):wikitext(']]')
return tostring(img)
end
function p.SkillRealmIcon(frame)
local args = frame.args ~= nil and frame.args or frame
local skill = args[1]
local realmID = args.realm
local size = tonumber(args.size)
return p._SkillRealmIcon(skill, realmID, size)
end
function p._SkillReq(skill, level, showText, realmID)
local realm = realmID or 'melvorD:Melvor'
local link = fixPagename(skill)
local altText = (showText and '') or skill
if level == nil then
level = 'Unknown [[Category:Pages with script errors]]'
end
-- Create skill image.
local img = mw.html.create()
if realm == 'melvorItA:Abyssal' then
img = img:tag('span')
:addClass('abyss-icon')
end
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).png')
:wikitext('|25x25px|link='):wikitext(link)
:wikitext('|alt='):wikitext(altText)
:wikitext(']]')
-- Create text and add image.
local text = mw.html.create('span')
:addClass('img-text')
:node(img)
if showText == true then
text:wikitext(' [[' .. link .. ']]')
end
--28/06/2024. Commented this out to try out red icons for abyssal levels
-- as opposed to the text below. Remove entire section if still commented out after
-- a week or two.
--if realm == 'melvorItA:Abyssal' then
-- text:wikitext(" Abyssal Level ")
--else
text:wikitext(" Level ")
--end
text:wikitext(level)
return tostring(text)
end
function p._MasteryReq(itemName, level, showText)
local iconname = itemName
local linkname = itemName
--First, go with the lowest tier of potions if a potion is mentioned
local s, e = string.find(itemName, 'Potion')
if e ~= nil then
linkname = string.sub(itemName, 1, e)
iconname = linkname..' I'
end
local altTextItem = (showText and '') or linkname
local altTextMastery = (showText and '') or ' Mastery'
local result = mw.html.create('span')
result
:addClass('img-text')
:wikitext('Level ' .. level .. ' ')
:node(p.Icon({linkname, img=iconname, type='item', notext=true, nospan=true, alt=altTextItem}))
:node('[[File:Mastery.svg|25x25px|alt=' .. altTextMastery .. ']]')
if showText then
result
:wikitext('[[' .. linkname .. ']] ')
:wikitext('[[Mastery]]')
end
return tostring(result)
end
function p._Currency(currencyID, amount, maxAmount)
local currencyDefn = currencyFormatDefn[currencyID]
if currencyDefn == nil then
error('Invalid currency ID: ' .. currencyID, 2)
end
local fileName, link, altText = currencyDefn.img, currencyDefn.name, currencyDefn.abbr
local function numColour(amount)
if tonumber(amount) < 0 then
return mw.html.create('span')
:css('color', 'red')
:wikitext(formatnum(amount))
:done()
else
return formatnum(amount)
end
end
local html = mw.html.create('span')
:addClass('img-text')
-- Currency amounts
if tonumber(amount) ~= nil then
local text = mw.html.create('span')
:css('margin-right', '0.2em')
:node(numColour(amount))
if (tonumber(maxAmount) ~= nil and maxAmount > amount) then
text:wikitext(' - ' .. numColour(maxAmount))
end
html:node(text:done())
end
-- Currency icon
if fileName ~= nil then
html:wikitext('[[File:'):wikitext(fileName):wikitext('|25px')
if link ~= nil then
html:wikitext('|link='):wikitext(link)
end
html:wikitext('|alt=')
:wikitext(((altText == nil and '') or altText))
:wikitext(']]')
end
html:done()
if ((amount ~= nil and tonumber(amount) == nil)
or (maxAmount ~= nil and tonumber(maxAmount) == nil)) then
html:wikitext('[[Category:Pages with non-numeric currency arguments]]')
end
return tostring(html)
end
-- p.Currency() is called by various currency templates:
-- [[Template:GP]], [[Template:SC]], [[Template:RC]]
function p.Currency(frame)
local args = frame.args ~= nil and frame.args or frame
local currID, minVal, maxVal, _
currID = args[1]
if args[2] ~= nil and args[2] ~= '' then
minVal, _ = string.gsub(args[2], ',', '')
end
if args[3] ~= nil and args[3] ~= '' then
maxVal, _ = string.gsub(args[3], ',', '')
end
return p._Currency((currID or 'nil'), minVal, maxVal)
end
--Adding a shortcut function for this
function p.TotH()
return '<span class="img-text">[[File:TotH.svg|25x25px|link=Throne of the Herald Expansion]]</span>'
end
function p.AoD()
return '<span class="img-text">[[File:AoD.png|25x25px|link=Atlas of Discovery Expansion]]</span>'
end
function p.ItA()
return '<span class="img-text">[[File:ItA.png|25x25px|link=Into the Abyss Expansion]]</span>'
end
function p.Melvor()
return '<span class="img-text">[[File:Melvor_Logo.svg|25x25px|link=Full Version]]</span>'
end
-- Function to retrieve the DLC id used for sorting columns that contain a DLC icon.
-- Passthrough from shared so that caller doesn't have to include Shared Module
function p.getExpansionID(id)
return Shared.getLocalID(id)
end
function p.getExpansionIcon(id)
local ns, _ = Shared.getLocalID(id)
if ns == 'melvorTotH' then
return p.TotH()..' '
elseif ns == 'melvorAoD' then
return p.AoD()..' '
elseif ns == 'melvorItA' then
return p.ItA()..' '
else
return ''
end
end
-- Special function that returns a Melvor idle icon
-- Specifically used for a "DLC" column on tables.
-- Avoids every item from receiving the "base game icon"
function p.getDLCColumnIcon(id)
local icon = p.getExpansionIcon(id)
if icon == '' then
icon = p.Melvor() .. ' '
end
return icon
end
return p