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
Ambassador's SashAmbassador's Sash
Diplomatic GiftsDiplomatic Gifts
Ancient IdolAncient Idol
Armor of WonderArmor of Wonder
Celestial Sash of BlissCelestial Sash of Bliss
Helm of Heavenly EnlightenmentHelm of Heavenly Enlightenment
Lion's Shield of CourageLion's Shield of Courage
Sandals of the SaintSandals of the Saint
Sword of JudgementSword of Judgement
Banner of Six WindsBanner of Six Winds
Chitinous ShieldChitinous Shield
Demon ClawDemon Claw
Beelzebub's BoonBeelzebub's Boon
HeartbeatHeartbeat
Boreoloth's TailBoreoloth's Tail
Boreoloth's HandBoreoloth's Hand
Boreoloth's HeadBoreoloth's Head
Boreoloth's HeartBoreoloth's Heart
CaduceusCaduceus
File:Campaign M3 captured priestesses item.pngChained PriestessesChained Priestesses
File:Campaign M3 freed priestesses item.pngInjured PriestessesInjured Priestesses
File:Campaign M9 phoenix egg item.pngPhoenix EggPhoenix Egg
File:Campaign ichor item.pngBlob of RedBlob of Red
Deck of SpellsDeck of Spells
Daylight TomeDaylight Tome
Nightshade TomeNightshade Tome
Primal TomePrimal Tome
Arcane TomeArcane Tome
Chain LinkChain Link
Chain MailChain Mail
Robe of EnlightenmentRobe of Enlightenment
Crown of the Supreme MagiCrown of the Supreme Magi
Demonic HeartDemonic Heart
Brass KnucklesBrass Knuckles
BucklerBuckler
RapierRapier
Eagle ArmorEagle Armor
Flask of OblivionFlask of Oblivion
Lifeblood FaeLifeblood Fae
Ring of LifeRing of Life
File:Enchanted magic scroll artifact day 10 magic second song.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 11 magic masterful parry.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 12 magic radiant armor.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 13 magic holy arms.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 14 magic vengeance.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 15 magic judgement.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 16 magic arinas chosen.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 17 magic clear view.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 18 magic farsight.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 1 magic healing water.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 2 magic sharp edge.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 3 magic haste.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 4 magic favorable wind.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 5 magic shorten shadow.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 6 magic cleansing ray.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 7 magic inner light.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 8 magic taunt.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact day 9 magic arinas hymn.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 10 magic silence.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 11 magic vulnerability.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 12 magic summon starchild.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 13 magic berserker.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 14 magic nairas kiss.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 15 magic deaths call.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 16 magic shadow army.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 17 magic read minds.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 18 magic nairas veil.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 1 magic unnatural calm.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 2 magic web.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 3 magic enlarge shadow.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 4 magic despair.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 5 magic shade cloak.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 6 magic deaths grip.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 7 magic fatal decay.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 8 magic sleep.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact night 9 magic twilight.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 10 magic primordial purity.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 11 magic armageddon.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 12 magic chain lightning.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 13 magic avalanche.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 14 magic hksmillas rampage.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 15 magic summon primal remnant.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 16 magic stone fangs.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 17 magic groundsight.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 18 magic primordial chaos.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 1 magic thunderbolt.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 2 magic thick hide.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 3 magic wean.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 4 magic fire globe.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 5 magic crystal crown.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 6 magic ice bolt.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 7 magic wall of flame.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 8 magic cave in.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact primal 9 magic earths rage.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 10 magic mirror copy.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 11 magic decimate.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 12 magic rewind.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 13 magic black hole.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 14 magic doreaths tide.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 15 magic trap snare.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 16 magic reality distortion.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 17 magic reinforcements.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 18 magic assemble.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 1 magic early start.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 2 magic energy explosion.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 3 magic energyze.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 4 magic optical illusion.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 5 magic trap jaws.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 6 magic blink.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 7 magic shackles.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 8 magic carapace.pngEnchanted Magic ScrollEnchanted Magic Scroll
File:Enchanted magic scroll artifact space 9 magic impending fate.pngEnchanted Magic ScrollEnchanted Magic Scroll
Endless BagEndless Bag
Crescent DaggerCrescent Dagger
Magic SlippersMagic Slippers
Seven EyesSeven Eyes
Vortex RobeVortex Robe
ExcaliburExcalibur
Fallen Angel WingsFallen Angel Wings
Fine WandFine Wand
Flag of TruceFlag of Truce
GarotteGarotte
Automated Antimagic ShieldAutomated Antimagic Shield
Crimson Resonance ControllerCrimson Resonance Controller
Emerald Resonance ControllerEmerald Resonance Controller
Protective BeltProtective Belt
Golden Goose EggGolden Goose Egg
Head TorchHead Torch
Holy Sigil of EridoreHoly Sigil of Eridore
Holy Sigil of InsaraHoly Sigil of Insara
Holy Sigil of MeareaHoly Sigil of Mearea
Holy Sigil of QuixHoly Sigil of Quix
Holy Sigil of RophHoly Sigil of Roph
Holy Sigil of The Second ManHoly Sigil of The Second Man
Holy Sigil of The Seven MagiHoly Sigil of The Seven Magi
Holy Sigil of UurdtHoly Sigil of Uurdt
Pelagic HourglassPelagic Hourglass
Fancy MaskFancy Mask
Music SheetMusic Sheet
Singing Pan-PipeSinging Pan-Pipe
Keeper's AmuletKeeper's Amulet
Keeper's RingKeeper's Ring
ArmetArmet
Drum of WarDrum of War
LanceLance
MisericordeMisericorde
Plate ArmorPlate Armor
Legion's LegLegion's Leg
Light-and-Shade CloakLight-and-Shade Cloak
Quivering QuiverQuivering Quiver
Shroomwood BowShroomwood Bow
Lord's RingLord's Ring
Magic Key RingMagic Key Ring
File:Magic scroll artifact day 10 magic second song.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 11 magic masterful parry.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 12 magic radiant armor.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 13 magic holy arms.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 14 magic vengeance.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 15 magic judgement.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 16 magic arinas chosen.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 17 magic clear view.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 18 magic farsight.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 1 magic healing water.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 2 magic sharp edge.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 3 magic haste.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 4 magic favorable wind.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 5 magic shorten shadow.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 6 magic cleansing ray.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 7 magic inner light.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 8 magic taunt.pngMagic ScrollMagic Scroll
File:Magic scroll artifact day 9 magic arinas hymn.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 10 magic silence.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 11 magic vulnerability.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 12 magic summon starchild.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 13 magic berserker.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 14 magic nairas kiss.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 15 magic deaths call.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 16 magic shadow army.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 17 magic read minds.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 18 magic nairas veil.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 1 magic unnatural calm.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 2 magic web.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 3 magic enlarge shadow.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 4 magic despair.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 5 magic shade cloak.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 6 magic deaths grip.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 7 magic fatal decay.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 8 magic sleep.pngMagic ScrollMagic Scroll
File:Magic scroll artifact night 9 magic twilight.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 10 magic primordial purity.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 11 magic armageddon.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 12 magic chain lightning.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 13 magic avalanche.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 14 magic hksmillas rampage.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 15 magic summon primal remnant.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 16 magic stone fangs.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 17 magic groundsight.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 18 magic primordial chaos.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 1 magic thunderbolt.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 2 magic thick hide.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 3 magic wean.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 4 magic fire globe.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 5 magic crystal crown.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 6 magic ice bolt.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 7 magic wall of flame.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 8 magic cave in.pngMagic ScrollMagic Scroll
File:Magic scroll artifact primal 9 magic earths rage.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 10 magic mirror copy.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 11 magic decimate.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 12 magic rewind.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 13 magic black hole.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 14 magic doreaths tide.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 15 magic trap snare.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 16 magic reality distortion.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 17 magic reinforcements.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 18 magic assemble.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 1 magic early start.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 2 magic energy explosion.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 3 magic energyze.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 4 magic optical illusion.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 5 magic trap jaws.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 6 magic blink.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 7 magic shackles.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 8 magic carapace.pngMagic ScrollMagic Scroll
File:Magic scroll artifact space 9 magic impending fate.pngMagic ScrollMagic Scroll
Golden MothGolden Moth
Golden PigGolden Pig
Skull of MilosSkull of Milos
Monster HeadMonster Head
File:Mythic magic scroll artifact neutral magic dimension door.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic magic scroll artifact neutral magic light gate.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic magic scroll artifact neutral magic pocket dimension.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic magic scroll artifact neutral magic second sight.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic magic scroll artifact neutral magic shadow form.pngMythic Magic ScrollMythic Magic Scroll
File:Mythic magic scroll artifact neutral magic town portal.pngMythic Magic ScrollMythic Magic Scroll
Ogre's Club of HavocOgre's Club of Havoc
OmencallerOmencaller
Orb of DestructionOrb of Destruction
Orb of InhibitionOrb of Inhibition
Fish-to-the-FaceFish-to-the-Face
Last CoinLast Coin
RagsRags
Rope BeltRope Belt
Straw HatStraw Hat
Wooden RingWooden Ring
Pole StarPole Star
Crown of DragontoothCrown of Dragontooth
Dragon Scale ArmorDragon Scale Armor
Dragon Scale ShieldDragon Scale Shield
Dragon Wing TabardDragon Wing Tabard
Dragonbone GreavesDragonbone Greaves
Quiet Eye of a DragonQuiet Eye of a Dragon
Red Dragon Flame TongueRed Dragon Flame Tongue
Slithering SashSlithering Sash
Orb of DawnOrb of Dawn
Orb of EternityOrb of Eternity
Orb of TwilightOrb of Twilight
Primordial OrbPrimordial Orb
Ring of NeutralityRing of Neutrality
Liquid SilenceLiquid Silence
Amelchia's LawAmelchia's Law
TruthmakerTruthmaker
TruthseekerTruthseeker
Runestone ShardsRunestone Shards
Scholar's AmuletScholar's Amulet
Scholar's TiaraScholar's Tiara
Seal of SilenceSeal of Silence
Seven-League BootsSeven-League Boots
Shackles of WarShackles of War
Bone BootsBone Boots
Ribcage ArmorRibcage Armor
Dark HatchetDark Hatchet
Second ShadeSecond Shade
Clenching RingClenching Ring
Sirin MaskSirin Mask
Iridescent CloakIridescent Cloak
Shaman StaffShaman Staff
Shoddy ShieldShoddy Shield
Sixth FingerSixth Finger
Soulless SashSoulless Sash
Soulcaller RingSoulcaller Ring
Spellbinder's HatSpellbinder's Hat
Spells in BottlesSpells in Bottles
SpyglassSpyglass
Swamp BootsSwamp Boots
Tactical GuideTactical Guide
Shield of the Rampaging OgreShield of the Rampaging Ogre
Mirror TiaraMirror Tiara
Magic MirrorMagic Mirror
Shard of SerenityShard of Serenity
Tunic of the Cyclops KingTunic of the Cyclops King
Two-faced MaskTwo-faced Mask
Tabar Signet-RingTabar Signet-Ring
Ukh SignetUkh Signet
Voodoo DollVoodoo Doll
BackpackBackpack
Boots of TravelBoots of Travel
Warlord BootsWarlord Boots
Warrior's BeltWarrior's Belt
Warrior's AmuletWarrior's Amulet
Wizard's CloakWizard's Cloak
Wizard'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(id, nameEn, lang)
    local url = getUrl(nameEn, lang)
    return f('[[File:%s.png|64px|link=%s]]', id, 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.id, 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