Module:Icons: Difference between revisions

From Melvor Idle
(Add further spellbook image overrides)
No edit summary
Tag: Manual revert
 
(36 intermediate revisions by 6 users not shown)
Line 15: Line 15:
["aurora"] = "svg",
["aurora"] = "svg",
["combatArea"] = "svg",
["combatArea"] = "svg",
["dungeon"] = "svg",
["dungeon"] = "svg", -- Some exceptions included by name below
["prayer"] = "svg",
["prayer"] = "svg",
["upgrade"] = "svg", -- Some exceptions included by name below
["upgrade"] = "svg", -- Some exceptions included by name below
Line 45: Line 45:
["Hardcore Adventure Speedrun"] = "svg",
["Hardcore Adventure Speedrun"] = "svg",
["Mastery Tokens"] = "gif",
["Mastery Tokens"] = "gif",
["Lesser Relics"] = "gif",
["Prat, the Serpent of Fire"] = "svg",
["Prat, the Serpent of Fire"] = "svg",
["Unholy Prayers"] = "svg",
["Museum"] = "svg",
-- Items
-- Items
["Amulet of Fishing"] = "svg",
["Amulet of Fishing"] = "svg",
Line 100: Line 103:
["Mark"] = "svg",
["Mark"] = "svg",
["Astro"] = "svg",
["Astro"] = "svg",
-- Curses, included to override the type level override above
-- Curses & spells, included to override the type level override above
["Madness"] = "png",
["Madness"] = "png",
["Torment"] = "png",
["Torment"] = "png",
Line 127: Line 130:
["Linden Boat"] = "png",
["Linden Boat"] = "png",
["Golden Compass"] = "png",
["Golden Compass"] = "png",
-- Rocks (Mining), included to override the type level override above
["Ship Combat Overhaul"] = "png",
["Rune Essence"] = "png",
["Blessed Bone Offering"] = "png",
["Pure Essence"] = "png",
["Ship Crow's Nest Upgrade"] = "png",
["Onyx"] = "png",
["Extra Bank Tab"] = "png",
["Oricha"] = "png",
["Superior Cooking Pot"] = "png",
["Cerulean"] = "png",
["Superior Cauldron"] = "png",
["Mithril Brush"] = "png",
["Mithril Shovel"] = "png",
["Mithril Sieve"] = "png",
["Mithril Trowel"] = "png",
["Ship Anchor Upgrade"] = "png",
["Ship Keel Upgrade"] = "png",
["Ship Mast Upgrade"] = "png",
["Ship Rudder Upgrade"] = "png",
["Ship Sails Upgrade"] = "png",
["Ship Hull Upgrade"] = "png",
["Adamant Brush"] = "png",
["Adamant Shovel"] = "png",
["Adamant Sieve"] = "png",
["Adamant Trowel"] = "png",
["Ancient Brush"] = "png",
["Ancient Shovel"] = "png",
["Ancient Sieve"] = "png",
["Ancient Trowel"] = "png",
["Crystal Brush"] = "png",
["Crystal Shovel"] = "png",
["Crystal Sieve"] = "png",
["Crystal Trowel"] = "png",
["Dark Steel Brush"] = "png",
["Dark Steel Shovel"] = "png",
["Dark Steel Sieve"] = "png",
["Dark Steel Trowel"] = "png",
["Dragon Brush"] = "png",
["Dragon Shovel"] = "png",
["Dragon Sieve"] = "png",
["Dragon Trowel"] = "png",
["Iron Brush"] = "png",
["Iron Shovel"] = "png",
["Iron Sieve"] = "png",
["Iron Trowel"] = "png",
["Relic Brush"] = "png",
["Relic Shovel"] = "png",
["Relic Sieve"] = "png",
["Relic Trowel"] = "png",
["Rune Brush"] = "png",
["Rune Shovel"] = "png",
["Rune Sieve"] = "png",
["Rune Trowel"] = "png",
["Steel Brush"] = "png",
["Steel Shovel"] = "png",
["Steel Sieve"] = "png",
["Steel Trowel"] = "png",
["Aranite Brush"] = "png",
["Aranite Shovel"] = "png",
["Aranite Sieve"] = "png",
["Aranite Trowel"] = "png",
["Travel Token"] = "png",
["Dig Site Token"] = "png",
["Summoner's Pack I"] = "png",
["Summoners' Pack II"] = "png",
["Summoners' Pack III"] = "png",
-- Marks (Summoning), included to override the type level override above
-- Marks (Summoning), included to override the type level override above
["Eagle"] = "png",
["Eagle"] = "png",
Line 141: Line 199:
["Siren"] = "png",
["Siren"] = "png",
["Spider"] = "png",
["Spider"] = "png",
["Spectre"] = "png"
["Spectre"] = "png",
-- Dungeons, included to override the type level override above
["Golem Territory"] = "png",
["Cult Grounds"] = "png",
["Trickery Temple"] = "png",
["Underwater City"] = "png",
["Underwater Ruins"] = "png",
["Eye-conic Cave"] = "png",
["Mucky Cave"] = "png",
["Lost Temple"] = "png",
["Ritual Site"] = "png",
["Shipwreck Cove"] = "png",
}
}
}
}
Line 170: Line 239:
["Bear"] = "svg",
["Bear"] = "svg",
["Devil"] = "svg"
["Devil"] = "svg"
},
["monster"] = {
["Merman"] = "svg",
["Shipwreck Beast"] = "svg",
["Treacherous Jellyfish"] = "svg",
["Merman Guard"] = "svg",
["Ghost Mercenary"] = "svg",
["Mermaid Archer"] = "svg",
["Cult Member"] = "svg",
["Cursed Pirate Captain"] = "svg",
["Fake Door"] = "svg",
["Possessed Barrel"] = "svg",
["Lich"] = "svg",
["Earth Golem (AoD)"] = "svg",
["Magic Golem"] = "svg",
["Magic Mirror"] = "svg",
["Poison Bloater"] = "svg",
["Cult Imp"] = "svg",
["Cult Monster"] = "svg",
["Ghost Sailor"] = "svg",
["Granite Golem"] = "svg",
["Nagaia"] = "svg",
["Poison Leecher"] = "svg",
["Poison Roamer"] = "svg",
["Poison Slime"] = "svg",
["Ranged Golem"] = "svg",
["Soul Taker Witch"] = "svg",
["Lava Golem"] = "svg",
["Puppet Master"] = "svg"
},
["rock"] = {
["Rune Essence"] = "png",
["Pure Essence"] = "png",
["Onyx"] = "png",
["Oricha"] = "png",
["Cerulean"] = "png",
["Crystal"] = "png",
["Pure Crystal"] = "png"
},
},
["township"] = {
["township"] = {
Line 178: Line 285:
["Winter"] = "png",
["Winter"] = "png",
["Nightfall"] = "png",
["Nightfall"] = "png",
["Solar Eclipse"] = "png",
["Solar Eclipse"] = "png"
}
}
}
}
Line 185: Line 292:
local typeOverrides = {
local typeOverrides = {
['combat'] = 'combatArea',
['combat'] = 'combatArea',
['slayer'] = 'combatArea',
['slayer'] = 'combatArea'
}
}
--When calling for an icon for Key, replace with image Value, and optionally override type also
--When calling for an icon for Key, replace with image Value, and optionally override type also
Line 199: Line 306:
['Event Token - Holiday 2021'] = 'Christmas Present (Yellow)',
['Event Token - Holiday 2021'] = 'Christmas Present (Yellow)',
["I Can't See Helmet"] = {'Golbin', 'monster'},
["I Can't See Helmet"] = {'Golbin', 'monster'},
["Golbin Raid"] = {'Golden Golbin', 'pet'},
["Throne of the Herald Expansion"] = 'TotH',
["Throne of the Herald Expansion"] = 'TotH',
["Atlas of Discovery Expansion"] = 'AoD',
["Dig Site Map"] = {'Extra Archaeology Map Slot', 'upgrade'},
-- Spellbooks
-- Spellbooks
["Ancient Magicks"] = {'Ancient', 'spellType'},
["Ancient Magicks"] = {'Ancient', 'spellType'},
Line 207: Line 317:
["Auroras"] = {'Aurora', 'spellType'},
["Auroras"] = {'Aurora', 'spellType'},
-- Shop purchases
-- Shop purchases
['Extra Bank Slot'] = {'Bank Slot', 'upgrade'},
['Basic Resupply'] = {'Lobster', 'item'},
['Basic Resupply'] = {'Lobster', 'item'},
['Standard Resupply'] = {'Crab', 'item'},
['Standard Resupply'] = {'Crab', 'item'},
Line 217: Line 328:
['Access to Throne of the Herald'] = {'Golden Key', 'item'},
['Access to Throne of the Herald'] = {'Golden Key', 'item'},
["Max Skillcape"] = 'Maximum Skillcape',
["Max Skillcape"] = 'Maximum Skillcape',
["+1 Archaeology Dig Site Map Slot"] = 'Extra Archaeology Map Slot',
["Magic Anvil"] = {'Magic Anvil', 'item'},
["Agility Prosperity"] = {'Agility', 'skill'},
["Agility Item Cost Reduction Enhancement"] = {'Agility', 'skill'},
["Cartographer's Enhancement"] = {'Cartography', 'skill'},
["Cartographer's Knowledge"] = {'Cartography', 'skill'},
["Combat Supply I"] = {'Adamant Javelin', 'item'},
["Combat Supply II"] = {'Rune Javelin', 'item'},
["Combat Supply III"] = {'Dragon Javelin', 'item'},
-- Golbin Raid shop items
["Reduce Wave Skip Cost"] = {'Melvor Logo', ''},
["Food Bonus"] = {'Melvor Logo', ''},
["Ammo Gatherer"] = {'Melvor Logo', ''},
["Rune Pouch"] = {'Melvor Logo', ''},
["Increase Starting Prayer Points"] = {'Melvor Logo', ''},
["Unlock Combat Passive Slot"] = {'Melvor Logo', ''},
["Prayer"] = {'Prayer', 'skill'},
["Increase Prayer Level"] = {'Prayer', 'skill'},
["Increase Prayer Points gained per Wave Completion"] = {'Prayer', 'skill'},
["Faster Golbin Spawns"] = {'Timer', ''},
-- Alt.Magic spells using item icons
-- Alt.Magic spells using item icons
['Item Alchemy'] = {'Item Alchemy III', 'spell'},
['Item Alchemy'] = {'Item Alchemy III', 'spell'},
Line 228: Line 359:
["Holy Invocation III"] = {'Large Urn', 'item'},
["Holy Invocation III"] = {'Large Urn', 'item'},
["Embellish"] = {'Lava Fish (Perfect)', 'item'},
["Embellish"] = {'Lava Fish (Perfect)', 'item'},
["Barrier Dust"] = {'Barrier Dust', 'item'},
["Cursed Offering"] = {'Cursed Logs', 'item'},
["Unholy Offering"] = {'Unholy Prayers', ''},
-- Overrides that allow generic potion pages to be linked to easily
-- Overrides that allow generic potion pages to be linked to easily
['Melee Accuracy Potion'] = {'Melee Accuracy Potion I', 'item'},
['Melee Accuracy Potion'] = {'Melee Accuracy Potion I', 'item'},
Line 276: Line 410:
['Alt Magic Potion'] = {'Alt Magic Potion I', 'item'},
['Alt Magic Potion'] = {'Alt Magic Potion I', 'item'},
['Alt. Magic Potion'] = {'Alt Magic Potion I', 'item'},
['Alt. Magic Potion'] = {'Alt Magic Potion I', 'item'},
['Barrier Touch Potion'] = {'Barrier Touch Potion I', 'item'},
['Crystallization Potion'] = {'Crystallization Potion I', 'item'},
['Unholy Potion'] = {'Unholy Potion I', 'item'},
['Cursed Potion'] = {'Cursed Potion I', 'item'},
['Barrier Igniter Potion'] = {'Barrier Igniter Potion I', 'item'},
['Crystal Sanction Potion'] = {'Crystal Sanction Potion I', 'item'},
-- Township resources
-- Township resources
['GP'] = {'Coins', ''},
['GP'] = {'Coins', ''},
Line 285: Line 425:
-- Township generic statue building
-- Township generic statue building
['Statue of Worship'] = 'Statue of Nothing',
['Statue of Worship'] = 'Statue of Nothing',
-- Township seasons
["Lemon Season"] = 'Spring',
-- Easter egg stuff
-- Easter egg stuff
["Lemonade (Empty)"] = "Lemonade",
["Lemonade (Empty)"] = "Lemonade",
Line 315: Line 457:
["Lemonade (Wait for it)"] = "Lemonade",
["Lemonade (Wait for it)"] = "Lemonade",
["Lemonade (Wait for it!)"] = "Lemonade",
["Lemonade (Wait for it!)"] = "Lemonade",
["Lemonade (Full)"] = "Lemonade"
["Lemonade (Full)"] = "Lemonade",
["Birthday Present (Artisan)"] = "Christmas Present (Yellow)",
["Birthday Present (Utility)"] = "Christmas Present (Blue)",
["Birthday Present (Gathering)"] = "Christmas Present (Green)",
["Birthday Present (Combat)"] = "Christmas Present (White)",
["Clue Scroll 1"] = "Event Clue 1",
["Clue Scroll 2"] = "Event Clue 1",
["Clue Scroll 3"] = "Event Clue 1",
["Clue Scroll 4"] = "Event Clue 1",
["Clue Scroll 5"] = "Event Clue 1",
["Clue Scroll 6"] = "Event Clue 1"
}
}
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also
Line 321: Line 473:
['resource'] = {
['resource'] = {
['Rune Essence'] = {'Rune Essence', 'item'},
['Rune Essence'] = {'Rune Essence', 'item'},
['Leather'] = {'Leather', 'item'},
['Leather'] = {'Leather', 'item'}
},
['combatArea'] = {
-- Combat areas which use POI images
["Eye-conic Cave"] = {'The Eye-Conic Cave', 'poi'},
["Mucky Cave"] = {'Mucky Cave', 'poi'},
["Ritual Site"] = {'Ritual Site', 'poi'},
["Lost Temple"] = {'Lost Temple', 'poi'},
["Shipwreck Cove"] = {'Shipwreck Cove', 'poi'}
},
['dungeon'] = {
-- Dungeons which use POI images
["Trickery Temple"] = {'Lost Temple', 'poi'},
["Golem Territory"] = {'Monuments', 'poi'}
},
['mark'] = {
["Tortoise"] = {'Golbin Thief', 'mark'}
}
}
}
}
Line 328: Line 496:
['Alt Magic'] = 'Alternative Magic',
['Alt Magic'] = 'Alternative Magic',
['Alt. Magic'] = 'Alternative Magic',
['Alt. Magic'] = 'Alternative Magic',
['Spider2'] = 'Brown Spider'
['Spider2'] = 'Brown Spider',
['Earth Golem (AoD)'] = 'Earth Golem (AoD)'
}
}
--When calling for an icon for Key + Type, the link goes to Value
--When calling for an icon for Key + Type, the link goes to Value
local typeLinkOverrides = {
local typeLinkOverrides = {
['spellType'] = {
['biome'] = {
-- Spellbooks
['Grasslands'] = 'Biomes',
['Standard'] = 'Standard Magic',
['Forest'] = 'Biomes',
['Ancient'] = 'Ancient Magicks',
['Mountains'] = 'Biomes',
['Archaic'] = 'Archaic Magicks',
['Water'] = 'Biomes',
['Curse'] = 'Curses',
['Swamp'] = 'Biomes',
['Aurora'] = 'Auroras'
['Valley'] = 'Biomes',
['Arid Plains'] = 'Biomes',
['Jungle'] = 'Biomes',
['Desert'] = 'Biomes',
['Snowlands'] = 'Biomes'
},
},
['resource'] = {
['resource'] = {
Line 354: Line 527:
['Leather'] = '',
['Leather'] = '',
['Clothing'] = ''
['Clothing'] = ''
},
['spellType'] = {
-- Spellbooks
['Standard'] = 'Standard Magic',
['Ancient'] = 'Ancient Magicks',
['Archaic'] = 'Archaic Magicks',
['Curse'] = 'Curses',
['Aurora'] = 'Auroras'
},
},
['township'] = {
['township'] = {
['Workers'] = '',
['Workers'] = '',
['Statistics'] = '',
['Statistics'] = '',
['Town'] = ''
['Town'] = '',
['Spring'] = 'Seasons',
['Summer'] = 'Seasons',
['Fall'] = 'Seasons',
['Winter'] = 'Seasons',
['Nightfall'] = 'Seasons',
['Solar Eclipse'] = 'Seasons'
},
},
['biome'] = {
['upgrade'] = {
['Grasslands'] = 'Biomes',
-- Shop purchases
['Forest'] = 'Biomes',
['Extra Bank Slot'] = 'Bank Slot',
['Mountains'] = 'Biomes',
['Reduce Wave Skip Cost'] = '',
['Water'] = 'Biomes',
['Food Bonus'] = '',
['Swamp'] = 'Biomes',
['Ammo Gatherer'] = '',
['Valley'] = 'Biomes',
['Rune Pouch'] = '',
['Arid Plains'] = 'Biomes',
['Increase Starting Prayer Points'] = '',
['Jungle'] = 'Biomes',
['Unlock Combat Passive Slot'] = '',
['Desert'] = 'Biomes',
['Prayer'] = '',
['Snowlands'] = 'Biomes'
['Increase Prayer Level'] = '',
['Increase Prayer Points gained per Wave Completion'] = '',
['Faster Golbin Spawns'] = '',
['Golbin Crate'] = ''
}
}
}
}


--If no other text override was specified for the given link, use these
-- If no other text override was specified for the given link, use these
local txtOverrides = {
local txtOverrides = {
['Spider2'] = 'Brown Spider'
['Spider2'] = 'Brown Spider',
['Earth Golem (AoD)'] = 'Earth Golem'
}
}
--Ambiguous overrides section
-- Ambiguous overrides section
local ambiguousOverrides = {
local ambiguousOverrides = {
['Golbin'] = true,
['Golbin'] = true,
Line 393: Line 584:
['Siren'] = true,
['Siren'] = true,
['Lightning Spirit'] = true,
['Lightning Spirit'] = true,
['Ritual Site'] = true,
['Lost Temple'] = true,
['Shipwreck Cove'] = true
}
-- For ambiguous overrides, determines the type text to be used in the page link
local ambiguousTypeMap = {
['mark'] = 'item',
['combatArea'] = 'Combat Area',
['poi'] = 'Dig Site'
}
-- 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 = {
['agility'] = {
['link'] = 'Agility',
['img'] = {'Agility', 'skill'},
['exclude'] = {}
},
['poi'] = {
['link'] = 'Cartography',
['exclude'] = {
['Ancient Market'] = true,
['Ritual Site'] = true,
['Melantis'] = true,
['Cathedral'] = true,
['Monuments'] = true,
['Coral Wreckage'] = true,
['Shipwreck Cove'] = true,
['Watchtower'] = true,
['Sacrificial Site'] = true,
['Old Village'] = true,
['Bazaar'] = true,
['Glacia City Ruins'] = true,
['Castle Ruins'] = true,
['Ancient Forge'] = true,
['Quarry'] = true,
['Secret Mines'] = true,
['Lost Temple'] = true,
['Stoneworkers'] = true
}
}
}
}
--When calling for an icon for Key, add a css class
 
-- When calling for an icon for Key, add a css class
local imgClassOverrides = {
local imgClassOverrides = {
-- Was previously used for Township stat icons prior to v1.1.2
-- Was previously used for Township stat icons prior to v1.1.2
Line 409: Line 644:
local nolink = args.nolink ~= nil and args.nolink ~= ''
local nolink = args.nolink ~= nil and args.nolink ~= ''
local noicon = args.noicon ~= nil and args.noicon ~= ''
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 menu = args.menu ~= nil and args.menu ~= ''
local imgSize = args.size ~= nil and args.size or 25
local imgSize = args.size ~= nil and args.size or 25
Line 415: Line 651:
local class = args.class ~= nil and args.class ~= '' and args.class or ''
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 altText = args.alt ~= nil and args.alt or (notext and (text or link)) or ''
local nospan = args.nospan ~= nil and args.nospan
local linkSection = args.section
local expIcon = args.expicon ~= nil and args.expicon or ''
local expIcon = args.expicon ~= nil and args.expicon or ''


Line 424: Line 660:
img = sgsub(img, '/Training', '')
img = sgsub(img, '/Training', '')
img = sgsub(img, '/Guide', '')
img = sgsub(img, '/Guide', '')
-- 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, '#', '')
link = sgsub(link, '#', '')
 
-- Special handling for links to Agility obstacles or pillars
-- Handle types for which links should be to a section of a static page
if iconType == 'agility' then
local sl = sectionLinks[iconType]
img = 'Agility'
if sl ~= nil and not sl.exclude[link] then
iconType = 'skill'
if text == nil or text == '' then
if text == nil or text == '' then
text = link
text = link
end
end
link = 'Agility#' .. string.gsub(link, ' ', '')
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
end


--MANUAL OVERRIDES
--MANUAL OVERRIDES
local origType = iconType
local ovrImg = imgOverrides[link]
local ovrImg = imgOverrides[link]
local ovrTypeImg = typeImgOverrides[iconType]
local ovrTypeImg = typeImgOverrides[iconType]
Line 464: Line 711:
-- Type & extension overrides must be after adjustments have been made
-- Type & extension overrides must be after adjustments have been made
-- for any image overrides
-- for any image overrides
local ovrTypeExt = typeExtOverrides[iconType]
local ovrTypeExt, ovrTypeExtTable = nil, typeExtOverrides[iconType]
if ovrTypeExt ~= nil then
if ovrTypeExtTable ~= nil then
ovrTypeExt = ovrTypeExt[img]
ovrTypeExt = ovrTypeExtTable[img]
end
end
local ovrType = typeOverrides[iconType]
local ovrType = typeOverrides[iconType]
Line 496: Line 743:
end
end
-- There are a couple specific double overrides to be included that don't fit in the above lists
-- There are a couple specific double overrides to be included that don't fit in the above lists
if ambiguousOverrides[link] then
 
-- 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
if not hasText then
text = link
text = link
hasText = true
hasText = true
end
end
link = link..' ('..(iconType == 'mark' and 'item' or iconType)..')'
if isAmbig then
link = link .. ' (' .. (ambiguousTypeMap[origType] or origType) .. ')'
end
if hasSection then
link = link .. '#' .. linkSection
end
end
end


Line 593: Line 849:
end
end


function p._Currency(fileName, link, altText, amt, maxAmt)
function p._Currency(fileName, link, altText, amount, maxAmount)
local amtText = nil
local ret = {}
if tonumber(amt) ~= nil then
table.insert(ret, '<span style="display:inline-block">')
amtText = formatnum(amt)
-- Currency icon
if maxAmt ~= nil and maxAmt >= amt then
if fileName ~= nil then
amtText = amtText .. ' - ' .. formatnum(maxAmt)
table.insert(ret, '[[File:' .. fileName .. '|25px')
if link ~= nil then
table.insert(ret, '|link=' .. link)
end
end
table.insert(ret, '|alt=' .. ((altText == nil and '') or altText) .. ']]')
end
end
 
-- Currency amounts
local fileText = ''
if tonumber(amount) ~= nil then
if fileName ~= nil then
local function numColour(amount)
fileText = '[[File:' .. fileName .. '|25px'
if tonumber(amount) < 0 then
if link ~= nil then
return '<span style="color:red;">' .. formatnum(amount) .. '</span>'
fileText = fileText .. '|link=' .. link
else
return formatnum(amount)
end
end
table.insert(ret, '&nbsp;' .. numColour(amount))
if (tonumber(maxAmount) ~= nil and maxAmount > amount) then
table.insert(ret, ' - ' .. numColour(maxAmount))
end
end
fileText = fileText .. '|alt=' .. ((altText == nil and '') or altText) .. ']]'
end
end
 
table.insert(ret, '</span>')
return '<span style="display:inline-block">' .. fileText .. (amtText ~= nil and '&nbsp;' .. amtText or '') .. '</span>'
return table.concat(ret)
end
end


Line 629: Line 894:
function p.TotH()
function p.TotH()
return p.Icon({'Throne of the Herald Expansion', notext=true, img='TotH', alt=''})
return p.Icon({'Throne of the Herald Expansion', notext=true, img='TotH', alt=''})
end
function p.AoD()
return p.Icon({'Atlas of Discovery Expansion', notext=true, img='AoD', alt=''})
end
-- Prework to have function call available for when DLC releases.
-- Remove comments and uncomment line below when the image is available.
function p.ItA()
--return p.Icon({'Into the Abyss Expansion', notext=true, img='ItA', alt=''})
return nil
end
end


Line 635: Line 911:
if ns == 'melvorTotH' then
if ns == 'melvorTotH' then
return p.TotH()..' '
return p.TotH()..' '
elseif ns == 'melvorAoD' then
return p.AoD()..' '
else
else
return ''
return ''

Latest revision as of 22:35, 27 March 2024

Documentation for this module may be created at Module:Icons/doc

local Shared = require("Module:Shared")

-- Locally index some functions for performance
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Shared.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 = {
	["type"] = {
		["skill"] = "svg",
		["spellType"] = "svg",
		["spell"] = "svg",
		["curse"] = "svg", -- Some exceptions included by name below
		["aurora"] = "svg",
		["combatArea"] = "svg",
		["dungeon"] = "svg", -- Some exceptions included by name below
		["prayer"] = "svg",
		["upgrade"] = "svg", -- Some exceptions included by name below
		["tree"] = "svg",
		["rock"] = "svg", -- Some exceptions included by name below
		["thieving"] = "svg",
		["constellation"] = "svg",
		["building"] = "svg",
		["resource"] = "svg",
		["township"] = "svg"
	},
	["name"] = {
		-- General
		["Combat"] = "svg",
		["Guides"] = "svg",
		["Mastery"] = "svg",
		["Coins"] = "svg",
		["Slayer Coins"] = "svg",
		["Raid Coins"] = "svg",
		["TotH"] = "svg",
		["Shop"] = "svg",
		["Easter"] = "svg",
		["Melvor Logo"] = "svg",
		["Question"] = "svg",
		["Timer"] = "svg",
		["Hardcore"] = "svg",
		["Chaos"] = "svg",
		["Internal Suffering Speedrun"] = "svg",
		["Hardcore Adventure Speedrun"] = "svg",
		["Mastery Tokens"] = "gif",
		["Lesser Relics"] = "gif",
		["Prat, the Serpent of Fire"] = "svg",
		["Unholy Prayers"] = "svg",
		["Museum"] = "svg",
		-- Items
		["Amulet of Fishing"] = "svg",
		["Lemon"] = "jpg",
		["Lemons"] = "jpg",
		["Lemonade"] = "jpg",
		["Ancient Crossbow"] = "svg",
		["Air Shard"] = "svg",
		["Water Shard"] = "svg",
		["Earth Shard"] = "svg",
		["Fire Shard"] = "svg",
		["Confetti Crossbow"] = "svg",
		["Cloudburst Staff"] = "gif",
		["Shockwave"] = "svg",
		["Event Clue 1"] = "svg",
		["Event Clue 2"] = "svg",
		["Event Clue 3"] = "svg",
		["Event Clue 4"] = "svg",
		-- Pets
		["Cris"] = "svg",
		["Cool Rock"] = "svg",
		["Puff, the Baby Dragon"] = "svg",
		["Bruce"] = "svg",
		["Lil Ron"] = "svg",
		["Leonardo"] = "svg",
		["Golden Golbin"] = "svg",
		["Ty"] = "svg",
		["Ripper the Reindeer"] = "svg",
		["Chick"] = "svg",
		["Zarrah"] = "svg",
		["Chio"] = "svg",
		["Bouncing Bob"] = "svg",
		["Rosey"] = "svg",
		["Ayyden"] = "svg",
		["Arctic Yeti"] = "svg",
		["Mac"] = "svg",
		["Jerry the Giraffe"] = "svg",
		["Preston the Platypus"] = "svg",
		["Quill"] = "svg",
		["Gunter"] = "svg",
		["Salem"] = "svg",
		["Peri"] = "svg",
		["Otto"] = "svg",
		["Jelly Jim"] = "svg",
		["Harley"] = "svg",
		["Singe"] = "svg",
		["Aquarias"] = "svg",
		["Norman"] = "svg",
		["Erran"] = "svg",
		["Ren"] = "svg",
		["Pablo"] = "svg",
		["Sam"] = "svg",
		["Tim the Wolf"] = "svg",
		["Mark"] = "svg",
		["Astro"] = "svg",
		-- Curses & spells, included to override the type level override above
		["Madness"] = "png",
		["Torment"] = "png",
		["Despair"] = "png",
		-- Alt. Magic
		["Rags to Riches III"] = "png",
		-- Upgrades, included to override the type level override above
		["Golbin Crate"] = "png",
		["Corundum Axe"] = "png",
		["Augite Axe"] = "png",
		["Meteorite Axe"] = "png",
		["Divine Axe"] = "png",
		["Spruce Cooking Fire"] = "png",
		["Elderwood Cooking Fire"] = "png",
		["Carrion Cooking Fire"] = "png",
		["Iridium Pot"] = "png",
		["Palladium Pot"] = "png",
		["Divine Pot"] = "png",
		["Corundum Furnace"] = "png",
		["Augite Furnace"] = "png",
		["Divine Furnace"] = "png",
		["Sign of the Stars"] = "png",
		["Summoner's Altar"] = "png",
		["Golden Shard"] = "png",
		["Labyrinth Solution"] = "png",
		["Linden Boat"] = "png",
		["Golden Compass"] = "png",
		["Ship Combat Overhaul"] = "png",
		["Blessed Bone Offering"] = "png",
		["Ship Crow's Nest Upgrade"] = "png",
		["Extra Bank Tab"] = "png",
		["Superior Cooking Pot"] = "png",
		["Superior Cauldron"] = "png",
		["Mithril Brush"] = "png",
		["Mithril Shovel"] = "png",
		["Mithril Sieve"] = "png",
		["Mithril Trowel"] = "png",
		["Ship Anchor Upgrade"] = "png",
		["Ship Keel Upgrade"] = "png",
		["Ship Mast Upgrade"] = "png",
		["Ship Rudder Upgrade"] = "png",
		["Ship Sails Upgrade"] = "png",
		["Ship Hull Upgrade"] = "png",
		["Adamant Brush"] = "png",
		["Adamant Shovel"] = "png",
		["Adamant Sieve"] = "png",
		["Adamant Trowel"] = "png",
		["Ancient Brush"] = "png",
		["Ancient Shovel"] = "png",
		["Ancient Sieve"] = "png",
		["Ancient Trowel"] = "png",
		["Crystal Brush"] = "png",
		["Crystal Shovel"] = "png",
		["Crystal Sieve"] = "png",
		["Crystal Trowel"] = "png",
		["Dark Steel Brush"] = "png",
		["Dark Steel Shovel"] = "png",
		["Dark Steel Sieve"] = "png",
		["Dark Steel Trowel"] = "png",
		["Dragon Brush"] = "png",
		["Dragon Shovel"] = "png",
		["Dragon Sieve"] = "png",
		["Dragon Trowel"] = "png",
		["Iron Brush"] = "png",
		["Iron Shovel"] = "png",
		["Iron Sieve"] = "png",
		["Iron Trowel"] = "png",
		["Relic Brush"] = "png",
		["Relic Shovel"] = "png",
		["Relic Sieve"] = "png",
		["Relic Trowel"] = "png",
		["Rune Brush"] = "png",
		["Rune Shovel"] = "png",
		["Rune Sieve"] = "png",
		["Rune Trowel"] = "png",
		["Steel Brush"] = "png",
		["Steel Shovel"] = "png",
		["Steel Sieve"] = "png",
		["Steel Trowel"] = "png",
		["Aranite Brush"] = "png",
		["Aranite Shovel"] = "png",
		["Aranite Sieve"] = "png",
		["Aranite Trowel"] = "png",
		["Travel Token"] = "png",
		["Dig Site Token"] = "png",
		["Summoner's Pack I"] = "png",
		["Summoners' Pack II"] = "png",
		["Summoners' Pack III"] = "png",
		-- Marks (Summoning), included to override the type level override above
		["Eagle"] = "png",
		["Owl"] = "png",
		["Beaver"] = "png",
		["Fox"] = "png",
		["Lightning Spirit"] = "png",
		["Siren"] = "png",
		["Spider"] = "png",
		["Spectre"] = "png",
		-- Dungeons, included to override the type level override above
		["Golem Territory"] = "png",
		["Cult Grounds"] = "png",
		["Trickery Temple"] = "png",
		["Underwater City"] = "png",
		["Underwater Ruins"] = "png",
		["Eye-conic Cave"] = "png",
		["Mucky Cave"] = "png",
		["Lost Temple"] = "png",
		["Ritual Site"] = "png",
		["Shipwreck Cove"] = "png",
	}
}

--Some overrides only apply for a specific type
local typeExtOverrides = {
	-- Example: ["item"] = { ["Chicken"] = "png" }
	["item"] = {
		-- These familiars also exist as type mark, where the image is of PNG format
		["Golbin Thief"] = "svg",
		["Occultist"] = "svg",
		["Wolf"] = "svg",
		["Ent"] = "svg",
		["Mole"] = "svg",
		["Octopus"] = "svg",
		["Minotaur"] = "svg",
		["Centaur"] = "svg",
		["Witch"] = "svg",
		["Pig"] = "svg",
		["Crow"] = "svg",
		["Leprechaun"] = "svg",
		["Cyclops"] = "svg",
		["Yak"] = "svg",
		["Unicorn"] = "svg",
		["Dragon"] = "svg",
		["Monkey"] = "svg",
		["Salamander"] = "svg",
		["Bear"] = "svg",
		["Devil"] = "svg"
	},
	["monster"] = {
		["Merman"] = "svg",
		["Shipwreck Beast"] = "svg",
		["Treacherous Jellyfish"] = "svg",
		["Merman Guard"] = "svg",
		["Ghost Mercenary"] = "svg",
		["Mermaid Archer"] = "svg",
		["Cult Member"] = "svg",
		["Cursed Pirate Captain"] = "svg",
		["Fake Door"] = "svg",
		["Possessed Barrel"] = "svg",
		["Lich"] = "svg",
		["Earth Golem (AoD)"] = "svg",
		["Magic Golem"] = "svg",
		["Magic Mirror"] = "svg",
		["Poison Bloater"] = "svg",
		["Cult Imp"] = "svg",
		["Cult Monster"] = "svg",
		["Ghost Sailor"] = "svg",
		["Granite Golem"] = "svg",
		["Nagaia"] = "svg",
		["Poison Leecher"] = "svg",
		["Poison Roamer"] = "svg",
		["Poison Slime"] = "svg",
		["Ranged Golem"] = "svg",
		["Soul Taker Witch"] = "svg",
		["Lava Golem"] = "svg",
		["Puppet Master"] = "svg"
	},
	["rock"] = {
		["Rune Essence"] = "png",
		["Pure Essence"] = "png",
		["Onyx"] = "png",
		["Oricha"] = "png",
		["Cerulean"] = "png",
		["Crystal"] = "png",
		["Pure Crystal"] = "png"
	},
	["township"] = {
		-- Seasons, which are PNG unlike most other Township images
		["Spring"] = "png",
		["Summer"] = "png",
		["Fall"] = "png",
		["Winter"] = "png",
		["Nightfall"] = "png",
		["Solar Eclipse"] = "png"
	}
}

--When calling for an icon of type Key, instead use type Value
local typeOverrides = {
	['combat'] = 'combatArea',
	['slayer'] = 'combatArea'
}
--When calling for an icon for Key, replace with image Value, and optionally override type also
local imgOverrides = {
	['Alt Magic'] = 'Magic',
	['Alt. Magic'] = 'Magic',
	['Alternative Magic'] = 'Magic',
	['Melee'] = {'Attack', 'skill'},
	['Spider (lv. 51)'] = 'Spider',
	['Spider (lv. 52)'] = 'Brown Spider',
	['Bane, Instrument of Fear'] = 'Bane',
	['Mastery Token Astrology'] = 'Mastery Token (Astrology)',
	['Event Token - Holiday 2021'] = 'Christmas Present (Yellow)',
	["I Can't See Helmet"] = {'Golbin', 'monster'},
	["Golbin Raid"] = {'Golden Golbin', 'pet'},
	["Throne of the Herald Expansion"] = 'TotH',
	["Atlas of Discovery Expansion"] = 'AoD',
	["Dig Site Map"] = {'Extra Archaeology Map Slot', 'upgrade'},
	-- Spellbooks
	["Ancient Magicks"] = {'Ancient', 'spellType'},
	["Archaic Magicks"] = {'Archaic', 'spellType'},
	["Standard Magic"] = {'Standard', 'spellType'},
	["Curses"] = {'Curse', 'spellType'},
	["Auroras"] = {'Aurora', 'spellType'},
	-- Shop purchases
	['Extra Bank Slot'] = {'Bank Slot', 'upgrade'},
	['Basic Resupply'] = {'Lobster', 'item'},
	['Standard Resupply'] = {'Crab', 'item'},
	['Generous Resupply'] = {'Shark', 'item'},
	['Plentiful Resupply'] = {'Magma Fish', 'item'},
	['Bountiful Resupply'] = {'Static Jellyfish', 'item'},
	['Cooking Upgrade 1'] = {'Cooking', 'skill'},
	['Cooking Upgrade 2'] = {'Cooking', 'skill'},
	['Loot Container Stacking'] = {'Amulet of Looting', 'item'},
	['Access to Throne of the Herald'] = {'Golden Key', 'item'},
	["Max Skillcape"] = 'Maximum Skillcape',
	["+1 Archaeology Dig Site Map Slot"] = 'Extra Archaeology Map Slot',
	["Magic Anvil"] = {'Magic Anvil', 'item'},
	["Agility Prosperity"] = {'Agility', 'skill'},
	["Agility Item Cost Reduction Enhancement"] = {'Agility', 'skill'},
	["Cartographer's Enhancement"] = {'Cartography', 'skill'},
	["Cartographer's Knowledge"] = {'Cartography', 'skill'},
	["Combat Supply I"] = {'Adamant Javelin', 'item'},
	["Combat Supply II"] = {'Rune Javelin', 'item'},
	["Combat Supply III"] = {'Dragon Javelin', 'item'},
	-- Golbin Raid shop items
	["Reduce Wave Skip Cost"] = {'Melvor Logo', ''},
	["Food Bonus"] = {'Melvor Logo', ''},
	["Ammo Gatherer"] = {'Melvor Logo', ''},
	["Rune Pouch"] = {'Melvor Logo', ''},
	["Increase Starting Prayer Points"] = {'Melvor Logo', ''},
	["Unlock Combat Passive Slot"] = {'Melvor Logo', ''},
	["Prayer"] = {'Prayer', 'skill'},
	["Increase Prayer Level"] = {'Prayer', 'skill'},
	["Increase Prayer Points gained per Wave Completion"] = {'Prayer', 'skill'},
	["Faster Golbin Spawns"] = {'Timer', ''},
	-- Alt.Magic spells using item icons
	['Item Alchemy'] = {'Item Alchemy III', 'spell'},
	['Superheat'] = {'Superheat IV', 'spell'},
	["Holy Invocation I"] = {'Small Urn', 'item'},
	["Holy Invocation II"] = {'Medium Urn', 'item'},
	["Nullification"] = {'Rune Essence', 'item'},
	["Transmutation"] = {'Oricha', 'item'},
	["Purification"] = {'Pure Essence', 'item'},
	["Fragmentation"] = {'Summoning Shard (Black)', 'item'},
	["Holy Invocation III"] = {'Large Urn', 'item'},
	["Embellish"] = {'Lava Fish (Perfect)', 'item'},
	["Barrier Dust"] = {'Barrier Dust', 'item'},
	["Cursed Offering"] = {'Cursed Logs', 'item'},
	["Unholy Offering"] = {'Unholy Prayers', ''},
	-- Overrides that allow generic potion pages to be linked to easily
	['Melee Accuracy Potion'] = {'Melee Accuracy Potion I', 'item'},
	['Melee Evasion Potion'] = {'Melee Evasion Potion I', 'item'},
	['Ranged Assistance Potion'] = {'Ranged Assistance Potion I', 'item'},
	['Hinder Potion'] = {'Hinder Potion I', 'item'},
	['Magic Assistance Potion'] = {'Magic Assistance Potion I', 'item'},
	['Regeneration Potion'] = {'Regeneration Potion I', 'item'},
	['Famished Potion'] = {'Famished Potion I', 'item'},
	['Ranged Strength Potion'] = {'Ranged Strength Potion I', 'item'},
	['Lucky Herb Potion'] = {'Lucky Herb Potion I', 'item'},
	['Divine Potion'] = {'Divine Potion I', 'item'},
	['Melee Strength Potion'] = {'Melee Strength Potion I', 'item'},
	['Magic Damage Potion'] = {'Magic Damage Potion I', 'item'},
	['Lethal Toxins Potion'] = {'Lethal Toxins Potion I', 'item'},
	['Diamond Luck Potion'] = {'Diamond Luck Potion I', 'item'},
	['Damage Reduction Potion'] = {'Damage Reduction Potion I', 'item'},
	['Area Control Potion'] = {'Area Control Potion I', 'item'},
	['Adaptive Defence Potion'] = {'Adaptive Defence Potion I', 'item'},
	['Slayer Bounty Potion'] = {'Slayer Bounty Potion I', 'item'},
	['Holy Bulwark Potion'] = {'Holy Bulwark Potion I', 'item'},
	['Adaptive Accuracy Potion'] = {'Adaptive Accuracy Potion I', 'item'},
	['Reaper Potion'] = {'Reaper Potion I', 'item'},
	['Penetration Potion'] = {'Penetration Potion I', 'item'},
	['Critical Strike Potion'] = {'Critical Strike Potion I', 'item'},
	['Bird Nest Potion'] = {'Bird Nest Potion I', 'item'},
	['Controlled Heat Potion'] = {'Controlled Heat Potion I', 'item'},
	['Generous Cook Potion'] = {'Generous Cook Potion I', 'item'},
	['Seeing Gold Potion'] = {'Seeing Gold Potion I', 'item'},
	['Fishermans Potion'] = {'Fishermans Potion I', 'item'},
	['Skilled Fletching Potion'] = {'Skilled Fletching Potion I', 'item'},
	['Gentle Hands Potion'] = {'Gentle Hands Potion I', 'item'},
	['Secret Stardust Potion'] = {'Secret Stardust Potion I', 'item'},
	['Crafting Potion'] = {'Crafting Potion I', 'item'},
	['Perfect Swing Potion'] = {'Perfect Swing Potion I', 'item'},
	['Necromancer Potion'] = {'Necromancer Potion I', 'item'},
	['Performance Enhancing Potion'] = {'Performance Enhancing Potion I', 'item'},
	['Elemental Potion'] = {'Elemental Potion I', 'item'},
	['Herblore Potion'] = {'Herblore Potion I', 'item'},
	['Generous Harvest Potion'] = {'Generous Harvest Potion I', 'item'},
	['Alchemic Practice Potion'] = {'Alchemic Practice Potion I', 'item'},
	['Gem Detector Potion'] = {'Gem Detector Potion I', 'item'},
	['Multicooker Potion'] = {'Multicooker Potion I', 'item'},
	['Star Seeker Potion'] = {'Star Seeker Potion I', 'item'},
	['Traps Potion'] = {'Traps Potion I', 'item'},
	['Blacksmith Potion'] = {'Blacksmith Potion I', 'item'},
	['Enkindled Yields Potion'] = {'Enkindled Yields Potion I', 'item'},
	['Alt Magic Potion'] = {'Alt Magic Potion I', 'item'},
	['Alt. Magic Potion'] = {'Alt Magic Potion I', 'item'},
	['Barrier Touch Potion'] = {'Barrier Touch Potion I', 'item'},
	['Crystallization Potion'] = {'Crystallization Potion I', 'item'},
	['Unholy Potion'] = {'Unholy Potion I', 'item'},
	['Cursed Potion'] = {'Cursed Potion I', 'item'},
	['Barrier Igniter Potion'] = {'Barrier Igniter Potion I', 'item'},
	['Crystal Sanction Potion'] = {'Crystal Sanction Potion I', 'item'},
	-- Township resources
	['GP'] = {'Coins', ''},
	['Food'] = {'Raw Beef', 'item'},
	['Ore'] = {'Iron', 'rock'},
	['Bar'] = {'Iron Bar', 'item'},
	['Herbs'] = {'Garum Herb', 'item'},
	['Clothing'] = {'Leather Body', 'item'},
	-- Township generic statue building
	['Statue of Worship'] = 'Statue of Nothing',
	-- Township seasons
	["Lemon Season"] = 'Spring',
	-- Easter egg stuff
	["Lemonade (Empty)"] = "Lemonade",
	["Lemonade (Very empty)"] = "Lemonade",
	["Lemonade (Still very empty)"] = "Lemonade",
	["Lemonade (Not as empty as before)"] = "Lemonade",
	["Lemonade (Not much)"] = "Lemonade",
	["Lemonade (Has a bit now)"] = "Lemonade",
	["Lemonade (A little bit more now)"] = "Lemonade",
	["Lemonade (Half full)"] = "Lemonade",
	["Lemonade (Just over half full)"] = "Lemonade",
	["Lemonade (Maybe this is half full?)"] = "Lemonade",
	["Lemonade (Nope this is half full now)"] = "Lemonade",
	["Lemonade (Wow this is slow)"] = "Lemonade",
	["Lemonade (Just fill it up already)"] = "Lemonade",
	["Lemonade (Still not full)"] = "Lemonade",
	["Lemonade (Again, still not full)"] = "Lemonade",
	["Lemonade (Less than before because you drank some)"] = "Lemonade",
	["Lemonade (Back to where we were before)"] = "Lemonade",
	["Lemonade (Almost full)"] = "Lemonade",
	["Lemonade (Still almost full)"] = "Lemonade",
	["Lemonade (How full is it supposed to be?)"] = "Lemonade",
	["Lemonade (Wait this might be half full now)"] = "Lemonade",
	["Lemonade (Haha just joking, hurry up)"] = "Lemonade",
	["Lemonade (Okay this looks pretty full now)"] = "Lemonade",
	["Lemonade (Now?)"] = "Lemonade",
	["Lemonade (What about now?)"] = "Lemonade",
	["Lemonade (YAY ITS FINALLY FULL!)"] = "Lemonade",
	["Lemonade (Oh... still not full)"] = "Lemonade",
	["Lemonade (Wait for it)"] = "Lemonade",
	["Lemonade (Wait for it!)"] = "Lemonade",
	["Lemonade (Full)"] = "Lemonade",
	["Birthday Present (Artisan)"] = "Christmas Present (Yellow)",
	["Birthday Present (Utility)"] = "Christmas Present (Blue)",
	["Birthday Present (Gathering)"] = "Christmas Present (Green)",
	["Birthday Present (Combat)"] = "Christmas Present (White)",
	["Clue Scroll 1"] = "Event Clue 1",
	["Clue Scroll 2"] = "Event Clue 1",
	["Clue Scroll 3"] = "Event Clue 1",
	["Clue Scroll 4"] = "Event Clue 1",
	["Clue Scroll 5"] = "Event Clue 1",
	["Clue Scroll 6"] = "Event Clue 1"
}
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also
local typeImgOverrides = {
	['resource'] = {
		['Rune Essence'] = {'Rune Essence', 'item'},
		['Leather'] = {'Leather', 'item'}
	},
	['combatArea'] = {
		-- Combat areas which use POI images
		["Eye-conic Cave"] = {'The Eye-Conic Cave', 'poi'},
		["Mucky Cave"] = {'Mucky Cave', 'poi'},
		["Ritual Site"] = {'Ritual Site', 'poi'},
		["Lost Temple"] = {'Lost Temple', 'poi'},
		["Shipwreck Cove"] = {'Shipwreck Cove', 'poi'}
	},
	['dungeon'] = {
		-- Dungeons which use POI images
		["Trickery Temple"] = {'Lost Temple', 'poi'},
		["Golem Territory"] = {'Monuments', 'poi'}
	},
	['mark'] = {
		["Tortoise"] = {'Golbin Thief', 'mark'}
	}
}
--When calling for an icon for Key, the link goes to Value
local linkOverrides = {
	['Alt Magic'] = 'Alternative Magic',
	['Alt. Magic'] = 'Alternative Magic',
	['Spider2'] = 'Brown Spider',
	['Earth Golem (AoD)'] = 'Earth Golem (AoD)'
}
--When calling for an icon for Key + Type, the link goes to Value
local typeLinkOverrides = {
	['biome'] = {
		['Grasslands'] = 'Biomes',
		['Forest'] = 'Biomes',
		['Mountains'] = 'Biomes',
		['Water'] = 'Biomes',
		['Swamp'] = 'Biomes',
		['Valley'] = 'Biomes',
		['Arid Plains'] = 'Biomes',
		['Jungle'] = 'Biomes',
		['Desert'] = 'Biomes',
		['Snowlands'] = 'Biomes'
	},
	['resource'] = {
		-- Township resources
		['Food'] = '',
		['Wood'] = '',
		['Planks'] = '',
		['Stone'] = '',
		['Bar'] = '',
		['Ore'] = '',
		['Coal'] = '',
		['Rune Essence'] = '',
		['Herbs'] = '',
		['Potions'] = '',
		['Leather'] = '',
		['Clothing'] = ''
	},
	['spellType'] = {
		-- Spellbooks
		['Standard'] = 'Standard Magic',
		['Ancient'] = 'Ancient Magicks',
		['Archaic'] = 'Archaic Magicks',
		['Curse'] = 'Curses',
		['Aurora'] = 'Auroras'
	},
	['township'] = {
		['Workers'] = '',
		['Statistics'] = '',
		['Town'] = '',
		['Spring'] = 'Seasons',
		['Summer'] = 'Seasons',
		['Fall'] = 'Seasons',
		['Winter'] = 'Seasons',
		['Nightfall'] = 'Seasons',
		['Solar Eclipse'] = 'Seasons'
	},
	['upgrade'] = {
		-- Shop purchases
		['Extra Bank Slot'] = 'Bank Slot',
		['Reduce Wave Skip Cost'] = '',
		['Food Bonus'] = '',
		['Ammo Gatherer'] = '',
		['Rune Pouch'] = '',
		['Increase Starting Prayer Points'] = '',
		['Unlock Combat Passive Slot'] = '',
		['Prayer'] = '',
		['Increase Prayer Level'] = '',
		['Increase Prayer Points gained per Wave Completion'] = '',
		['Faster Golbin Spawns'] = '',
		['Golbin Crate'] = ''
	}
}

-- If no other text override was specified for the given link, use these
local txtOverrides = {
	['Spider2'] = 'Brown Spider',
	['Earth Golem (AoD)'] = 'Earth Golem'
}
-- Ambiguous overrides section
local ambiguousOverrides = {
	['Golbin'] = true,
	['Chick'] = true,
	['Chicken'] = true,
	['Cyclops'] = true,
	['Wizard'] = true,
	['Spider'] = true,
	['Necromancer'] = true,
	['Dark Knight'] = true,
	['Vampire'] = true,
	['Phantom'] = true,
	['Spectre'] = true,
	['Siren'] = true,
	['Lightning Spirit'] = true,
	['Ritual Site'] = true,
	['Lost Temple'] = true,
	['Shipwreck Cove'] = true
}

-- For ambiguous overrides, determines the type text to be used in the page link
local ambiguousTypeMap = {
	['mark'] = 'item',
	['combatArea'] = 'Combat Area',
	['poi'] = 'Dig Site'
}

-- 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 = {
	['agility'] = {
		['link'] = 'Agility',
		['img'] = {'Agility', 'skill'},
		['exclude'] = {}
	},
	['poi'] = {
		['link'] = 'Cartography',
		['exclude'] = {
			['Ancient Market'] = true,
			['Ritual Site'] = true,
			['Melantis'] = true,
			['Cathedral'] = true,
			['Monuments'] = true,
			['Coral Wreckage'] = true,
			['Shipwreck Cove'] = true,
			['Watchtower'] = true,
			['Sacrificial Site'] = true,
			['Old Village'] = true,
			['Bazaar'] = true,
			['Glacia City Ruins'] = true,
			['Castle Ruins'] = true,
			['Ancient Forge'] = true,
			['Quarry'] = true,
			['Secret Mines'] = true,
			['Lost Temple'] = true,
			['Stoneworkers'] = true
		}
	}
}

-- When calling for an icon for Key, add a css class
local imgClassOverrides = {
	-- Was previously used for Township stat icons prior to v1.1.2
	--['Population'] = 'township-colortoggle'
}

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', '')
	-- 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
	local ovrClass = imgClassOverrides[link]
	-- 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
	if ovrClass ~= nil then
		class = ovrClass
	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" style="display:inline-block;vertical-align:middle;"\r\n|-\r\n|' .. expIcon .. resultText .. '\r\n|}'
	elseif not noicon and not nospan then
		return '<span style="display:inline-block">' .. expIcon .. resultText .. '</span>'
	else
		return resultText
	end
end

-- Wrapper for p.Icon(), uses the same parameters but forces noicon = true
function p.Link(frame)
	local args = frame.args ~= nil and frame.args or frame
	args.noicon = true
	return p.Icon({['args'] = args})
end

function p._SkillReq(skill, level, showText)
	local altText = (showText and '') or skill
	local result = p.Icon({skill, type='skill', notext=(showText and '' or true), nospan=true, alt=altText})
	if level == nil then level = 'Unknown [[Category:Pages with script errors]]' end
	result = result.." Level "..level

	result = '<span style="display:inline-block">'..result..'</span>'
	return result
end

function p.SkillReq(frame)
	local args = frame.args ~= nil and frame.args or frame
	local skill = args[1]
	local level = tonumber(args[2])
	local showText = args.showText ~= nil and args.showText ~= '' and args.showText ~= 'false'
	return p._SkillReq(skill, level, showText)
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 '&nbsp;Mastery'

	local result = 'Level '..level..' '
	result = result..p.Icon({linkname, img=iconname, type='item', notext=true, nospan=true, alt=altTextItem})..p.Icon({'Mastery', notext=true, nospan=true, alt=altTextMastery})
	if showText then result = result..'[['..linkname..']] [[Mastery]]' end
	result = '<span style="display:inline-block">'..result..'</span>'
	return result
end

function p.MasteryReq(frame)
	local args = frame.args ~= nil and frame.args or frame
	local itemName = args[1]
	local level = tonumber(args[2])
	local showText = args.showText ~= nil and args.showText ~= '' and args.showText ~= 'false'
	return p._MasteryReq(itemName, level, showText)
end

function p._Currency(fileName, link, altText, amount, maxAmount)
	local ret = {}
	table.insert(ret, '<span style="display:inline-block">')
	-- Currency icon
	if fileName ~= nil then
		table.insert(ret, '[[File:' .. fileName .. '|25px')
		if link ~= nil then
			table.insert(ret, '|link=' .. link)
		end
		table.insert(ret, '|alt=' .. ((altText == nil and '') or altText) .. ']]')
	end
	-- Currency amounts
	if tonumber(amount) ~= nil then
		local function numColour(amount)
			if tonumber(amount) < 0 then
				return '<span style="color:red;">' .. formatnum(amount) .. '</span>'
			else
				return formatnum(amount)
			end
		end
		table.insert(ret, '&nbsp;' .. numColour(amount))
		if (tonumber(maxAmount) ~= nil and maxAmount > amount) then
			table.insert(ret, ' - ' .. numColour(maxAmount))
		end
	end
	table.insert(ret, '</span>')
	
	return table.concat(ret)
end

function p.GP(amt, maxamt)
	return p._Currency('Coins.svg', 'Coins', 'GP', amt, maxamt)
end

function p.SC(amt, maxamt)
	return p._Currency('Slayer Coins.svg', 'Currency#Slayer Coins', 'SC', amt, maxamt)
end

function p.RC(amt, maxamt)
	return p._Currency('Raid_Coins.svg', 'Currency#Raid Coins', 'RC', amt, maxamt)
end

--Adding a shortcut function for this
function p.TotH()
	return p.Icon({'Throne of the Herald Expansion', notext=true, img='TotH', alt=''})
end

function p.AoD()
	return p.Icon({'Atlas of Discovery Expansion', notext=true, img='AoD', alt=''})
end

-- Prework to have function call available for when DLC releases.
-- Remove comments and uncomment line below when the image is available.
function p.ItA()
	--return p.Icon({'Into the Abyss Expansion', notext=true, img='ItA', alt=''})
	return nil
end

function p.getExpansionIcon(id)
	local ns, _ = Shared.getLocalID(id)
	if ns == 'melvorTotH' then
		return p.TotH()..' '
	elseif ns == 'melvorAoD' then
		return p.AoD()..' '
	else
		return ''
	end
end

return p