Module:Icons: Difference between revisions

From Melvor Idle
(added Cyclops and Wizard to the list of ambiguous overrides)
(Use class in place of inline styles)
(128 intermediate revisions by 12 users not shown)
Line 1: Line 1:
--You can't generate Templates from within Lua due to the loading order, so instead copying the Icon functionality into a module so it can be pulled elsewhere.
local Shared = require("Module:Shared")
--Should function very similarly to how Template:Icon works
 
-- Locally index some functions for performance
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Shared.formatnum, tostring, type


local p = {}
local p = {}
--Extension overrides for items that have non-svg images
--Extension overrides for items that have non-png images
--Name level overrides take precedence over type level overrides
local extOverrides = {
local extOverrides = {
  ["Crown of Rhaelyx"] = "png",
["type"] = {
  ["Jewel of Rhaelyx"] = "png",
["skill"] = "svg",
  ["Circlet of Rhaelyx"] = "png",
["spellType"] = "svg",
  ["Charge Stone of Rhaelyx"] = "png",
["spell"] = "svg",
  ["Mysterious Stone"] = "png",
["curse"] = "svg", -- Some exceptions included by name below
  ["Cloudburst Staff"] = "png",
["aurora"] = "svg",
  ["Earth Layered Shield"] = "png",
["combatArea"] = "svg",
  ["Lemon"] = "jpg",
["dungeon"] = "svg", -- Some exceptions included by name below
  ["Lemons"] = "jpg",
["prayer"] = "svg",
  ["Lemonade"] = "jpg",
["upgrade"] = "svg", -- Some exceptions included by name below
  ["Miolite Sprig"] = "png",
["tree"] = "svg",
  ["Miolite Trio"] = "png",
["rock"] = "svg", -- Some exceptions included by name below
  ["Miolite Warden"] = "png",
["thieving"] = "svg",
  ["Miolite Monarch"] = "png",
["constellation"] = "svg",
  ["Wicked Greater Dragon"] = "png",
["building"] = "svg",
  ["Hunting Greater Dragon"] = "png",
["resource"] = "svg",
  ["Chaotic Greater Dragon"] = "png",
["township"] = "svg"
  ["Beavis"] = "png",
},
  ["Pudding Duckie"] = "png",
["name"] = {
  ["Pyro"] = "png",
-- General
  ["Snek"] = "png",
["Combat"] = "svg",
  ["Larry, the Lonely Lizard"] = "png",
["Guides"] = "svg",
  ["Caaarrrlll"] = "png",
["Mastery"] = "svg",
  ["Gronk"] = "png",
["Coins"] = "svg",
  ["Finn, the Cat"] = "png",
["Slayer Coins"] = "svg",
  ["Marahute"] = "png",
["Raid Coins"] = "svg",
  ["Monk-ey"] = "png",
["TotH"] = "svg",
  ["Asura"] = "png",
["Shop"] = "svg",
  ["Summoning Shard (Silver)"] = "png",
["Easter"] = "svg",
  ["Summoning Shard (Red)"] = "png",
["Melvor Logo"] = "svg",
  ["Summoning Shard (Green)"] = "png",
["Question"] = "svg",
  ["Summoning Shard (Gold)"] = "png",
["Timer"] = "svg",
  ["Summoning Shard (Blue)"] = "png",
["Hardcore"] = "svg",
  ["Summoning Shard (Black)"] = "png",
["Chaos"] = "svg",
  ['Infernal Core'] = 'png',
["Internal Suffering Speedrun"] = "svg",
  ['Cool Glasses'] = 'png',
["Hardcore Adventure Speedrun"] = "svg",
  ["Wizard's Sigil"] = 'png',
["Mastery Tokens"] = "gif",
  ["Wizard's Scroll"] = 'png',
["Lesser Relics"] = "gif",
  ["Whetstone"] = 'png',
["Prat, the Serpent of Fire"] = "svg",
  ["Whale (Perfect)"] = 'png',
["Unholy Prayers"] = "svg",
  ["Trout (Perfect)"] = 'png',
["Museum"] = "svg",
  ["Training Shield"] = 'png',
-- Items
  ["Thiever's Cape"] = 'png',
["Amulet of Fishing"] = "svg",
  ["Thief's Moneysack"] = 'png',
["Lemon"] = "jpg",
  ["Swordfish (Perfect)"] = 'png',
["Lemons"] = "jpg",
  ["Strawberry Cupcake (Perfect)"] = 'png',
["Lemonade"] = "jpg",
  ["Strawberry Cupcake"] = 'png',
["Ancient Crossbow"] = "svg",
  ["Strawberry Cake (Perfect)"] = 'png',
["Air Shard"] = "svg",
  ["Strawberry Cake"] = 'png',
["Water Shard"] = "svg",
  ["Stack of Bones"] = 'png',
["Earth Shard"] = "svg",
  ["Sneak-Ers"] = 'png',
["Fire Shard"] = "svg",
  ["Shrimp (Perfect)"] = 'png',
["Confetti Crossbow"] = "svg",
  ["Shipwheel"] = 'png',
["Cloudburst Staff"] = "gif",
  ["Shark (Perfect)"] = 'png',
["Shockwave"] = "svg",
  ["Seed Pouch"] = 'png',
["Event Clue 1"] = "svg",
  ["Seahorse (Perfect)"] = 'png',
["Event Clue 2"] = "svg",
  ["Sardine (Perfect)"] = 'png',
["Event Clue 3"] = "svg",
  ["Salmon (Perfect)"] = 'png',
["Event Clue 4"] = "svg",
  ["Sailor's Top"] = 'png',
-- Pets
  ["Runecrafting Pouch"] = 'png',
["Cris"] = "svg",
  ["Ring of Wealth"] = 'png',
["Cool Rock"] = "svg",
  ["Raw Chicken"] = 'png',
["Puff, the Baby Dragon"] = "svg",
  ["Raw Beef"] = 'png',
["Bruce"] = "svg",
  ["Prayer Scroll"] = 'png',
["Lil Ron"] = "svg",
  ["Plain Pizza Slice (Perfect)"] = 'png',
["Leonardo"] = "svg",
  ["Plain Pizza Slice"] = 'png',
["Golden Golbin"] = "svg",
  ["Pile of Ores"] = 'png',
["Ty"] = "svg",
  ["Pile of Logs"] = 'png',
["Ripper the Reindeer"] = "svg",
  ["Miner's Helmet"] = 'png',
["Chick"] = "svg",
  ["Merchant's Permit"] = 'png',
["Zarrah"] = "svg",
  ["Meat Pizza Slice (Perfect)"] = 'png',
["Chio"] = "svg",
  ["Meat Pizza Slice"] = 'png',
["Bouncing Bob"] = "svg",
  ["Marksman's Sigil"] = 'png',
["Rosey"] = "svg",
  ["Manta Ray (Perfect)"] = 'png',
["Ayyden"] = "svg",
  ["Lumberjack's Top"] = 'png',
["Arctic Yeti"] = "svg",
  ["Lobster (Perfect)"] = 'png',
["Mac"] = "svg",
  ["Lemon Cake (Perfect)"] = 'png',
["Jerry the Giraffe"] = "svg",
  ["Lemon Cake"] = 'png',
["Preston the Platypus"] = "svg",
  ["Knight's Sigil"] = 'png',
["Quill"] = "svg",
  ["Knight's Defender"] = 'png',
["Gunter"] = "svg",
  ["Knight's Cape"] = 'png',
["Salem"] = "svg",
  ["Jeweled Necklace"] = 'png',
["Peri"] = "svg",
  ["Jester's Hat"] = 'png',
["Otto"] = "svg",
  ["Jadestone"] = 'png',
["Jelly Jim"] = "svg",
  ["Herring (Perfect)"] = 'png',
["Harley"] = "svg",
  ["Hearty Soup (Perfect)"] = 'png',
["Singe"] = "svg",
  ["Hearty Soup"] = 'png',
["Aquarias"] = "svg",
  ["Gold Crested Shield"] = 'png',
["Norman"] = "svg",
  ["Golbin Mask"] = 'png',
["Erran"] = "svg",
  ["Giant Club"] = 'png',
["Ren"] = "svg",
  ["Fishing Hook"] = 'png',
["Pablo"] = "svg",
  ["Fine Coinpurse"] = 'png',
["Sam"] = "svg",
  ["Fanfish (Perfect)"] = 'png',
["Tim the Wolf"] = "svg",
  ["Cream Corn Soup (Perfect)"] = 'png',
["Mark"] = "svg",
  ["Cream Corn Soup"] = 'png',
["Astro"] = "svg",
  ["Cream"] = 'png',
-- Curses & spells, included to override the type level override above
  ["Crate of Food"] = 'png',
["Madness"] = "png",
  ["Crate of Basic Supplies"] = 'png',
["Torment"] = "png",
  ["Crab (Perfect)"] = 'png',
["Despair"] = "png",
  ["Cooking Apron"] = 'png',
-- Alt. Magic
  ["Chicken Soup (Perfect)"] = 'png',
["Rags to Riches III"] = "png",
  ["Chicken Soup"] = 'png',
-- Upgrades, included to override the type level override above
  ["Chicken (Perfect)"] = 'png',
["Golbin Crate"] = "png",
  ["Chest of Gems"] = 'png',
["Corundum Axe"] = "png",
  ["Cherry Seeds"] = 'png',
["Augite Axe"] = "png",
  ["Cherry Cupcake (Perfect)"] = 'png',
["Meteorite Axe"] = "png",
  ["Cherry Cupcake"] = 'png',
["Divine Axe"] = "png",
  ["Cherry"] = 'png',
["Spruce Cooking Fire"] = "png",
  ["Chef's Spoon"] = 'png',
["Elderwood Cooking Fire"] = "png",
  ["Chef's Hat"] = 'png',
["Carrion Cooking Fire"] = "png",
  ["Cheese"] = 'png',
["Iridium Pot"] = "png",
  ["Cave Giant Boots"] = 'png',
["Palladium Pot"] = "png",
  ["Cave Fish (Perfect)"] = 'png',
["Divine Pot"] = "png",
  ["Carrot Cake (Perfect)"] = 'png',
["Corundum Furnace"] = "png",
  ["Carrot Cake"] = 'png',
["Augite Furnace"] = "png",
  ["Carp (Perfect)"] = 'png',
["Divine Furnace"] = "png",
  ["Bread (Perfect)"] = 'png',
["Sign of the Stars"] = "png",
  ["Bread"] = 'png',
["Summoner's Altar"] = "png",
  ["Book of Scholars"] = 'png',
["Golden Shard"] = "png",
  ["Bob's Gloves"] = 'png',
["Labyrinth Solution"] = "png",
  ["Beef Pie (Perfect)"] = 'png',
["Linden Boat"] = "png",
  ["Beef Pie"] = 'png',
["Golden Compass"] = "png",
  ["Beef (Perfect)"] = 'png',
["Ship Combat Overhaul"] = "png",
  ["Beef"] = 'png',
["Blessed Bone Offering"] = "png",
  ["Basic Soup (Perfect)"] = 'png',
["Ship Crow's Nest Upgrade"] = "png",
  ["Basic Soup"] = 'png',
["Extra Bank Tab"] = "png",
  ["Basic Bag"] = 'png',
["Superior Cooking Pot"] = "png",
  ["Bag of Flour"] = 'png',
["Superior Cauldron"] = "png",
  ["Apple Tree Seeds"] = 'png',
["Mithril Brush"] = "png",
  ["Apple Pie (Perfect)"] = 'png',
["Mithril Shovel"] = "png",
  ["Apple Pie"] = 'png',
["Mithril Sieve"] = "png",
  ["Apple"] = 'png',
["Mithril Trowel"] = "png",
  ["Antique Vase"] = 'png',
["Ship Anchor Upgrade"] = "png",
  ["Anglerfish (Perfect)"] = 'png',
["Ship Keel Upgrade"] = "png",
  ["Amulet of Incantation"] = 'png',
["Ship Mast Upgrade"] = "png",
  ["Alchemist's Bag"] = 'png',
["Ship Rudder Upgrade"] = "png",
  ["Absorbing Shield"] = '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
--Some overrides only apply for a specific type
local typeExtOverrides = {
local typeExtOverrides = {
['item'] = {
-- Example: ["item"] = { ["Chicken"] = "png" }
['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
--When calling for an icon of type Key, instead use type Value
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
local imgOverrides = {
local imgOverrides = {
  ['Alt Magic'] = 'Magic',
['Alt Magic'] = 'Magic',
  ['Alt. Magic'] = 'Magic',
['Alt. Magic'] = 'Magic',
  ['Alternative Magic'] = 'Magic',
['Alternative Magic'] = 'Magic',
  ['Melee'] = 'Combat',
['Melee'] = {'Attack', 'skill'},
  ['Spider (lv. 51)'] = 'Spider',
['Spider (lv. 51)'] = 'Spider',
  ['Spider (lv. 52)'] = 'Spider2',
['Spider (lv. 52)'] = 'Brown Spider',
  ['Basic Resupply'] = 'Lobster',
['Bane, Instrument of Fear'] = 'Bane',
  ['Standard Resupply'] = 'Crab',
['Mastery Token Astrology'] = 'Mastery Token (Astrology)',
  ['Generous Resupply'] = 'Shark',
['Event Token - Holiday 2021'] = 'Christmas Present (Yellow)',
  ['Cooking Upgrade 1'] = {'Cooking', 'skill'},
["I Can't See Helmet"] = {'Golbin', 'monster'},
  ['Cooking Upgrade 2'] = {'Cooking', 'skill'}
["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
--When calling for an icon for Key, the link goes to Value
local linkOverrides = {
local linkOverrides = {
  ['Alt Magic'] = 'Alternative Magic',
['Alt Magic'] = 'Alternative Magic',
  ['Alt. Magic'] = 'Alternative Magic',
['Alt. Magic'] = 'Alternative Magic',
  ['Spider'] = 'Spider (lv. 51)',
['Spider2'] = 'Brown Spider',
  ['Spider2'] = 'Spider (lv. 52)'
['Earth Golem (AoD)'] = 'Earth Golem (AoD)'
}
}
--If no other text override was specified for the given link, use these
--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 = {
local txtOverrides = {
  ['Spider'] = 'Spider (lv. 51)',
['Spider2'] = 'Brown Spider',
  ['Spider2'] = 'Spider (lv. 52)'
['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
}
}
--Ambiguous overrides section
local ambiguousOverrides = {'Golbin', 'Chick', 'Chicken', 'Cyclops', 'Wizard'}


local Shared= require("Module:Shared")
-- 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)
function p.Icon(frame)
  local args = frame.args ~= nil and frame.args or frame
local args = frame.args ~= nil and frame.args or frame
  local link = args[1]
local link = args[1]
  local text = args[2]
local text = args[2]
  local iconType = args.type
local iconType = args.type
  local ext = args.ext ~= nil and args.ext or 'svg'
local ext = args.ext ~= nil and args.ext ~= '' and args.ext or 'png'
  local notext = args.notext ~= nil and args.notext ~= ''
local notext = args.notext ~= nil and args.notext ~= ''
  local nolink = args.nolink ~= nil and args.nolink ~= ''
local nolink = args.nolink ~= nil and args.nolink ~= ''
  local menu = args.menu ~= nil and args.menu ~= ''
local noicon = args.noicon ~= nil and args.noicon ~= ''
  local imgSize = args.size ~= nil and args.size or 25
local nospan = args.nospan ~= nil and args.nospan
  local qty = args.qty
local menu = args.menu ~= nil and args.menu ~= ''
  local img = args.img ~= nil and args.img or link
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


  link = string.gsub(link, "%%27", "'")
--MANUAL OVERRIDES
  link = string.gsub(link, "'", "'")
local origType = iconType
  link = string.gsub(link, "'", "'")
local ovrImg = imgOverrides[link]
  img = string.gsub(img, "%%27", "'")
local ovrTypeImg = typeImgOverrides[iconType]
  img = string.gsub(img, "'", "'")
if ovrTypeImg ~= nil then
  img = string.gsub(img, "'", "'")
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


  img = string.gsub(img, '#', '')
-- If the link requires disambiguation or a section, the modify the link accordingly
  link = string.gsub(link, '#', '')
-- while preserving the displayed text
  --MANUAL OVERRIDES
local isAmbig, hasSection = ambiguousOverrides[link], linkSection ~= nil and linkSection ~= ''
  if imgOverrides[link] ~= nil and img == link then
if isAmbig or hasSection then
  local ovr = imgOverrides[link]
if not hasText then
  if type(ovr) == 'string' then
text = link
  img = imgOverrides[link]
hasText = true
elseif type(ovr) == 'table' then
end
  img = ovr[1]
if isAmbig then
  if ovr[2] ~= nil then iconType = ovr[2] end
link = link .. ' (' .. (ambiguousTypeMap[origType] or origType) .. ')'
end
if hasSection then
link = link .. '#' .. linkSection
end
end
end
  end
  if text == nil and txtOverrides[link] ~= nil then
    text = txtOverrides[link]
  end
  if linkOverrides[link] ~= nil then
    if text == nil then text = link end
    link = linkOverrides[link]
  end
  if typeExtOverrides[iconType] ~= nil and typeExtOverrides[iconType][img] ~= nil then
  ext = typeExtOverrides[iconType][img]
  elseif extOverrides[img] ~= nil then
    ext = extOverrides[img]
  elseif iconType == 'mark' then
    ext = 'png'
  end
  if typeOverrides[iconType] ~= nil then
    iconType = typeOverrides[iconType]
  end
  --There are a couple specific double overrides I want to include that don't fit in the above lists
  if Shared.contains(ambiguousOverrides, link) then
    if text == nil then text = link end
    link = link..' ('..iconType..')'
  end


  --Creating the image...
local resultText = ''
  local result = '[[File:'..img
if not noicon then
  --Add in type if one is set
-- Image size
  if iconType ~= nil and iconType ~= '' then result = result..'_('..iconType..')' end
local txtSize = tostring(imgSize)
  --Add in extension and image size
-- Extension and type if one is set
  result = result..'.'..ext..'|'..tostring(imgSize)..'x'..tostring(imgSize)..'px'
local txtImg = (iconType ~= nil and iconType ~= '' and img .. '_(' .. iconType .. ')' or img) .. '.' .. ext
  --Include a link unless no link -and- no text was requested
-- Include a link unless no link -and- no text was requested
  if not (nolink and notext) then result = result..'|link='..link end
local txtLink = '|link=' .. (nolink and '' or link)
  result = result..']]'
resultText = '[[File:' .. txtImg .. '|' .. txtSize .. 'x' .. txtSize .. 'px|alt=' .. altText .. txtLink .. ']]'
 
if class ~= nil and class ~= '' then
  --Add Quantity to the front if requested
resultText = '<span class="'..class..'">'..resultText..'</span>'
  if qty ~= nil and qty ~= '' then result = Shared.formatnum(qty)..' '..result end
end
end


  if not notext then  
if not notext then
    if nolink then
if nolink then
      if text ~= nil and text ~= '' then
resultText = resultText .. (noicon and '' or ' ') .. (hasText and text or link)
        result = result..' '..text
else
      else
resultText = resultText .. (noicon and '' or ' ') .. '[[' .. link .. (hasText and text ~= link and '|' .. text or '') .. ']]'
        result = result..' '..link
end
      end
end
    else
      result = result..' [['..link
      if text ~= nil and text ~= '' and text ~= link then
        result = result..'|'..text
      end
      result = result..']]'
    end
  end


  result = '<span style="display:inline-block">'..result..'</span>'
-- 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
if menu then
    result = '{| class="articletable" style="display:inline-block;vertical-align:middle;"\r\n|-\r\n|'..result
return '{| class="articletable img-text" style="vertical-align:middle;"\r\n|-\r\n|' .. expIcon .. resultText .. '\r\n|}'
    result = result..'\r\n|}'
elseif not noicon and not nospan then
  end
return '<span class="img-text">' .. expIcon .. resultText .. '</span>'
else
return resultText
end
end


  return result
-- 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
end


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


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


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


function p._MasteryReq(itemName, level, showText)
function p._MasteryReq(itemName, level, showText)
  local iconname = itemName
local iconname = itemName
  local linkname = itemName
local linkname = itemName
  --First, go with the lowest tier of potions if a potion is mentioned
--First, go with the lowest tier of potions if a potion is mentioned
  local s, e = string.find(itemName, 'Potion')
local s, e = string.find(itemName, 'Potion')
  if e ~= nil then
if e ~= nil then
    linkname = string.sub(itemName, 1, e)
linkname = string.sub(itemName, 1, e)
    iconname = linkname..' I'
iconname = linkname..' I'
  end
end
local altTextItem = (showText and '') or linkname
local altTextMastery = (showText and '') or '&nbsp;Mastery'


  local result = 'Level '..level..' '
local result = 'Level '..level..' '
  result = result..p.Icon({linkname, img=iconname, type='item', notext = true})..p.Icon({'Mastery', notext=true})
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
if showText then result = result..'[['..linkname..']] [[Mastery]]' end
  result = '<span style="display:inline-block">'..result..'</span>'
result = '<span class="img-text">'..result..'</span>'
  return result
return result
end
end


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


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


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


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


function p.RC(amt, maxamt)
function p.RC(amt, maxamt)
  return p._Currency('Raid_Coins.svg', 'Currency#Raid Coins', 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
end


return p
return p

Revision as of 11:22, 23 April 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 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

-- 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 class="img-text">'..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 class="img-text">'..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 class="img-text">')
	local sep = ''
	-- Currency amounts
	if tonumber(amount) ~= nil then
		sep = '&nbsp;'
		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, numColour(amount))
		if (tonumber(maxAmount) ~= nil and maxAmount > amount) then
			table.insert(ret, ' - ' .. numColour(maxAmount))
		end
	end
	-- Currency icon
	if fileName ~= nil then
		table.insert(ret, sep .. '[[File:' .. fileName .. '|25px')
		if link ~= nil then
			table.insert(ret, '|link=' .. link)
		end
		table.insert(ret, '|alt=' .. ((altText == nil and '') or altText) .. ']]')
	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