Module:Sandbox/Aurelain/ArtifactsOverview

From Heroes of Might and Magic: Olden Era Official Wiki

This module renders a giant table with all artifacts. Scroll artifacts are consolidated into 3 generic scroll artifacts (normal, enchanted and mythic). Campaign artifacts are excluded.

A hyper parameter is supported. For more information, see Module:UtilHyper/doc.

Usage

Input: {{#invoke:Sandbox/Aurelain/ArtifactsOverview|display | lang=en | hyper=Attack=Hero_Basics#Attributes}}

Output:

Artifact🗯️nameX
File:Ambassador's Sash.pngAmbassador's SashAmbassador's Sash
File:Diplomatic Gifts.pngDiplomatic GiftsDiplomatic Gifts
File:Ancient Idol.pngAncient IdolAncient Idol
File:Armor of Wonder.pngArmor of WonderArmor of Wonder
File:Celestial Sash of Bliss.pngCelestial Sash of BlissCelestial Sash of Bliss
File:Helm of Heavenly Enlightenment.pngHelm of Heavenly EnlightenmentHelm of Heavenly Enlightenment
File:Lion's Shield of Courage.pngLion's Shield of CourageLion's Shield of Courage
File:Sandals of the Saint.pngSandals of the SaintSandals of the Saint
File:Sword of Judgement.pngSword of JudgementSword of Judgement
File:Banner of Six Winds.pngBanner of Six WindsBanner of Six Winds
File:Chitinous Shield.pngChitinous ShieldChitinous Shield
File:Demon Claw.pngDemon ClawDemon Claw
File:Beelzebub's Boon.pngBeelzebub's BoonBeelzebub's Boon
File:Heartbeat.pngHeartbeatHeartbeat
File:Boreoloth's Tail.pngBoreoloth's TailBoreoloth's Tail
File:Boreoloth's Hand.pngBoreoloth's HandBoreoloth's Hand
File:Boreoloth's Head.pngBoreoloth's HeadBoreoloth's Head
File:Boreoloth's Heart.pngBoreoloth's HeartBoreoloth's Heart
File:Caduceus.pngCaduceusCaduceus
File:Chained Priestesses.pngChained PriestessesChained Priestesses
File:Injured Priestesses.pngInjured PriestessesInjured Priestesses
File:Phoenix Egg.pngPhoenix EggPhoenix Egg
File:Blob of Red.pngBlob of RedBlob of Red
File:Deck of Spells.pngDeck of SpellsDeck of Spells
File:Daylight Tome.pngDaylight TomeDaylight Tome
File:Nightshade Tome.pngNightshade TomeNightshade Tome
File:Primal Tome.pngPrimal TomePrimal Tome
File:Arcane Tome.pngArcane TomeArcane Tome
File:Chain Link.pngChain LinkChain Link
File:Chain Mail.pngChain MailChain Mail
File:Robe of Enlightenment.pngRobe of EnlightenmentRobe of Enlightenment
File:Crown of the Supreme Magi.pngCrown of the Supreme MagiCrown of the Supreme Magi
File:Demonic Heart.pngDemonic HeartDemonic Heart
File:Brass Knuckles.pngBrass KnucklesBrass Knuckles
File:Buckler.pngBucklerBuckler
File:Rapier.pngRapierRapier
File:Eagle Armor.pngEagle ArmorEagle Armor
File:Flask of Oblivion.pngFlask of OblivionFlask of Oblivion
File:Lifeblood Fae.pngLifeblood FaeLifeblood Fae
File:Ring of Life.pngRing of LifeRing of Life
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted Magic Scroll.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Endless Bag.pngEndless BagEndless Bag
File:Crescent Dagger.pngCrescent DaggerCrescent Dagger
File:Magic Slippers.pngMagic SlippersMagic Slippers
File:Seven Eyes.pngSeven EyesSeven Eyes
File:Vortex Robe.pngVortex RobeVortex Robe
File:Excalibur.pngExcaliburExcalibur
File:Fallen Angel Wings.pngFallen Angel WingsFallen Angel Wings
File:Fine Wand.pngFine WandFine Wand
File:Flag of Truce.pngFlag of TruceFlag of Truce
File:Garotte.pngGarotteGarotte
File:Automated Antimagic Shield.pngAutomated Antimagic ShieldAutomated Antimagic Shield
File:Crimson Resonance Controller.pngCrimson Resonance ControllerCrimson Resonance Controller
File:Emerald Resonance Controller.pngEmerald Resonance ControllerEmerald Resonance Controller
File:Protective Belt.pngProtective BeltProtective Belt
File:Golden Goose Egg.pngGolden Goose EggGolden Goose Egg
File:Head Torch.pngHead TorchHead Torch
File:Holy Sigil of Eridore.pngHoly Sigil of EridoreHoly Sigil of Eridore
File:Holy Sigil of Insara.pngHoly Sigil of InsaraHoly Sigil of Insara
File:Holy Sigil of Mearea.pngHoly Sigil of MeareaHoly Sigil of Mearea
File:Holy Sigil of Quix.pngHoly Sigil of QuixHoly Sigil of Quix
File:Holy Sigil of Roph.pngHoly Sigil of RophHoly Sigil of Roph
File:Holy Sigil of The Second Man.pngHoly Sigil of The Second ManHoly Sigil of The Second Man
File:Holy Sigil of The Seven Magi.pngHoly Sigil of The Seven MagiHoly Sigil of The Seven Magi
File:Holy Sigil of Uurdt.pngHoly Sigil of UurdtHoly Sigil of Uurdt
File:Pelagic Hourglass.pngPelagic HourglassPelagic Hourglass
File:Fancy Mask.pngFancy MaskFancy Mask
File:Music Sheet.pngMusic SheetMusic Sheet
File:Singing Pan-Pipe.pngSinging Pan-PipeSinging Pan-Pipe
File:Keeper's Amulet.pngKeeper's AmuletKeeper's Amulet
File:Keeper's Ring.pngKeeper's RingKeeper's Ring
File:Armet.pngArmetArmet
File:Drum of War.pngDrum of WarDrum of War
File:Lance.pngLanceLance
File:Misericorde.pngMisericordeMisericorde
File:Plate Armor.pngPlate ArmorPlate Armor
File:Legion's Leg.pngLegion's LegLegion's Leg
File:Light-and-Shade Cloak.pngLight-and-Shade CloakLight-and-Shade Cloak
File:Quivering Quiver.pngQuivering QuiverQuivering Quiver
File:Shroomwood Bow.pngShroomwood BowShroomwood Bow
File:Lord's Ring.pngLord's RingLord's Ring
File:Magic Key Ring.pngMagic Key RingMagic Key Ring
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Magic Scroll.pngMagic ScrollMagic Scroll
File:Golden Moth.pngGolden MothGolden Moth
File:Golden Pig.pngGolden PigGolden Pig
File:Skull of Milos.pngSkull of MilosSkull of Milos
File:Monster Head.pngMonster HeadMonster Head
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic Magic Scroll.pngMythic Magic ScrollMythic Magic Scroll
File:Ogre's Club of Havoc.pngOgre's Club of HavocOgre's Club of Havoc
File:Omencaller.pngOmencallerOmencaller
File:Orb of Destruction.pngOrb of DestructionOrb of Destruction
File:Orb of Inhibition.pngOrb of InhibitionOrb of Inhibition
File:Fish-to-the-Face.pngFish-to-the-FaceFish-to-the-Face
File:Last Coin.pngLast CoinLast Coin
File:Rags.pngRagsRags
File:Rope Belt.pngRope BeltRope Belt
File:Straw Hat.pngStraw HatStraw Hat
File:Wooden Ring.pngWooden RingWooden Ring
File:Pole Star.pngPole StarPole Star
File:Crown of Dragontooth.pngCrown of DragontoothCrown of Dragontooth
File:Dragon Scale Armor.pngDragon Scale ArmorDragon Scale Armor
File:Dragon Scale Shield.pngDragon Scale ShieldDragon Scale Shield
File:Dragon Wing Tabard.pngDragon Wing TabardDragon Wing Tabard
File:Dragonbone Greaves.pngDragonbone GreavesDragonbone Greaves
File:Quiet Eye of a Dragon.pngQuiet Eye of a DragonQuiet Eye of a Dragon
File:Red Dragon Flame Tongue.pngRed Dragon Flame TongueRed Dragon Flame Tongue
File:Slithering Sash.pngSlithering SashSlithering Sash
File:Orb of Dawn.pngOrb of DawnOrb of Dawn
File:Orb of Eternity.pngOrb of EternityOrb of Eternity
File:Orb of Twilight.pngOrb of TwilightOrb of Twilight
File:Primordial Orb.pngPrimordial OrbPrimordial Orb
File:Ring of Neutrality.pngRing of NeutralityRing of Neutrality
File:Liquid Silence.pngLiquid SilenceLiquid Silence
File:Amelchia's Law.pngAmelchia's LawAmelchia's Law
File:Truthmaker.pngTruthmakerTruthmaker
File:Truthseeker.pngTruthseekerTruthseeker
File:Runestone Shards.pngRunestone ShardsRunestone Shards
File:Scholar's Amulet.pngScholar's AmuletScholar's Amulet
File:Scholar's Tiara.pngScholar's TiaraScholar's Tiara
File:Seal of Silence.pngSeal of SilenceSeal of Silence
File:Seven-League Boots.pngSeven-League BootsSeven-League Boots
File:Shackles of War.pngShackles of WarShackles of War
File:Bone Boots.pngBone BootsBone Boots
File:Ribcage Armor.pngRibcage ArmorRibcage Armor
File:Dark Hatchet.pngDark HatchetDark Hatchet
File:Second Shade.pngSecond ShadeSecond Shade
File:Clenching Ring.pngClenching RingClenching Ring
File:Sirin Mask.pngSirin MaskSirin Mask
File:Iridescent Cloak.pngIridescent CloakIridescent Cloak
File:Shaman Staff.pngShaman StaffShaman Staff
File:Shoddy Shield.pngShoddy ShieldShoddy Shield
File:Sixth Finger.pngSixth FingerSixth Finger
File:Soulless Sash.pngSoulless SashSoulless Sash
File:Soulcaller Ring.pngSoulcaller RingSoulcaller Ring
File:Spellbinder's Hat.pngSpellbinder's HatSpellbinder's Hat
File:Spells in Bottles.pngSpells in BottlesSpells in Bottles
File:Spyglass.pngSpyglassSpyglass
File:Swamp Boots.pngSwamp BootsSwamp Boots
File:Tactical Guide.pngTactical GuideTactical Guide
File:Shield of the Rampaging Ogre.pngShield of the Rampaging OgreShield of the Rampaging Ogre
File:Mirror Tiara.pngMirror TiaraMirror Tiara
File:Magic Mirror.pngMagic MirrorMagic Mirror
File:Shard of Serenity.pngShard of SerenityShard of Serenity
File:Tunic of the Cyclops King.pngTunic of the Cyclops KingTunic of the Cyclops King
File:Two-faced Mask.pngTwo-faced MaskTwo-faced Mask
File:Tabar Signet-Ring.pngTabar Signet-RingTabar Signet-Ring
File:Ukh Signet.pngUkh SignetUkh Signet
File:Voodoo Doll.pngVoodoo DollVoodoo Doll
File:Backpack.pngBackpackBackpack
File:Boots of Travel.pngBoots of TravelBoots of Travel
File:Warlord Boots.pngWarlord BootsWarlord Boots
File:Warrior's Belt.pngWarrior's BeltWarrior's Belt
File:Warrior's Amulet.pngWarrior's AmuletWarrior's Amulet
File:Wizard's Cloak.pngWizard's CloakWizard's Cloak
File:Wizard's Amulet.pngWizard's AmuletWizard's Amulet

-- Usage: {{#invoke:ArtifactsOverview|display | lang=en}}
local p = {}
local f = mw.ustring.format

-- Note: The right side is just a fallback, it will seldom be used.
local TRANSLATION_IDS = {
    wiki_none = 'None',
    wiki_artifact = 'Artifact'
}

-- Displays a variable
------------------------------------------------------------------------------------------------------------------------
local function dump(target)
    return '<pre>' .. mw.dumpObject(target) .. '</pre>'
end

-- Spawns a safe robotic url from an English name, fit for adding it before the visible name
------------------------------------------------------------------------------------------------------------------------
local function getUrl(nameEn, lang)
    if not nameEn then
        return ''
    end
    local url = nameEn
    if lang ~= 'en' then
        url = url .. '/' .. lang
    end
    return url
end

-- Retrieves the text for some specific ids from Cargo Translations.
------------------------------------------------------------------------------------------------------------------------
local function translateIds(ids, lang, extra)
    -- Key list
    local list = {}
    for key, _ in pairs(ids) do
        list[#list + 1] = key
    end
    local idListString = '"' .. table.concat(list, '", "') .. '"'

    -- Cargo
    local where = {}
    table.insert(where, 'target_id IN (' .. idListString .. ')')
    table.insert(where, 'language = "' .. lang .. '"')
    if extra then
        table.insert(where, extra)
    end
    local results = mw.ext.cargo.query('Translation', 'target_id, name', {
        where = table.concat(where, ' AND '),
        limit = 100
    })

    -- Dictionary
    local dictionary = mw.clone(ids)
    for key, value in pairs(dictionary) do
        dictionary[key] = value .. '🗯️'
    end
    for _, row in ipairs(results) do
        local name = row['name']
        if name and name ~= '' then
            dictionary[row['target_id']] = name
        end
    end
    return dictionary
end

-- Converts a dictionary into a linear array
------------------------------------------------------------------------------------------------------------------------
local function flatten(hub)
    local list = {}
    for _, entry in pairs(hub) do
        list[#list + 1] = entry
    end
    return list
end

-- Interrogates the main Cargo table
------------------------------------------------------------------------------------------------------------------------
local function queryMain(lang)
    -- fields:
    local fields = {}
    table.insert(fields, 'A.id = id');
    table.insert(fields, 'T.name = name');
    table.insert(fields, 'T.language = language');

    -- where:
    local where = {}
    --table.insert(where, '(A.id NOT LIKE "%_magic_%" OR A.id LIKE "%_magic_haste")')
    table.insert(where, 'T.type = "artifact"')
    table.insert(where, '(T.language = "en" OR T.language = "' .. lang .. '")')

    -- query:
    return mw.ext.cargo.query('Artifact=A, Translation=T', table.concat(fields, ','), {
        join = 'A.id = T.target_id',
        where = table.concat(where, ' AND '),
        limit = 500
    })
end

-- Folds all Cargo results into a single dictionary:
------------------------------------------------------------------------------------------------------------------------
local function consolidate(lang, results)
    local hub = {}
    for _, row in ipairs(results) do
        local id = row.id
        local entry = hub[id]
        if not entry then
            entry = {}
            entry.id = id or ''
            hub[id] = entry
        end
        if row.language == lang then
            entry.name = row.name or ''
        end
        if row.language == 'en' then
            entry.nameEn = row.name or ''
        end
    end
    return hub
end

------------------------------------------------------------------------------------------------------------------------
local function sortList(a, b)
    return a.id < b.id
end

-- Boilerplate for the header cells
------------------------------------------------------------------------------------------------------------------------
local function addTh(tr, text)
    return tr:tag('th'):wikitext(text)
end

-- Boilerplate for the body cells
------------------------------------------------------------------------------------------------------------------------
local function addTd(tr, content)
    if type(content) == "string" then
        return tr:tag('td'):wikitext(content)
    else
        return tr:tag('td'):node(content)
    end
end

-- Boilerplate for the separator rows
------------------------------------------------------------------------------------------------------------------------
local function addSeparator(htmlTable, className, content)
    htmlTable:tag('tr')
        :addClass('separator')
        :addClass(className)
        :tag('td'):attr('data-sort-value', ''):attr('colspan', 100):wikitext(content):done()
end

------------------------------------------------------------------------------------------------------------------------
local function createHeader(htmlTable, words)
    local tr = htmlTable:tag('tr')
    addTh(tr, words.wiki_artifact):attr('colspan', 2)
    addTh(tr, 'nameX'):attr('colspan', 2)
end

------------------------------------------------------------------------------------------------------------------------
local function renderIcon(nameEn, lang)
    local url = getUrl(nameEn, lang)
    return f('[[File:%s.png|70px|link=%s]]', nameEn, url)
end

------------------------------------------------------------------------------------------------------------------------
local function renderName(name, nameEn, lang)
    local url = getUrl(nameEn, lang)
    return f('[[%s|%s]]', url, name)
end

------------------------------------------------------------------------------------------------------------------------
local function createBody(htmlTable, list, lang)
    local currentType = list[1].param1
    local currentFaction = list[1].faction
    for _, item in ipairs(list) do
        -- separators
        if item.faction ~= currentFaction then
            currentFaction = item.faction
            currentType = item.class_type
            addSeparator(htmlTable, 'separator-large', '')
        elseif item.class_type ~= currentType then
            currentType = item.class_type
            addSeparator(htmlTable, 'separator-tiny', '')
        end

        local tr = htmlTable:tag('tr'):addClass('artifact')
        addTd(tr, renderIcon(item.nameEn, lang))
        addTd(tr, renderName(item.name, item.nameEn, lang))
        addTd(tr, item.name)
    end
end

-- M A I N
------------------------------------------------------------------------------------------------------------------------
function p.display(frame)
    --do return dump(frame) end

    -- Args
    local args = frame.args
    local lang = args.lang ~= '' and args.lang or 'en'
    --lang = 'ja'

    -- Language
    local words = translateIds(TRANSLATION_IDS, lang)

    -- Cargo
    local results = queryMain(lang)
    local hub = consolidate(lang, results)
    local list = flatten(hub);
    if #list == 0 then return words.wiki_none end

    -- Various manipulations
    table.sort(list, sortList)

    -- Table
    local htmlTable = mw.html.create('table')
    htmlTable:addClass('wikitable sortable')
    createHeader(htmlTable, words)
    createBody(htmlTable, list, lang)

    -- Output
    local styleTag = frame:extensionTag('templatestyles', '', { src = frame:getTitle() .. '/styles.css' })
    return '<div class="artifacts-overview">' .. styleTag .. tostring(htmlTable) .. '</div>'
end

return p