Module:Item2/recipes: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
(Added automatic upgrade path for The Dreamer. Reworked upgrade path for The Breach in last edit.)
(In version 3.24.0, divination cards with the tag `boss_drop_card` cannot be obtained from opening Stacked Decks.)
 
(111 intermediate revisions by 5 users not shown)
Line 1: Line 1:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--  
--  
-- Upgrade paths for Module:Item2
-- Recipes for Module:Item2
--  
--  
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


local m_util = require('Module:Util')
local m_cargo = require('Module:Cargo')
local m_cargo = require('Module:Cargo')
local m_util = require('Module:Util')


local m_game = mw.loadData('Module:Game')
local m_game = mw.loadData('Module:Game')
Line 14: Line 14:


-- Should we use the sandbox version of our submodules?
-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox()
local use_sandbox = m_util.misc.maybe_sandbox('Item2')


-- The cfg table contains all localisable strings and configuration, to make it
-- The cfg table contains all localisable strings and configuration, to make it
Line 20: Line 20:
local cfg = use_sandbox and mw.loadData('Module:Item2/config/sandbox') or mw.loadData('Module:Item2/config')
local cfg = use_sandbox and mw.loadData('Module:Item2/config/sandbox') or mw.loadData('Module:Item2/config')


local i18n = cfg.i18n.upgrade_paths
local i18n = cfg.i18n.recipes


-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
Line 49: Line 49:
     -- Optional:
     -- Optional:
     --  negate: negates the check against the value, i.e. whether the value is not equal or not in the list/table.
     --  negate: negates the check against the value, i.e. whether the value is not equal or not in the list/table.
     if args.negate == nil then
     args = args or {}
        args.negate = false
    end
      
      
     -- Inner type of function depending on whether to check a single value, a list of values or an associative list of values
     -- Inner type of function depending on whether to check a single value, a list of values or an associative list of values
Line 77: Line 75:
      
      
     -- Outer type of function depending on whether to check a single value or against a table
     -- Outer type of function depending on whether to check a single value or against a table
     return function (tpl_args, frame)
     return function (tpl_args)
         local tpl_value = tpl_args[args.arg]
         local tpl_value = tpl_args[args.arg]
         local rtr
         local rtr
Line 99: Line 97:
end
end


function h.conditions.factory.league(args)
function h.conditions.factory.not_arg(args)
     return function (tpl_args, frame)
    args = args or {}
         for _, league in ipairs(tpl_args.drop_leagues or {}) do
    args.negate = true
             if league == args.league then
    return h.conditions.factory.arg(args)
                 return true
end
 
function h.conditions.factory.flag_is_set(args)
    return function (tpl_args)
        return tpl_args._flags[args.flag] == true
    end
end
 
function h.conditions.factory.acquisition_tag(args)
     return function (tpl_args)
        local negate = args.negate or false
         for _, tag in ipairs(tpl_args.acquisition_tags or {}) do
             if tag == args.tag then
                 return not negate
             end
             end
         end
         end
         return false
         return negate
     end
     end
end
end


function h.conditions.factory.drop_monsters(args)
function h.conditions.factory.drop_monsters(args)
     return function (tpl_args, frame)
     return function (tpl_args)
         for _, monster in ipairs(tpl_args.drop_monsters or {}) do
         for _, monster in ipairs(tpl_args.drop_monsters or {}) do
             if string.find(monster, args.monster, 1, true) then
             if string.find(monster, args.monster, 1, true) then
                return true
            end
        end
        return false
    end
end
function h.conditions.factory.drop_rarity(args)
    return function (tpl_args)
        for _, rarity in ipairs(tpl_args.drop_rarities_ids or {}) do
            if rarity == args.rarity then
                 return true
                 return true
             end
             end
Line 124: Line 146:
h.conditions.unique = h.conditions.factory.arg{arg='rarity_id', value='unique'}
h.conditions.unique = h.conditions.factory.arg{arg='rarity_id', value='unique'}


function h.conditions.item_class_has_corrupted_implicits(tpl_args, frame)
function h.conditions.item_class_has_corrupted_implicits(tpl_args)
     local groups = {
     local groups = {
         cfg.class_groups.weapons.keys,
         cfg.class_groups.weapons.keys,
Line 132: Line 154:
     }
     }
     for _, g in ipairs(groups) do
     for _, g in ipairs(groups) do
         if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args, frame) then
         if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) then
             return true
             return true
         end
         end
Line 139: Line 161:
end
end


function h.conditions.item_class_has_influences(tpl_args, frame)
function h.conditions.item_class_has_influences(tpl_args)
     local groups = {
     local groups = {
         cfg.class_groups.weapons.keys,
         cfg.class_groups.weapons.keys,
Line 147: Line 169:
     }
     }
     for _, g in ipairs(groups) do
     for _, g in ipairs(groups) do
         if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args, frame) and h.conditions.factory.arg{arg='class_id', value='FishingRod', negate=true}(tpl_args, frame) then
         if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
             return true
             return true
         end
         end
Line 154: Line 176:
end
end


-- ----------------------------------------------------------------------------
function h.conditions.item_class_has_synthesised_implicits(tpl_args)
-- Additional configuration
    local groups = {
-- ----------------------------------------------------------------------------
        cfg.class_groups.weapons.keys,
 
        cfg.class_groups.armor.keys,
local c = {}
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true, ['Jewel'] = true, ['AbyssJewel'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
            return true
        end
    end
    return false
end
 
function h.conditions.item_class_has_fractured_modifiers(tpl_args)
    local groups = {
        cfg.class_groups.weapons.keys,
        cfg.class_groups.armor.keys,
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true, ['Jewel'] = true, ['Map'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
            return true
        end
    end
    return false
end
 
-- ----------------------------------------------------------------------------
-- Additional configuration
-- ----------------------------------------------------------------------------
 
local c = {}


-- Default for all entries, but can be disabled by specific ones.
-- Default for all entries, but can be disabled by specific ones.
c.automatic_upgraded_from_defaults = {
c.automatic_recipe_defaults = {
     is_drop_restricted = h.conditions.factory.arg{arg='is_drop_restricted', value=false},
     is_drop_restricted = h.conditions.factory.arg{arg='is_drop_restricted', value=false},
     is_corrupted = h.conditions.factory.arg{arg='is_corrupted', value=false},
     is_corrupted = h.conditions.factory.arg{arg='is_corrupted', value=false},
Line 168: Line 220:
-- Order matters!
-- Order matters!
-- Put most specific outcome at the top and the least specific at the bottom.
-- Put most specific outcome at the top and the least specific at the bottom.
c.automatic_upgraded_from = {
c.automatic_recipes = {
--[[
--[[
     {
     {
         defaults = {
         defaults = {
             arg_key = function (tpl_args, frame) end,
             arg_key = function (tpl_args) end,
         },
         },
         condition = {
         condition = {
             function (tpl_args, frame) end,
             function (tpl_args) end,
         },
         },
         text = '',
         text = '',
Line 187: Line 239:
         },
         },
     },
     },
    ]]
]]
     --
     --
     -- Item base specific
     -- Automatic recipes for specific maps - reduces maintenance when a new map series is introduced
     --
     --
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Amulets/Amulet9'},
             h.conditions.factory.arg{arg='name', values={i18n['Forge of the Phoenix Map'], i18n['Lair of the Hydra Map'], i18n['Maze of the Minotaur Map'], i18n['Pit of the Chimera Map']}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.agate_amulet))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.shaper_guardian_map))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Lysah's Respite
                 -- Guardian's Challenge
                 item_id = "Metadata/Items/DivinationCards/DivinationCardLysahsRespite",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardGuardiansChallenge',
                 amount = 6,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring15'},
             h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.unset_ring))
             return string.format(i18n.fmt.corrupted_x, string.format(i18n.fmt.item_level_x, 83, m_util.html.poe_color('rare', i18n['Vaal Temple Map'])))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Penitent
                 -- Lingering Remnants
                 item_id = "Metadata/Items/DivinationCards/DivinationCardThePenitent",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLingeringRemnants',
                 amount = 5,
                 amount = 16,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring4'},
             h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gold_ring))
             return string.format(i18n.fmt.corrupted_x, string.format(i18n.fmt.map_with_x_percent_delirium, string.format(i18n.fmt.tier_x, 16, m_util.html.poe_color('rare', i18n['Vaal Temple Map'])), 100))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Glimmer of Hope
                 -- The Price of Prescience
                 item_id = "Metadata/Items/DivinationCards/DivinationCardGlimmerOfHope",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfPrescience',
                 amount = 8,
                 amount = 5,
             },
             },
         },
         },
Line 245: Line 300:
         defaults = {
         defaults = {
             is_corrupted = false,
             is_corrupted = false,
            is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring8'},
             h.conditions.factory.arg{arg='base_item', value=i18n['Synthesised Map']},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.prismatic_ring))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n['Synthesised Map']))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Hope
                 -- Justified Ambition
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHope",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardJustifiedAmbition',
                 amount = 5,
                 amount = 5,
             },
             },
         },
         },
     },
     },
    --
    -- Item base specific
    --
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='metadata_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Amulets/Amulet9'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('rare', i18n.two_stone_ring))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.agate_amulet))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Lantador's Lost Love
                 -- Lysah's Respite
                 item_id = "Metadata/Items/DivinationCards/DivinationCardLantadorsLostLove",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLysahsRespite',
                 amount = 7,
                 amount = 6,
             },
             },
         },
         },
Line 280: Line 342:
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring15'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.two_stone_ring))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.unset_ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Heterochromia
                 -- The Penitent
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHeterochromia",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThePenitent',
                 amount = 2,
                 amount = 5,
             },
             },
         },
         },
Line 296: Line 358:
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Weapons/OneHandWeapons/OneHandMaces/Sceptre11'},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring4'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.crystal_sceptre))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gold_ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Light and Truth (Свет и правда)
                 -- Glimmer of Hope
                 item_id = "Metadata/Items/DivinationCards/DivinationCardLightAndTruth",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardGlimmerOfHope',
                 amount = 2,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Flasks/FlaskUtility5'},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring8'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.granite_flask))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.prismatic_ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Earth Drinker (Пьющий землю)
                 -- Hope
                 item_id = "Metadata/Items/DivinationCards/DivinationCardEarthDrinker",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHope',
                 amount = 5,
                 amount = 5,
             },
             },
Line 327: Line 392:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Armours/Helmets/HelmetStrDex10'},
             h.conditions.factory.arg{arg='metadata_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.nightmare_bascinet))
             return string.format(i18n.fmt.random, m_util.html.poe_color('rare', i18n.two_stone_ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Gladiator (Гладиатор)
                 -- Lantador's Lost Love
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheGladiator",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLantadorsLostLove',
                 amount = 5,
                 amount = 7,
             },
             },
         },
         },
Line 344: Line 409:
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt1'},
             h.conditions.factory.arg{arg='base_item_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.rustic_sash))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.two_stone_ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Standoff (Противоборство)
                 -- Heterochromia
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheStandoff",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHeterochromia',
                 amount = 3,
                 amount = 2,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Weapons/OneHandWeapons/OneHandMaces/Sceptre11'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.timeless_jewel))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.crystal_sceptre))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Peaceful Moments (Безмятежные минуты)
                 -- Light and Truth
                 item_id = "Metadata/Items/DivinationCards/DivinationCardPeacefulMoments",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLightAndTruth',
                 amount = 5,
                 amount = 2,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,  
             h.conditions.unique,
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Flasks/FlaskUtility5'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.timeless_jewel))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.granite_flask))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Eternal War (Вечная война)
                 -- Earth Drinker
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheEternalWar",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardEarthDrinker',
                 amount = 4,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Currency/CurrencyItemisedProphecy'},
            h.conditions.unique,
            function (tpl_args, frame)
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Armours/Helmets/HelmetStrDex10'},
                local patterns = {'Fated', 'AddsSpecificMod'}
                for _, p in ipairs(patterns) do
                    if string.find(tpl_args.prophecy_id, p, 1, true) then
                        return true
                    end
                end
                return false
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('prophecy', i18n.fated_unique_item_prophecy))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.nightmare_bascinet))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Akil's Prophecy
                 -- The Gladiator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardAkilsProphecy",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGladiator',
                 amount = 3,
                 amount = 5,
             },
             },
         },
         },
     },
     },
    --
    -- Item name
    --
     {
     {
         defaults = {
         condition = {
             is_drop_restricted = false,
             h.conditions.unique,
             is_corrupted = false,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt1'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.rustic_sash))
        end,
        groups = {
             {
                -- The Standoff
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheStandoff',
                amount = 3,
            },
         },
         },
    },
    {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem},
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt3'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.precursors_emblem))
             return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n['Leather Belt']))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Remembrance (Поминовение)
                 -- The Forgotten Treasure
                 item_id = "Metadata/Items/DivinationCards/DivinationCardRemembrance",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForgottenTreasure',
                 amount = 8,
                 amount = 6,
             },
             },
         },
         },
     },
     },
    --
    -- Item name like
    --
     {
     {
         defaults = {
         defaults = {
Line 454: Line 508:
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
            function (tpl_args, frame)
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
                return string.find(tpl_args.name, i18n.atziri, 1, true)
            end,
             h.conditions.factory.arg{arg='is_fated', value=false}, -- Excludes Atziri's Reflection
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.atziri)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.timeless_jewel))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Admirer
                 -- Peaceful Moments
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheAdmirer",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardPeacefulMoments',
                 amount = 9,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,  
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
                return string.find(tpl_args.name, i18n.doedre, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.doedre)))
             return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.timeless_jewel))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Doedre's Madness
                 -- The Eternal War
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDoedresMadness",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEternalWar',
                 amount = 9,
                 amount = 4,
             },
             },
         },
         },
     },
     },
    --
    -- Item name
    --
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem},
                return string.find(tpl_args.name, i18n.shavronne, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.shavronne)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.precursors_emblem))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Aesthete
                 -- Remembrance
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheAesthete",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardRemembrance',
                 amount = 8,
                 amount = 8,
             },
             },
Line 509: Line 566:
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_drop_restricted = false,
            is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='name', value=i18n.grand_spectrum},
                return string.find(tpl_args.name, i18n.rigwald, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.rigwald)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.grand_spectrum))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Wolf
                 -- Divine Justice
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWolf",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDivineJustice',
                 amount = 5,
                 amount = 1,
             },
             },
         },
         },
     },
     },
    --
    -- Item name like
    --
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             function (tpl_args, frame)
             function (tpl_args)
                 return string.find(tpl_args.name, i18n.lioneye, 1, true)
                 -- Items that have "Atziri" in their name
                if string.find(tpl_args.name, i18n.atziri, 1, true) then
                    return true
                end
                -- Items that drop from Atziri
                for _, monster in ipairs(tpl_args.drop_monsters or {}) do
                    if string.find(monster, 'Metadata/Monsters/Atziri/Atziri', 1, true) then
                        return true
                    end
                end
                return false
             end,
             end,
            h.conditions.factory.not_arg{arg='class_id', value='UniqueFragment'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.lioneye)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.atziri)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Lion
                 -- The Admirer
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheLion",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAdmirer',
                 amount = 5,
                 amount = 9,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             function (tpl_args, frame)
             function (tpl_args)
                 return string.find(tpl_args.name, i18n.farrul, 1, true)
                 return string.find(tpl_args.name, i18n.doedre, 1, true)
             end,
             end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.farrul)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.doedre)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Council of Cats (Кошачий совет)
                 -- Doedre's Madness
                 item_id = "Metadata/Items/DivinationCards/DivinationCardCouncilOfCats",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDoedresMadness',
                 amount = 4,
                 amount = 9,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             function (tpl_args, frame)
             function (tpl_args)
                 return string.find(tpl_args.name, i18n.farrul, 1, true) or string.find(tpl_args.name, i18n.fenumus, 1, true) or string.find(tpl_args.name, i18n.saqawal, 1, true) or string.find(tpl_args.name, i18n.craiceann, 1, true)
                 return string.find(tpl_args.name, i18n.shavronne, 1, true)
             end,
             end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Bestiary'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.shavronne)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Boon of the First Ones (Дар Первых)
                 -- The Aesthete
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardBoonOfTheFirstOnes',
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAesthete',
                 amount = 6,
                 amount = 8,
             },
             },
         },
         },
     },
     },
    --
    -- Monster-specific items
    --
     {
     {
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_drop_restricted = false,
            is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/BreachBossChaos'},
             function (tpl_args)
                return string.find(tpl_args.name, i18n.rigwald, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.chayula)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.rigwald)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Dreamer
                 -- The Wolf
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDreamer',
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolf',
                 amount = 6,
                 amount = 5,
             
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/'},
             function (tpl_args)
                return string.find(tpl_args.name, i18n.lioneye, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Breach'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.lioneye)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Breach
                 -- The Lion
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheBreach",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLion',
                 amount = 4,
                 amount = 5,
             
             },
             },
         },
         },
     },
     },
    --
    -- League-specific items
    --
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Nemesis'].name},
             function (tpl_args)
                return string.find(tpl_args.name, i18n.farrul, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.farrul)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Valkyrie
                 -- Council of Cats
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheValkyrie",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardCouncilOfCats',
                 amount = 8,
                 amount = 4,
             
             },
             },
         },
         },
Line 652: Line 717:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Nemesis'].name},
             function (tpl_args)
                return string.find(tpl_args.name, i18n.farrul, 1, true) or string.find(tpl_args.name, i18n.fenumus, 1, true) or string.find(tpl_args.name, i18n.saqawal, 1, true) or string.find(tpl_args.name, i18n.craiceann, 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Bestiary'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Undaunted
                 -- Boon of the First Ones
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheUndaunted",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardBoonOfTheFirstOnes',
                 amount = 5,
                 amount = 6,
             
             },
             },
         },
         },
     },
     },
    --
    -- Monster-specific items
    --
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Beyond'].name},
             h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/BreachBossChaos'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Beyond'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.chayula)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Calling
                 -- The Dreamer
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCalling",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDreamer',
                 amount = 6,
                 amount = 6,
             
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Delve'].name},
             h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Delve'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Breach'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Alone in the Darkness
                 -- The Breach
                 item_id = "Metadata/Items/DivinationCards/DivinationCardAloneInTheDarkness",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBreach',
                 amount = 5,
                 amount = 4,
             
             },
             },
         },
         },
Line 710: Line 783:
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Metamorph'].name},
             h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/MavenBoss/TheMaven'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Metamorph'].name)))
             return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.maven)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Haunting Shadows (Преследующие тени)
                 -- The Leviathan
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHauntingShadows",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLeviathan',
                 amount = 4,
                 amount = 7,
             },
             },
         },
         },
     },
     },
    --
    -- Themed/league items (acquisition tags)
    --
     {
     {
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_drop_restricted = false,
            is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.league{league = m_game.constants.leagues['Abyss'].name},
             h.conditions.factory.acquisition_tag{tag = 'fishing'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('rare', string.format(i18n.fmt.x_item, m_game.constants.leagues['Abyss'].name)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.fishing)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Abyssal Incubator (Инкубатор Бездны)
                 -- Baited Expectations
                 item_id = "Metadata/Items/Currency/CurrencyIncubationAbyss",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardBaitedExpectations',
                 amount = 1,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     --
     {
    -- Subset of item class
        defaults = {
    --
            is_drop_restricted = false,
    {
            is_replica = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='is_replica', value=true},
            function(tpl_args, frame)
                -- Get Primordial modifier from stats
                if tpl_args._stats.primordial_jewel_count then
                    return true
                end
                return false
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.replica)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Primordial (Первородный)
                 -- The Forward Gaze
                 item_id = "Metadata/Items/DivinationCards/DivinationCardThePrimordial",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForwardGaze',
                 amount = 5,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='is_talisman', value=true},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name},
            h.conditions.factory.arg{arg='talisman_tier', value=1},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.tier_1_talisman))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Call to the First Ones
                 -- The Valkyrie
                 item_id = "Metadata/Items/DivinationCards/DivinationCardCallToTheFirstOnes",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheValkyrie',
                 amount = 5,
                 amount = 8,
             },
             },
         },
         },
Line 791: Line 857:
     {
     {
         defaults = {
         defaults = {
            is_drop_restricted = false,
             is_corrupted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.factory.arg{arg='is_talisman', value=true},
            h.conditions.unique,
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, i18n.talisman)
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Primal Incubator
                 -- The Undaunted
                 item_id = "Metadata/Items/Currency/CurrencyIncubationTalismans",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheUndaunted',
                 amount = 1,
                 amount = 5,
             },
             },
         },
         },
Line 810: Line 876:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Beyond'].name},
            h.conditions.factory.arg{arg='tags', value='atziri1'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sacrifice_fragment))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Beyond'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Her Mask (Её маска)
                 -- The Calling
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHerMask",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCalling',
                 amount = 4,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Delve'].name},
            h.conditions.factory.arg{arg='tags', value='atziri2'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.mortal_fragment))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Delve'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Sambodhi's Vow (Клятва Самбодхи)
                 -- Alone in the Darkness
                 item_id = "Metadata/Items/DivinationCards/DivinationCardSambodhisVow",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardAloneInTheDarkness',
                 amount = 3,
                 amount = 5,
             },
             },
         },
         },
Line 850: Line 911:
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Metamorph'].name},
            function (tpl_args, frame)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'UberElderFragment', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.uber_elder_fragment))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Metamorph'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Eldritch Decay (Аномальное увядание)
                 -- Haunting Shadows
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheEldritchDecay",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHauntingShadows',
                 amount = 4,
                 amount = 4,
             },
             },
Line 873: Line 931:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Abyss'].name},
            function (tpl_args, frame)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'MapFragments', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.fragment))
             return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Abyss'].name))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Fragmented Incubator (Раздробленный инкубатор)
                 -- Abyssal Incubator
                 item_id = "Metadata/Items/Currency/CurrencyIncubationFragments",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationAbyssStackable',
                 amount = 1,
                 amount = 1,
             },
             },
Line 894: Line 949:
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            -- Must have Synthesis tag, but not league-specific tag
             h.conditions.factory.arg{arg='tags', value='breachstone'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Synthesis'].name},
         },
             h.conditions.factory.acquisition_tag{tag = 'league-specific', negate = true},
         text = function (tpl_args, frame)
         },
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.breachstone))
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Synthesis'].name)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Obscured
                 -- Chasing Risk
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheObscured",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardChasingRisk',
                 amount = 7,
                 amount = 4,
             },
             },
         },
         },
     },
     },
    --
    -- Subset of item class
    --
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='tags', value='breachstone4'},
             function(tpl_args)
                -- Get Primordial modifier from stats
                if tpl_args._stats.primordial_jewel_count then
                    return true
                end
                return false
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.pure_breachstone))
             return string.format(i18n.fmt.random, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Bargain (Сделка)
                 -- The Primordial
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheBargain",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThePrimordial',
                 amount = 5,
                 amount = 5,
             },
             },
Line 928: Line 993:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='is_essence', value=true},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='essence_level', value=7},
             function(tpl_args)
                -- Get Primordial modifier from stats
                if tpl_args._stats.primordial_jewel_count then
                    return true
                end
                return false
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.deafening_essence), 3)
             return string.format(i18n.fmt.random_one_or_two_implicit_corrupted, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Cacophony
                 -- A Stone Perfected
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCacophony",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardAStonePerfected',
                 amount = 8,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='is_essence', value=true},
             h.conditions.factory.flag_is_set{flag = 'is_talisman'},
             h.conditions.factory.arg{arg='essence_level', value=6},
             h.conditions.factory.arg{arg='talisman_tier', value=1},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.shrieking_essence), 9)
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.tier_1_talisman))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Harmony of Souls
                 -- Call to the First Ones
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHarmonyOfSouls",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardCallToTheFirstOnes',
                 amount = 9,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
            h.conditions.normal,
             h.conditions.factory.flag_is_set{flag = 'is_talisman'},
             h.conditions.factory.arg{arg='is_essence', value=true},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
             return string.format(i18n.fmt.random, i18n.talisman)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Three Voices
                 -- Primal Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardThreeVoices",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationTalismansStackable',
                 amount = 3,
                 amount = 1,
             },
             },
         },
         },
Line 979: Line 1,057:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='is_essence', value=true},
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            h.conditions.factory.arg{arg='tags', value='atziri1'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sacrifice_fragment))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Whispering Incubator (Шепчущий инкубатор)
                 -- Her Mask
                 item_id = "Metadata/Items/Currency/CurrencyIncubationEssence",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHerMask',
                 amount = 1,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='map_tier', value=5},
             h.conditions.factory.arg{arg='tags', value='atziri2'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 5)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.mortal_fragment))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Cartographer's Delight
                 -- Sambodhi's Vow
                 item_id = "Metadata/Items/DivinationCards/DivinationCardCartographersDelight",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisVow',
                 amount = 3,
                 amount = 3,
             },
             },
Line 1,010: Line 1,092:
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='map_tier', value=14},
             function (tpl_args)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'UberElderFragment', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 14)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.uber_elder_fragment))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Surveyor
                 -- The Eldritch Decay
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheSurveyor",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEldritchDecay',
                 amount = 4,
                 amount = 4,
             },
             },
Line 1,027: Line 1,114:
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='map_tier', value=15},
             function (tpl_args)
                if tpl_args.metadata_id then
                    local patterns = {
                        'CurrencyShaperFragment',
                        'CurrencyElderFragment',
                        'CurrencySirusFragment',
                        'CurrencyVaalFragment1_',
                        'CurrencyVaalFragment2_',
                        'CurrencyOfferingToTheGoddess$',
                    }
                    for _, p in ipairs(patterns) do
                        if string.find(tpl_args.metadata_id, p) then
                            return true
                        end
                    end
                end
                return false
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 15)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.fragment))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Lost Worlds
                 -- Fragmented Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardLostWorlds",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationFragmentsStackable',
                 amount = 8,
                 amount = 1,
             },
             },
         },
         },
Line 1,045: Line 1,152:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='map_tier', value=15},
             h.conditions.factory.arg{arg='tags', value='breachstone'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 15)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.breachstone))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Trial
                 -- The Obscured
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheTrial",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheObscured',
                 amount = 7,
                 amount = 7,
             },
             },
Line 1,065: Line 1,172:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.flag_is_set{flag = 'is_essence'},
             h.conditions.factory.arg{arg='map_tier', value=16},
             h.conditions.factory.arg{arg='essence_level', value=7},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_unidentified_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 16)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.deafening_essence), 3)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Left to Fate
                 -- The Cacophony
                 item_id = "Metadata/Items/DivinationCards/DivinationCardLeftToFate",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCacophony',
                 amount = 4,
                 amount = 8,
             },
             },
         },
         },
Line 1,085: Line 1,192:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.flag_is_set{flag = 'is_essence'},
             h.conditions.factory.arg{arg='map_tier', value=13},
             h.conditions.factory.arg{arg='essence_level', value=6},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, string.format(i18n.fmt.triskaidekaphobia, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 13))))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.shrieking_essence), 9)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Triskaidekaphobia
                 -- Harmony of Souls
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTriskaidekaphobia',
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHarmonyOfSouls',
                 amount = 13,
                 amount = 9,
             },
             },
         },
         },
Line 1,105: Line 1,212:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
             h.conditions.factory.flag_is_set{flag = 'is_essence'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.golem.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.golem.tag)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Rite of Elements
                 -- Three Voices
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheRiteOfElements",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThreeVoices',
                 amount = 5,
                 amount = 3,
             },
             },
         },
         },
Line 1,126: Line 1,231:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.flag_is_set{flag = 'is_essence'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.trap.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_level_x_y_gem_q_z, 21, m_game.constants.item.gem_tags.trap.tag, 23)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Deathly Designs (Смертельные замыслы)
                 -- Infused Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDeathlyDesigns",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationEssenceHighStackable',
                 amount = 7,
                 amount = 1,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
             h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Ultimatum'].name},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 20, m_game.constants.item.gem_tags.support.tag)))
             return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Ultimatum'].name))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Gift of the Gemling Queen
                 -- Challenging Incubator (previously Morphing Incubator)
                 item_id = "Metadata/Items/DivinationCards/DivinationCardGiftOfTheGemlingQueen",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationMetamorphStackable',
                 amount = 9,
                 amount = 1,
             },
             },
         },
         },
Line 1,164: Line 1,269:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
             h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_x_gem_q_y, m_game.constants.item.gem_tags.support.tag, 23)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.delirium_orb))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Dialla's Subjugation
                 -- Disdain
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDiallasSubjugation",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDisdain',
                 amount = 7,
                 amount = 5,
             },
             },
         },
         },
Line 1,184: Line 1,289:
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_drop_restricted = false,
            is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
             h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'},
            function (tpl_args, frame)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Plus', 1, true)
            end,
            h.conditions.factory.arg{arg='max_level', value=5},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_level_x_support_plus_gem_q_y, 6, 20)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.delirium_orb), 10)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Cheater (Ловкач)
                 -- Dementophobia
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCheater",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDementophobia',
                 amount = 3,
                 amount = 11,
             },
             },
         },
         },
Line 1,208: Line 1,308:
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_drop_restricted = false,
            is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
             h.conditions.factory.flag_is_set{flag = 'is_blight_item'},
             function (tpl_args, frame)
             function (tpl_args)
                 return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Plus', 1, true)
                 return tpl_args.blight_item_tier >= 1
             end,
             end,
            h.conditions.factory.arg{arg='max_level', value=5},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_level_x_support_plus_gem_q_y, 6, 23)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.oil), 10)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Desecrated Virtue (Осквернённая добродетель)
                 -- The Tireless Extractor
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDesecratedVirtue",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTirelessExtractor',
                 amount = 9,
                 amount = 8,
             },
             },
         },
         },
Line 1,231: Line 1,329:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.chaos.tag},
             function (tpl_args)
             h.conditions.factory.arg{arg='max_level', value=20},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Metadata/Items/Currency/CurrencyIncursionVial', 1, true)
             end,
         },
         },
         text = function(tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_level_x_y_gem_q_z, 21, m_game.constants.item.gem_tags.chaos.tag, 23)))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.vial), 10)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Bitter Blossom (Колючее соцветие)
                 -- The Rabbit's Foot
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheBitterBlossom",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRabbitsFoot',
                 amount = 3,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.vaal.tag},
             h.conditions.factory.arg{arg='map_tier', value=5},
         },
         },
         text = function(tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_x_gem_q_y, m_game.constants.item.gem_tags.vaal.tag, 20)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 5)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Volatile Power
                 -- Cartographer's Delight
                 item_id = "Metadata/Items/DivinationCards/DivinationCardVolatilePower",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardCartographersDelight',
                 amount = 9,
                 amount = 3,
             },
             },
         },
         },
Line 1,273: Line 1,369:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='max_level', value=20},
             h.conditions.factory.arg{arg='map_tier', value=6},
            function (tpl_args, frame)
                return tpl_args._flags.is_alt_quality_gem == true -- Flag is set in Module:Skill
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.alt_level_x_gem_q_y, 19, 19)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 6)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Dying Anguish (Смертельная тоска)
                 -- Rain Tempter
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDyingAnguish",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardRainTempter',
                 amount = 8,
                 amount = 9,
             },
             },
         },
         },
Line 1,293: Line 1,386:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=12},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_gem)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 12)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Gemcutter's Incubator (Инкубатор камнереза)
                 -- The Arena Champion
                 item_id = "Metadata/Items/Currency/CurrencyIncubationGemLow",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheArenaChampion',
                 amount = 1,
                 amount = 10,
             },
             },
         },
         },
Line 1,309: Line 1,403:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
            function (tpl_args, frame)
             h.conditions.factory.arg{arg='map_tier', value=14},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Scarab', 1, true)
            end,
             h.conditions.factory.arg{arg='tags', value='gilded_scarab'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.gilded_scarab))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 14)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- More is Never Enough
                 -- The Surveyor
                 item_id = "Metadata/Items/DivinationCards/DivinationCardMoreIsNeverEnough",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurveyor',
                 amount = 7,
                 amount = 4,
             },
             },
         },
         },
Line 1,329: Line 1,420:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='map_tier', value=15},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Scarab', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 15)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Cameria's Cut
                 -- Lost Worlds
                 item_id = "Metadata/Items/DivinationCards/DivinationCardCameriasCut",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLostWorlds',
                 amount = 2,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='MapFragment'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='map_tier', value=15},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Scarab', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 15)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Skittering Incubator
                 -- The Trial
                 item_id = "Metadata/Items/Currency/CurrencyIncubationScarabs",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTrial',
                 amount = 1,
                 amount = 7,
             },
             },
         },
         },
Line 1,366: Line 1,456:
     {
     {
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='tags', value='breachstone_splinter'},
             h.conditions.factory.arg{arg='map_tier', value=15},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.breachstone_splinter), 5)
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map_with_y_modifiers, 15, 8)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Puzzle (Головоломка)
                 -- The Easy Stroll
                 item_id = "Metadata/Items/DivinationCards/DivinationCardThePuzzle",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEasyStroll',
                 amount = 5,
                 amount = 2,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='tags', value='quality_currency'},
             function (tpl_args)
                return tpl_args.map_tier >= 14 and tpl_args.map_tier <= 16
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.quality_currency), 20)
             return string.format(i18n.fmt.random_corrupted, string.format(i18n.fmt.the_price_of_protection, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_to_y_map, 14, 16))))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Master Artisan (Мастер-ремесленник)
                 -- The Price of Protection
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheMasterArtisan",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfProtection',
                 amount = 5,
                 amount = 5,
             },
             },
Line 1,404: Line 1,499:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='map_tier', value=16},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'CurrencyDelve', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.fossil), 5)
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='MapMonsterPhysicalReflection3MapWorlds'}, string.format(i18n.fmt.tier_x_map, 16))))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Tinkerer's Table (Верстак умельца)
                 -- Azure Rage
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheTinkerersTable",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardAzureRage',
                 amount = 5,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='map_tier', value=16},
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'CurrencyDelve', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.fossil))
             return string.format(i18n.fmt.random_unidentified_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 16)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Fossilised Incubator (Ископаемый инкубатор)
                 -- Left to Fate
                 item_id = "Metadata/Items/Currency/CurrencyIncubationFossils",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLeftToFate',
                 amount = 1,
                 amount = 4,
             },
             },
         },
         },
     },
     },
    --
    -- Single item class
    --
     {
     {
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='UniqueFragment'},
             h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=13},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.harbinger_fragment))
             return string.format(i18n.fmt.random_corrupted, string.format(i18n.fmt.triskaidekaphobia, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 13))))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Messenger
                 -- Triskaidekaphobia
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheMessenger",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTriskaidekaphobia',
                 amount = 4,
                 amount = 13,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.aura.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.body_armour))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.aura.tag)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Body
                 -- The Wilted Rose
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheBody",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWiltedRose',
                 amount = 4,
                 amount = 7,
             },
             },
         },
         },
Line 1,482: Line 1,579:
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Shield'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.golem.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.shield))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.golem.tag)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Mercenary
                 -- The Rite of Elements
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheMercenary",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRiteOfElements',
                 amount = 5,
                 amount = 5,
             },
             },
Line 1,497: Line 1,596:
     },
     },
     {
     {
         condition = {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Helmet'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.golem.tag},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_veiled, m_util.html.poe_color('rare', i18n.helmet))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_y_gem_z_quality, 21, m_game.constants.item.gem_tags.golem.tag, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Journalist (Журналист)
                 -- Terrible Secret of Space
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheJournalist",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTerribleSecretOfSpace',
                 amount = 10,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,  
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Helmet'},  
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.trap.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_eternal_labyrinth_enchantment, m_util.html.poe_color('unique', i18n.helmet))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 21, m_game.constants.item.gem_tags.trap.tag, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Divine Justice (Божественное правосудие)
                 -- Deathly Designs
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDivineJustice",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDeathlyDesigns',
                 amount = 1,
                 amount = 7,
             },
             },
         },
         },
Line 1,533: Line 1,644:
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Claw'},
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.chaos.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.claw))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 21, m_game.constants.item.gem_tags.chaos.tag, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Wolverine
                 -- The Bitter Blossom
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWolverine",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBitterBlossom',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
Line 1,549: Line 1,662:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'Dagger', 'Rune Dagger'}},
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.minion.tag},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.dagger))
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, m_game.constants.item.gem_tags.minion.tag, 20)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Assassin's Favour
                 -- The Summoner
                 item_id = "Metadata/Items/DivinationCards/DivinationCardAssassinsFavour",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSummoner',
                 amount = 9,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Sceptre'},
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.spell.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('magic', string.format('%s %s', i18n.sceptre, h.modifier_link{id='LocalIncreasedAttackSpeed8'})))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.spell.tag)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Lord of Celebration
                 --The Cataclysm
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheLordOfCelebration",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCataclysm',
                 amount = 4,
                 amount = 13,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Bow'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.vaal.tag},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.bow))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, m_game.constants.item.gem_tags.vaal.tag, 20)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Hunter's Resolve
                 -- Volatile Power
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHuntersResolve",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardVolatilePower',
                 amount = 8,
                 amount = 9,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewel))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem, 21)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Garish Power
                 -- The Blessing of Moosh
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheGarishPower",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBlessingOfMoosh',
                 amount = 4,
                 amount = 4,
             },
             },
Line 1,613: Line 1,743:
     {
     {
         defaults = {
         defaults = {
            is_drop_restricted = false,
             is_corrupted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.jewel))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 21, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Eye of the Dragon
                 -- The Hook
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheEyeOfTheDragon",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHook',
                 amount = 10,
                 amount = 8,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='PercentIncreasedLifeJewel'}, i18n.jewel)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 21, 20)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Shard of Fate (Осколок рока)
                 -- Doryani's Epiphany
                 item_id = "Metadata/Items/DivinationCards/DivinationCardShardOfFate",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDoryanisEpiphany',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewel, h.modifier_link{id='CriticalStrikeMultiplierJewel'})))
             return m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 19, 19))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Mountain (Гора)
                 -- Dying Anguish
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheMountain",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDyingAnguish',
                 amount = 6,
                 amount = 8,
             },
             },
         },
         },
Line 1,665: Line 1,810:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Amulet'},
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='IncreasedEnergyShieldPercent7'}, i18n.amulet)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem, m_game.constants.item.gem_tags.exceptional.tag)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Sigil
                 -- Gemcutter's Mercy
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheSigil",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersMercy',
                 amount = 3,
                 amount = 3,
             },
             },
Line 1,679: Line 1,825:
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Amulet'},
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.amulet))
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_quality, m_game.constants.item.gem_tags.exceptional.tag)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Warden
                 -- Home
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWarden",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHome',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
Line 1,700: Line 1,844:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Ring'},
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='max_level', value=20},
                return tpl_args.drop_level <= 83
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('magic', string.format('%s %s', i18n.ring, h.modifier_link{id='ChaosResist6'})))
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 20, i18n.support)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Lord in Black
                 -- Gift of the Gemling Queen
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheLordInBlack",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardGiftOfTheGemlingQueen',
                 amount = 6,
                 amount = 9,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Ring'},
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.ring))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, i18n.support, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Opulent
                 -- Dialla's Subjugation
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheOpulecent",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDiallasSubjugation',
                 amount = 5,
                 amount = 7,
             },
             },
         },
         },
     },
     },
     {
     {
         condition = {
        defaults = {
             h.conditions.unique,
            is_drop_restricted = false,
             h.conditions.factory.arg{arg='class_id', value='Ring'},
            is_corrupted = false,
        },
         condition = {
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='is_awakened_support_gem', value=true},
            h.conditions.factory.arg{arg='max_level', value=5},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.ring))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 6, i18n.awakened_support, 20)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Hubris
                 -- The Cheater
                 item_id = "Metadata/Items/DivinationCards/DivinationCardHubris",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCheater',
                 amount = 5,
                 amount = 3,
             },
             },
         },
         },
Line 1,750: Line 1,901:
     {
     {
         defaults = {
         defaults = {
            is_drop_restricted = false,
             is_corrupted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Ring'},
             h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='is_awakened_support_gem', value=true},
            h.conditions.factory.arg{arg='max_level', value=5},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.ring))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 6, i18n.awakened_support, 23)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Blind Venture
                 -- Desecrated Virtue
                 item_id = "Metadata/Items/DivinationCards/DivinationCardBlindVenture",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDesecratedVirtue',
                 amount = 7,
                 amount = 9,
             },
             },
         },
         },
     },
     },
     {
     --[[{
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Belt'},
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
             h.conditions.factory.arg{arg='tags', value='gilded_scarab'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.belt))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.gilded_scarab))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Wretched
                 -- More is Never Enough
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWretched",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardMoreIsNeverEnough',
                 amount = 6,
                 amount = 7,
             },
             },
         },
         },
     },
     },--]]
     {
     --[[{
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
             h.conditions.factory.arg{arg='tags', value='jewelled_scarab'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.map))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.winged_scarab))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Encroaching Darkness
                 -- Rebirth and Renewal
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheEncroachingDarkness",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardRebirthAndRenewal',
                 amount = 8,
                 amount = 4,
             },
             },
         },
         },
     },
     },--]]
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.flag_is_set{flag = 'is_scarab'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.map))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Otherworldly Incubator
                 -- Cameria's Cut
                 item_id = "Metadata/Items/Currency/CurrencyIncubationUniqueMaps",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardCameriasCut',
                 amount = 8,
                 amount = 2,
             },
             },
         },
         },
Line 1,820: Line 1,982:
     {
     {
         defaults = {
         defaults = {
             is_corrupted = false,
             is_drop_restricted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Wand'},
             h.conditions.factory.flag_is_set{flag = 'is_scarab'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.wand))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Traitor
                 -- Skittering Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheTraitor",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationScarabsStackable',
                 amount = 4,
                 amount = 1,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            h.conditions.factory.arg{arg='tags', value='breachstone_splinter'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.staff))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.breachstone_splinter), 5)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Tower
                 -- The Puzzle
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheTower",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardThePuzzle',
                 amount = 6,
                 amount = 5,
             },
             },
         },
         },
Line 1,856: Line 2,022:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
             h.conditions.factory.arg{arg='tags', value='small_staff', negate=true}, -- Small staves excluded because they don't have enough sockets
             h.conditions.factory.arg{arg='tags', value='quality_currency'},
            function (tpl_args, frame)
                return tpl_args.drop_level <= 66
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link_item_level_y, 5, 66, m_util.html.poe_color('normal', i18n.staff))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.quality_currency), 20)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Flora's Gift
                 -- The Master Artisan
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheFlorasGift",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMasterArtisan',
                 amount = 5,
                 amount = 5,
             },
             },
Line 1,874: Line 2,037:
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
             h.conditions.factory.flag_is_set{flag = 'is_fossil'},
            h.conditions.factory.arg{arg='tags', value='small_staff', negate=true}, -- Small staves excluded because they don't have enough sockets
            function (tpl_args, frame)
                return tpl_args.drop_level <= 55
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link_item_level_y, 6, 55, m_util.html.poe_color('normal', i18n.staff))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.fossil), 5)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Dark Mage
                 -- The Tinkerer's Table
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheDarkMage",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTinkerersTable',
                 amount = 6,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.flag_is_set{flag = 'is_fossil'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link_item_level_y, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
             return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.fossil))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Dapper Prodigy
                 -- Fossilised Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheDapperProdigy",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationFossilsStackable',
                 amount = 6,
                 amount = 1,
             },
             },
         },
         },
     },
     },
         {
    {
         defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            function (tpl_args)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'ScoutingReport', 1, true)
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link_item_level_y_random_influenced, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
             return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.scouting_report), 20)
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Draped in Dreams (Облачённый в мечты)
                 -- The Side Quest
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDrapedInDreams",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSideQuest',
                 amount = 5,
                 amount = 5,
             },
             },
Line 1,926: Line 2,097:
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.arg{arg='class_id', value='UniqueFragment'},
            h.conditions.factory.acquisition_tag{tag = 'Harbinger'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.harbinger_fragment))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Chains that Bind
                 -- The Messenger
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheChainsThatBind",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMessenger',
                 amount = 11,
                 amount = 4,
             },
             },
         },
         },
     },
     },
    --
    -- Single item class
    --
     {
     {
         condition = {
         condition = {
             h.conditions.normal,  
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},  
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Geomancer's Incubator (Инкубатор геоманта)
                 -- The Body
                 item_id = "Metadata/Items/Currency/CurrencyIncubationArmour6Linked",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBody',
                 amount = 1,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.arg{arg='class_id', value='Shield'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.body_armour))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.shield))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Destined to Crumble
                 -- The Mercenary
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDestinedToCrumble",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMercenary',
                 amount = 5,
                 amount = 5,
             },
             },
Line 1,976: Line 2,157:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='Shield'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.map))
             return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('normal', i18n.shield))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Boundless Realms
                 -- Astral Protection
                 item_id = "Metadata/Items/DivinationCards/DivinationCardBoundlessRealms",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardAstralProtection',
                 amount = 4,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Map'},
             h.conditions.factory.arg{arg='class_id', value='Helmet'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.map))
             return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('magic', i18n.helmet))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Explorer
                 -- Further Invention
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheExplorer",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardFurtherInvention',
                 amount = 6,
                 amount = 4,
             },
             },
         },
         },
Line 2,010: Line 2,188:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', value='Gloves'},
             h.conditions.factory.arg{arg='class_id', value='Helmet'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gloves))
             return string.format(i18n.fmt.random_two_veiled, m_util.html.poe_color('rare', i18n.helmet))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Mitts
                 -- The Journalist
                 item_id = "Metadata/Items/DivinationCards/DivinationCardMitts",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJournalist',
                 amount = 5,
                 amount = 10,
             },
             },
         },
         },
Line 2,026: Line 2,204:
     {
     {
         defaults = {
         defaults = {
             is_drop_restricted = false,
             is_corrupted = false,
         },
         },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
             h.conditions.factory.arg{arg='class_id', value='Claw'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.claw))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Gambler
                 -- The Wolverine
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheGambler",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolverine',
                 amount = 5,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
             h.conditions.factory.arg{arg='class_id', values={'Dagger', 'Rune Dagger'}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.dagger))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Stacked Deck
                 -- Assassin's Favour
                 item_id = "Metadata/Items/DivinationCards/DivinationCardDeck",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardAssassinsFavour',
                 amount = 1,
                 amount = 9,
             },
             },
         },
         },
     },
     },
    --
    -- Multiple item classes
    --
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'One Hand Axe', 'Two Hand Axe'}},
             h.conditions.factory.arg{arg='class_id', value='Sceptre'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.axe))
             return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('magic', string.format('%s %s', i18n.sceptre, h.modifier_link{id='LocalIncreasedAttackSpeed8'})))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Battle Born
                 -- The Lord of Celebration
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheBattleBorn",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordOfCelebration',
                 amount = 5,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
             h.conditions.factory.arg{arg='class_id', value='Bow'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.aura.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.aura.tag)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.bow))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Wilted Rose
                 -- Hunter's Resolve
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWiltedRose",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHuntersResolve',
                 amount = 7,
                 amount = 8,
             },
             },
         },
         },
Line 2,104: Line 2,271:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_gem, 20)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewel))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Fox
                 -- The Garish Power
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheFox",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGarishPower',
                 amount = 6,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.minion.tag},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_x_gem_q_y, m_game.constants.item.gem_tags.minion.tag, 20)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.jewel))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Summoner
                 -- The Eye of the Dragon
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheSummoner",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEyeOfTheDragon',
                 amount = 6,
                 amount = 10,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
            -- since this is checking against an array, it will check if it contains the "Spell" value
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.spell.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.spell.tag)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='PercentIncreasedLifeJewel'}, i18n.jewel)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 --The Cataclysm
                 -- Shard of Fate
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCataclysm",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardShardOfFate',
                 amount = 13,
                 amount = 4,
             },
             },
         },
         },
Line 2,161: Line 2,323:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.superior_gem_q_x, 20)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewel, h.modifier_link{id='CriticalStrikeMultiplierJewel'})))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Gemcutter's Promise
                 -- The Mountain
                 item_id = "Metadata/Items/DivinationCards/DivinationCardGemcuttersPromise",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMountain',
                 amount = 3,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
             h.conditions.factory.arg{arg='class_id', value='Jewel'},
            h.conditions.factory.arg{arg='tags', value='int_armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedEnergyShieldPercentAndStunRecovery6'}, i18n.armour)))
             return string.format(i18n.fmt.random_corrupted_implicit, m_util.html.poe_color('rare', i18n.jewel), h.modifier_link{id='V2CorruptedBloodImmunityCorrupted'})
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Inoculated
                 -- Lachrymal Necrosis
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheInoculated",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardLachrymalNecrosis',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
Line 2,194: Line 2,358:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
             h.conditions.factory.arg{arg='class_id', value='Amulet'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.life, i18n.armour)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='IncreasedEnergyShieldPercent7'}, i18n.amulet)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Carrion Crow
                 -- The Sigil
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCarrionCrow",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSigil',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
             h.conditions.factory.arg{arg='class_id', value='Amulet'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_shaper_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.amulet))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Perfection
                 -- The Warden
                 item_id = "Metadata/Items/DivinationCards/DivinationCardPerfection",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWarden',
                 amount = 5,
                 amount = 4,
             },
             },
         },
         },
Line 2,225: Line 2,392:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
             h.conditions.factory.arg{arg='class_id', value='Ring'},
            function (tpl_args)
                return tpl_args.drop_level <= 83
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewellery))
             return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('magic', string.format('%s %s', i18n.ring, h.modifier_link{id='ChaosResist6'})))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Cache (Тайник)
                 -- The Lord in Black
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheCache",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordInBlack',
                 amount = 6,
                 amount = 6,
             },
             },
Line 2,242: Line 2,412:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
             h.conditions.factory.arg{arg='class_id', value='Ring'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_influenced_item_level_x, 86, m_util.html.poe_color('rare', i18n.jewellery))
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Awakened (Пробуждённые)
                 -- The Opulent
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheAwakened",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheOpulecent',
                 amount = 6,
                 amount = 5,
             },
             },
         },
         },
Line 2,257: Line 2,427:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
             h.conditions.factory.arg{arg='class_id', value='Ring'},
            function (tpl_args, frame)
                return tpl_args.drop_level <= 79
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 79, m_util.html.poe_color('rare', i18n.jewellery))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Lover
                 -- Hubris
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheLover",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardHubris',
                 amount = 2,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
             h.conditions.factory.arg{arg='class_id', value='Ring'},
            function (tpl_args, frame)
                return tpl_args.drop_level <= 85
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 85, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='ReduceGlobalFlatManaCostStrIntMasterVendor'}, i18n.jewellery)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.ring))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Blessing of God
                 -- Blind Venture
                 item_id = "Metadata/Items/DivinationCards/DivinationCardBlessingOfGod",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardBlindVenture',
                 amount = 3,
                 amount = 7,
             },
             },
         },
         },
Line 2,295: Line 2,462:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
             h.conditions.factory.arg{arg='class_id', value='Belt'},
            function (tpl_args, frame)
                return tpl_args.drop_level <= 76
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 76, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='AddedLightningDamage9'}, i18n.jewellery)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.belt))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 --Struck by Lightning
                 -- The Wretched
                 item_id = "Metadata/Items/DivinationCards/DivinationCardStruckByLightning",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWretched',
                 amount = 3,
                 amount = 6,
             },
             },
         },
         },
Line 2,314: Line 2,478:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
             h.conditions.factory.arg{arg='class_id', value='Belt'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_shaper_hunter_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewellery, h.modifier_link{id='GrantsCatAspectCrafted'})))
             return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.belt))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- A Familiar Call (Знакомый зов)
                 -- The Dungeon Master
                 item_id = "Metadata/Items/DivinationCards/DivinationCardAFamiliarCall",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDungeonMaster',
                 amount = 3,
                 amount = 7,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Two Hand Sword', 'Two Hand Axe', 'Two Hand Mace', 'Staff', 'Bow', 'Warstaff'}},
             h.conditions.factory.arg{arg='class_id', value='Map'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.two_hand_weapon)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.map))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Merciless Armament
                 -- The Encroaching Darkness
                 item_id = "Metadata/Items/DivinationCards/DivinationCardMercilessArmament",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEncroachingDarkness',
                 amount = 4,
                 amount = 8,
             },
             },
         },
         },
Line 2,346: Line 2,513:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
             h.conditions.factory.arg{arg='class_id', value='Map'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('rare', i18n.one_hand_weapon))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.map))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Prometheus' Armoury (Кузня Прометея)
                 -- Otherworldly Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardPrometheusArmoury",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueMapsStackable',
                 amount = 6,
                 amount = 1,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
             h.conditions.factory.arg{arg='class_id', value='Wand'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.one_hand_weapon)))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.wand))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Jester
                 -- The Traitor
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheJester",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTraitor',
                 amount = 9,
                 amount = 4,
             },
             },
         },
         },
Line 2,378: Line 2,548:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
             h.conditions.factory.arg{arg='class_id', values={'Sceptre', 'Wand', 'Rune Dagger'}},
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='SpellDamageOnWeapon8_'}, i18n.one_hand_weapon)))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.staff))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Road to Power
                 -- The Tower
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheRoadToPower",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTower',
                 amount = 7,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'Two Hand Sword'}},
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
            h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets
            function (tpl_args)
                return tpl_args.drop_level <= 66
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.sword))
             return string.format(i18n.fmt.random_x_link_item_level_y, 5, 66, m_util.html.poe_color('normal', i18n.staff))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Gentleman
                 -- The Flora's Gift
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheGentleman",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFlorasGift',
                 amount = 4,
                 amount = 5,
             },
             },
         },
         },
Line 2,414: Line 2,585:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
             h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
            h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets
            function (tpl_args)
                return tpl_args.drop_level <= 55
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic',string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.weapon)))
             return string.format(i18n.fmt.random_x_link_item_level_y, 6, 55, m_util.html.poe_color('normal', i18n.staff))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Tyrant
                 -- The Dark Mage
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheTyrant",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDarkMage',
                 amount = 9,
                 amount = 6,
             },
             },
         },
         },
Line 2,430: Line 2,605:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.weapon, h.modifier_link{id='StrIntMasterItemGenerationCanHaveMultipleCraftedMods'})))
             return string.format(i18n.fmt.random_x_link_item_level_y, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Web
                 -- The Dapper Prodigy
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheWeb",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDapperProdigy',
                 amount = 8,
                 amount = 6,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.weapon))
             return string.format(i18n.fmt.random_x_link_item_level_y_random_influenced, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Atziri's Arsenal
                 -- Draped in Dreams
                 item_id = "Metadata/Items/DivinationCards/DivinationCardAtzirisArsenal",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDrapedInDreams',
                 amount = 4,
                 amount = 5,
             },
             },
         },
         },
Line 2,465: Line 2,637:
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.normal,
            -- specifically exclude crit flasks
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
             h.conditions.factory.arg{arg='class_id', values={'LifeFlask', 'ManaFlask', 'HybridFlask', 'UtilityFlask'}},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='FlaskChanceRechargeOnCrit1'}, i18n.flask)))
             return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Surgeon
                 -- The Chains that Bind
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheSurgeon",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheChainsThatBind',
                 amount = 4,
                 amount = 11,
             },
             },
         },
         },
Line 2,481: Line 2,652:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,  
             h.conditions.item_class_has_corrupted_implicits,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},  
            h.conditions.item_class_has_influences,
            function (tpl_args, frame)
                return tpl_args.drop_leagues ~= nil and #tpl_args.drop_leagues ~= 0
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_implicit_corrupted_two_influenced_item_level_x, 97, m_util.html.poe_color('unique', i18n.league_specific_item))
             return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Fateful Meeting (Судьбоносная встреча)
                 -- Geomancer's Incubator
                 item_id = "Metadata/Items/DivinationCards/DivinationCardFatefulMeeting",
                 item_id = 'Metadata/Items/Currency/CurrencyIncubationArmour6LinkedStackable',
                 amount = 9,
                 amount = 1,
             },
             },
         },
         },
Line 2,501: Line 2,668:
     {
     {
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.item_class_has_influences,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item))
             return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Prejudice (Предрассудки)
                 -- Destined to Crumble
                 item_id = "Metadata/Items/DivinationCards/DivinationCardPrejudice",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDestinedToCrumble',
                 amount = 7,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
             h.conditions.item_class_has_corrupted_implicits,
             h.conditions.factory.arg{arg='class_id', value='Body Armour'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.item))
             return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.body_armour))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Arrogance of the Vaal
                 -- Duality
                 item_id = "Metadata/Items/DivinationCards/DivinationCardArroganceOfTheVaal",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDuality',
                 amount = 8,
                 amount = 2,
             },
             },
         },
         },
     },
     },
    --
    -- Generic items
    --
     {
     {
         condition = {
         condition = {
             h.conditions.unique,  
             h.conditions.normal,
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='class_id', value='Map'},
                return tpl_args.drop_leagues ~= nil and #tpl_args.drop_leagues ~= 0
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
             return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.map))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Time-Lost Relic
                 -- Boundless Realms
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTimeLostRelic",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardBoundlessRealms',
                 amount = 10,
                 amount = 4,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,  
             h.conditions.normal,
             function (tpl_args, frame)
             h.conditions.factory.arg{arg='class_id', value='Map'},
                return tpl_args.drop_leagues ~= nil and #tpl_args.drop_leagues ~= 0
            end,
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
             return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.map))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Time-Lost Incubator (Затерянный во времени инкубатор)
                 -- The Explorer
                 item_id = "Metadata/Items/Currency/CurrencyIncubationUniqueLeague",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheExplorer',
                 amount = 1,
                 amount = 6,
             },
             },
         },
         },
Line 2,575: Line 2,735:
     {
     {
         condition = {
         condition = {
             h.conditions.normal,
             h.conditions.unique,
            -- should exclude all items that can't be rare
             h.conditions.factory.arg{arg='class_id', value='Gloves'},
             h.conditions.factory.arg{arg='drop_rarities_ids', value='rare'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random_elder_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gloves))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- The Hale Heart
                 -- Mitts
                 item_id = "Metadata/Items/DivinationCards/DivinationCardTheHaleHeart",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardMitts',
                 amount = 4,
                 amount = 5,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_corrupted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Boots'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
             return string.format(i18n.fmt.random_two_implicit_corrupted, string.format(i18n.fmt.item_level_x, 100, m_util.html.poe_color('unique', i18n.boots)))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Jack in the Box
                 -- The Shepherd's Sandals
                 item_id = "Metadata/Items/DivinationCards/DivinationCardJackInTheBox",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardTheShepherdsSandals',
                 amount = 4,
                 amount = 3,
             },
             },
         },
         },
     },
     },
     {
     {
        defaults = {
            is_drop_restricted = false,
        },
         condition = {
         condition = {
             h.conditions.unique,
             h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
         },
         },
         text = function (tpl_args, frame)
         text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
            return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
        end,
        groups = {
            {
                -- The Gambler
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGambler',
                item_page = 'The Gambler', -- These need to be specified so that The Gambler can be a recipe for itself while saving itself.
                item_name = 'The Gambler',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
            h.conditions.factory.not_arg{arg='tags', value='boss_drop_card'},
        },
        text = function ()
             return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
         end,
         end,
         groups = {
         groups = {
             {
             {
                 -- Singular Incubator (Необычный инкубатор)
                 -- Stacked Deck
                 item_id = "Metadata/Items/Currency/CurrencyIncubationUniques",
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardDeck',
                 amount = 1,
                 amount = 1,
             },
             },
         },
         },
     },
     },
     -- TODO: The void?
     {
}
        defaults = {
 
            is_drop_restricted = false,
-- ----------------------------------------------------------------------------
        },
-- Exported functions
        condition = {
-- ----------------------------------------------------------------------------
            h.conditions.normal,
 
            h.conditions.factory.arg{arg='class_id', value='HeistBlueprint'},
local p = {}
         },
 
         text = function ()
function p.process_upgraded_from(tpl_args, frame)
            return string.format(i18n.fmt.random, string.format(i18n.fmt.fully_revealed_x_area_level_y, m_util.html.poe_color('normal', i18n.blueprint), 83))
    local query_data = {
        end,
        id = {},
        groups = {
         name = {},
            {
         page = {},
                -- Something Dark
    }
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSomethingDark',
    local sets = {}
                amount = 5,
   
            },
    -- ------------------------------------------------------------------------
        },
    -- Manual data
     },
    -- ------------------------------------------------------------------------
     {
    local setid = #sets + 1
         defaults = {
     local set
            is_drop_restricted = false,
     repeat
         },
         local prefix = string.format('upgraded_from_set%s_', setid)
         condition = {
        local groupid = 1
             h.conditions.normal,
         local group
             h.conditions.factory.arg{arg='class_id', value='IncubatorStackable'},
         set = {
         },
             groups = {},
         text = function ()
             text = m_util.cast.text(tpl_args[prefix .. 'text']),
             return string.format(i18n.fmt.random_x_amount, string.format(i18n.fmt.item_level_x, 84, m_util.html.poe_color('currency', i18n.incubator)), 10)
            automatic = false,
        end,
         }
        groups = {
         repeat
             {
             local group_prefix = string.format('%sgroup%s_', prefix, groupid)
                 -- Parasitic Passengers
             group = {
                item_id = 'Metadata/Items/DivinationCards/DivinationCardParasiticPassengers',
                 item_name = tpl_args[group_prefix .. 'item_name'],
                 amount = 8,
                 item_id = tpl_args[group_prefix .. 'item_id'],  
            },
                item_page = tpl_args[group_prefix .. 'item_page'],  
        },
                amount = tonumber(tpl_args[group_prefix .. 'amount']),
    },
                notes = m_util.cast.text(tpl_args[group_prefix .. 'notes']),
    --
            }
    -- Multiple item classes
           
    --
             if group.item_name ~= nil or group.item_id ~= nil or group.item_page ~= nil then
    {
                if group.amount == nil then
        condition = {
                    error(string.format(i18n.errors.missing_amount, group_prefix .. 'amount'))
            h.conditions.unique,
                else
            h.conditions.factory.arg{arg='class_id', values={'One Hand Axe', 'Two Hand Axe'}},
                    for key, array in pairs(query_data) do
        },
                        local value = group['item_' .. key]
        text = function ()
                        if value then
             return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.axe))
                            if array[value] then
        end,
                                table.insert(array[value], {setid, groupid})
        groups = {
                            else
            {
                                array[value] = {{setid, groupid}, }
                -- The Battle Born
                            end
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBattleBorn',
                        end
                amount = 5,
                    end
            },
                    set.groups[#set.groups+1] = group
        },
                end
    },
             end
    {
              
        condition = {
            groupid = groupid + 1
            h.conditions.normal,
        until group.item_name == nil and group.item_id == nil and group.item_page == nil
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
          
             h.conditions.factory.arg{arg='max_level', value=20},
        -- set was empty, can terminate safely
         },
         if #set.groups == 0 then
         text = function ()
             set = nil
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_gem, 20)))
         else
         end,
            setid = setid + 1
        groups = {
             sets[#sets+1] = set
             {
        end
                -- The Fox
    until set == nil
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFox',
    -- ------------------------------------------------------------------------
                amount = 6,
    -- Automatic
            },
    -- ------------------------------------------------------------------------
        },
   
     },
    --
     {
     --  maps
        condition = {
     --
            h.conditions.normal,
    local automatic_index = #sets + 1
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
    -- TODO: 3.9.0 Unsure how this works yet, so disabled for now
        },
    --[[if tpl_args.atlas_connections and tpl_args.rarity_id == "normal" then
         text = function ()
         local results = m_cargo.query(
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.gem_x_quality, 20)))
             {'items', 'maps'},
        end,
            {'items._pageName', 'items.name'},
        groups = {
             {
             {
                 join='items._pageID=maps._pageID',
                 -- Gemcutter's Promise
                 where=string.format('items.class_id = "Map" AND items.rarity_id = "normal" AND maps.tier < %s AND items._pageName IN ("%s")', tpl_args.map_tier, table.concat(tpl_args.atlas_connections, '", "')),
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersPromise',
             }
                 amount = 3,
         )
             },
        for _, row in ipairs(results) do
         },
            sets[#sets+1] = {
    },
                text = i18n.misc.upgraded_from_map,
    {
                groups = {
        condition = {
                    {
            h.conditions.normal,
                        item_name = row['items.name'],
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
                        item_page = row['items._pageName'],
        },
                        amount = 3,
        text = function ()
                        notes = nil,
             return string.format(i18n.fmt.random, m_util.html.poe_color('gem', i18n.fmt.gem_quality))
                    },
        end,
                },
        groups = {
                automatic = true,
             }
        end
    end]]
   
    --
    -- oils
    --
    if tpl_args._flags.is_blight_item and tpl_args.blight_item_tier > 1 then
        local results = m_cargo.query(
            {'items', 'blight_items'},
            {'items._pageName',  'items.name'},
             {
             {
                 join='items._pageID=blight_items._pageID',
                 -- Gemcutter's Incubator
                 where=string.format('blight_items.tier = %s', tpl_args.blight_item_tier - 1),
                item_id = 'Metadata/Items/Currency/CurrencyIncubationGemLowStackable',
             }
                 amount = 1,
         )
             },
        for _, row in ipairs(results) do
         },
            sets[#sets+1] = {
    },
                text = nil,
    {
                groups = {
        condition = {
                    {
            h.conditions.unique,
                        item_name = row['items.name'],
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
                        item_page = row['items._pageName'],
        },
                        amount = 3,
        text = function ()
                        notes = nil,
             return string.format(i18n.fmt.random_x_quality, m_util.html.poe_color('unique', i18n.armour), 30)
                    },
        end,
                },
        groups = {
                automatic = true,
             }
        end
    end
   
   
    --
    -- essences
    --
   
    -- exclude remnant of corruption via type
    if tpl_args.is_essence and tpl_args.essence_type > 0 then
        local results = m_cargo.query(
            {'items', 'essences'},
             {
             {
                 'items._pageName', 
                 -- Sambodhi's Wisdom
                'items.name',
                 item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisWisdom',
                 'items.metadata_id',
                 amount = 3,
                 'essences.category',
                'essences.type',
             },
             },
            {
        },
                join='items._pageID=essences._pageID',
    },
                where=string.format([[
    {
                        (essences.category="%s" AND essences.level = %s)
        condition = {
                        OR (essences.type = %s AND essences.level = %s)
            h.conditions.normal,
                        OR items.metadata_id = 'Metadata/Items/Currency/CurrencyCorruptMonolith'
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
                        OR (%s = 6 AND essences.type = 5 AND essences.level >= 5)  
            h.conditions.factory.arg{arg='tags', value='int_armour'},
                    ]],  
        },
                    tpl_args.essence_category, tpl_args.essence_level - 1,  
        text = function ()
                    tpl_args.essence_type - 1, tpl_args.essence_level,
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedEnergyShieldPercentAndStunRecovery6'}, i18n.armour)))
                    -- special case for corruption only essences
         end,
                    tpl_args.essence_type
         groups = {
                ),
            {
                orderBy='essences.level ASC, essences.type ASC',
                -- The Inoculated
            }
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheInoculated',
        )
                amount = 4,
          
             },
         local remnant = results[1]
        },
        if remnant['items.metadata_id'] ~= 'Metadata/Items/Currency/CurrencyCorruptMonolith' then
    },
             error(string.format('Something went seriously wrong here. Got results: %s', mw.dumpObject(results)))
    {
        end
         condition = {
         for i=2, #results do
            h.conditions.normal,
             local row = results[i]
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
            if row['essences.category'] == tpl_args.essence_category then
        },
                -- 3 to 1 recipe
        text = function ()
                sets[#sets+1] = {
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.life, i18n.armour)))
                    automatic = true,
        end,
                    text = nil,
        groups = {
                    groups = {
            {
                        {
                -- The Carrion Crow
                            item_id = row['items.metadata_id'],
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCarrionCrow',
                            item_page = row['items._pageName'],
                amount = 4,
                            item_name = row['items.name'],
            },
                            amount = 3,
        },
                        },
    },
                    },
    {
                }
        condition = {
                -- corruption +1
            h.conditions.normal,
                sets[#sets+1] = {
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
                    automatic = true,
        },
                    text = i18n.essence_plus_one_level,
        text = function ()
                    groups = {
            return string.format(i18n.fmt.random_shaper_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery))
                        {
        end,
                            item_id = row['items.metadata_id'],
        groups = {
                            item_page = row['items._pageName'],
            {
                            item_name = row['items.name'],
                -- Perfection
                            amount = 1,
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPerfection',
                        },
                amount = 5,
                        {
            },
                            item_id = remnant['items.metadata_id'],
        },
                            item_page = remnant['items._pageName'],
    },
                            item_name = remnant['items.name'],
    {
                            amount = 1,
        condition = {
                        },
             h.conditions.unique,
                    },
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
                }
        },
             elseif tonumber(row['essences.type']) == tpl_args.essence_type - 1 then
        text = function ()
                -- corruption type change
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewellery))
                sets[#sets+1] = {
        end,
                    automatic = true,
        groups = {
                    text = i18n.essence_type_change,
            {
                    groups = {
                -- The Cache
                        {
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCache',
                            item_id = row['items.metadata_id'],
                amount = 6,
                            item_page = row['items._pageName'],
            },
                            item_name = row['items.name'],
        },
                            amount = 1,
    },
                        },
    {
                        {
        condition = {
                            item_id = remnant['items.metadata_id'],
            h.conditions.normal,
                            item_page = remnant['items._pageName'],
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
                            item_name = remnant['items.name'],
        },
                            amount = 1,
        text = function ()
                        },
             return string.format(i18n.fmt.random_two_influenced_item_level_x, 86, m_util.html.poe_color('rare', i18n.jewellery))
                    },
         end,
                }
        groups = {
             end
            {
         end
                -- The Awakened
    end
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAwakened',
   
                amount = 6,
    -- data based on mapping
             },
    if tpl_args.drop_enabled and not tpl_args.upgraded_from_disabled then
        },
        for _, data in ipairs(c.automatic_upgraded_from) do
    },
             data.defaults = data.defaults or {}
    {
             local continue = true
        condition = {
             for key, value in pairs(c.automatic_upgraded_from_defaults) do
             h.conditions.normal,
                 local func
             h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
                local v = data.defaults[key]
            function (tpl_args)
                if v == false then
                 return tpl_args.drop_level <= 79
                    -- check is disabled specifically, continue
            end,
                elseif v == nil then
        },
                    func = value
        text = function ()
                elseif type(v) == 'function' then
            return string.format(i18n.fmt.random_item_level_x, 79, m_util.html.poe_color('rare', i18n.jewellery))
                    func = v
        end,
                else
        groups = {
                    error(string.format('Invalid value for defaults at data %s', mw.dumpObject(data)))
            {
                end
                -- The Lover
                if func then
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLover',
                    continue = func(tpl_args, frame) and continue
                 amount = 2,
                    if not continue then
             },
                        break
        },
                    end
    },
                 end
    {
             end
        condition = {
            for _, condition in ipairs(data.condition) do
            h.conditions.normal,
                continue = condition(tpl_args, frame) and continue
            h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
                 if not continue then
            function (tpl_args)
                    break
                 return tpl_args.drop_level <= 85
                end
             end,
             end
        },
           
        text = function ()
            if continue then
            return string.format(i18n.fmt.random_item_level_x, 85, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='ReduceGlobalFlatManaCostStrIntMasterVendor'}, i18n.jewellery)))
                sets[#sets+1] = {
        end,
                    automatic = true,
        groups = {
                    text = data.text(tpl_args, frame),
            {
                    groups = data.groups,
                -- Blessing of God
                }
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBlessingOfGod',
                for groupid, row in ipairs(data.groups) do
                amount = 3,
                    if query_data['id'][row.item_id] then
            },
                        table.insert(query_data['id'][row.item_id], {#sets, groupid})
        },
                    else
    },
                        query_data['id'][row.item_id] = {{#sets, groupid}, }
    {
                    end
        condition = {
                end
            h.conditions.normal,
            end
            h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
         end
            function (tpl_args)
    end
                return tpl_args.drop_level <= 76
   
            end,
    if #sets == 0 then
        },
        return
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 76, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='AddedLightningDamage9'}, i18n.jewellery)))
        end,
        groups = {
            {
                -- Struck by Lightning
                item_id = 'Metadata/Items/DivinationCards/DivinationCardStruckByLightning',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_shaper_hunter_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewellery, h.modifier_link{id='GrantsCatAspectCrafted'})))
        end,
        groups = {
            {
                -- A Familiar Call
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAFamiliarCall',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery))
        end,
        groups = {
            {
                -- Imperfect Memories
                item_id = 'Metadata/Items/DivinationCards/DivinationCardImperfectMemories',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Two Hand Sword', 'Two Hand Axe', 'Two Hand Mace', 'Staff', 'Bow', 'Warstaff'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.two_hand_weapon)))
        end,
        groups = {
            {
                -- Merciless Armament
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMercilessArmament',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('rare', i18n.one_hand_weapon))
        end,
        groups = {
            {
                -- Prometheus' Armoury
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPrometheusArmoury',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.one_hand_weapon)))
        end,
        groups = {
            {
                -- The Jester
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJester',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Sceptre', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='SpellDamageOnWeapon8_'}, i18n.one_hand_weapon)))
        end,
        groups = {
            {
                -- The Road to Power
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRoadToPower',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'Two Hand Sword'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.sword))
        end,
        groups = {
            {
                -- The Gentleman
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGentleman',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic',string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.weapon)))
        end,
        groups = {
            {
                -- The Tyrant
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTyrant',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.weapon, h.modifier_link{id='StrIntMasterItemGenerationCanHaveMultipleCraftedMods'})))
        end,
        groups = {
            {
                -- The Web
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWeb',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.weapon))
        end,
        groups = {
            {
                -- Atziri's Arsenal
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAtzirisArsenal',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.flasks.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='FlaskChanceRechargeOnCrit5'}, i18n.flask)))
        end,
        groups = {
            {
                -- The Surgeon
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurgeon',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='tags', value='two_hand_weapon'},
            h.conditions.factory.acquisition_tag{tag = 'experimented base type'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_quality, string.format(i18n.fmt.item_level_x, 86, m_util.html.poe_color('rare', i18n.experimented_two_hand_weapon)), 30)
        end,
        groups = {
            {
                -- Soul Quenched
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSoulQuenched',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
            h.conditions.factory.acquisition_tag{tag = 'experimented base type'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.experimented_base_type))
        end,
        groups = {
            {
                -- Auspicious Ambitions
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAuspiciousAmbitions',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_corrupted_implicits,
            h.conditions.item_class_has_influences,
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted_two_influenced_item_level_x, 97, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Fateful Meeting
                item_id = 'Metadata/Items/DivinationCards/DivinationCardFatefulMeeting',
                amount = 9,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Time-Lost Relic
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTimeLostRelic',
                amount = 10,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Time-Lost Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueLeagueStackable',
                amount = 1,
            },
        },
    },
    --
    -- Generic items
    --
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_fractured_modifiers,
        },
        text = function ()
            return string.format(i18n.fmt.random_fractured_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
        end,
        groups = {
            {
                -- A Dusty Memory
                item_id = 'Metadata/Items/DivinationCards/DivinationCardADustyMemory',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_elder_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
        end,
        groups = {
            {
                -- The Hale Heart
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHaleHeart',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Prejudice
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPrejudice',
                amount = 7,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Costly Curio
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCostlyCurio',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_influenced_x_elevated, m_util.html.poe_color('magic', i18n.item))
        end,
        groups = {
            {
                -- The Aspirant
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAspirant',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_synthesised_implicits,
        },
        text = function ()
            return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('normal', i18n.item))
        end,
        groups = {
            {
                -- Magnum Opus
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMagnumOpus',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_corrupted_implicits,
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Arrogance of the Vaal
                item_id = 'Metadata/Items/DivinationCards/DivinationCardArroganceOfTheVaal',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Jack in the Box
                item_id = 'Metadata/Items/DivinationCards/DivinationCardJackInTheBox',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Singular Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationUniquesStackable',
                amount = 1,
            },
        },
    },
}
 
-- ----------------------------------------------------------------------------
-- Exported functions
-- ----------------------------------------------------------------------------
 
local p = {}
 
function p.process_recipes(tpl_args)
    local query_data = {
        id = {},
        name = {},
        page = {},
    }
    local sets = {}
   
    -- ------------------------------------------------------------------------
    -- Manual data
    -- ------------------------------------------------------------------------
    local setid = #sets + 1
    local set
    repeat
        local prefix = string.format('recipe%s_', setid)
        local groupid = 1
        local group
        set = {
            groups = {},
            result_amount = tonumber(tpl_args[prefix .. 'result_amount']) or 1,
            text = m_util.cast.text(tpl_args[prefix .. 'description']),
            automatic = false,
        }
        repeat
            local group_prefix = string.format('%spart%s_', prefix, groupid)
            group = {
                item_name = tpl_args[group_prefix .. 'item_name'],
                item_id = tpl_args[group_prefix .. 'item_id'],
                item_page = tpl_args[group_prefix .. 'item_page'],
                amount = tonumber(tpl_args[group_prefix .. 'amount']),
                notes = m_util.cast.text(tpl_args[group_prefix .. 'notes']),
            }
           
            if group.item_name ~= nil or group.item_id ~= nil or group.item_page ~= nil then
                if group.amount == nil then
                    error(string.format(i18n.errors.missing_amount, group_prefix .. 'amount'))
                else
                    for key, array in pairs(query_data) do
                        local value = group['item_' .. key]
                        if value then
                            if array[value] then
                                table.insert(array[value], {setid, groupid})
                            else
                                array[value] = {{setid, groupid}, }
                            end
                        end
                    end
                    set.groups[#set.groups+1] = group
                end
            end
           
            groupid = groupid + 1
        until group.item_name == nil and group.item_id == nil and group.item_page == nil
       
        -- set was empty, can terminate safely
        if #set.groups == 0 then
            set = nil
        else
            setid = setid + 1
            sets[#sets+1] = set
        end
    until set == nil
 
    -- ------------------------------------------------------------------------
    -- Automatic
    -- ------------------------------------------------------------------------
   
    --
    --  maps
    --
    local automatic_index = #sets + 1
    -- TODO: 3.9.0 Unsure how this works yet, so disabled for now
    --[[if tpl_args.atlas_connections and tpl_args.rarity_id == 'normal' then
        local results = m_cargo.query(
            {'items', 'maps'},
            {'items._pageName',  'items.name'},
            {
                join='items._pageID=maps._pageID',
                where=string.format('items.class_id = "Map" AND items.rarity_id = "normal" AND maps.tier < %s AND items._pageName IN ("%s")', tpl_args.map_tier, table.concat(tpl_args.atlas_connections, '", "')),
            }
        )
        for _, row in ipairs(results) do
            sets[#sets+1] = {
                text = i18n.misc.upgraded_from_map,
                result_amount = 1,
                groups = {
                    {
                        item_name = row['items.name'],
                        item_page = row['items._pageName'],
                        amount = 3,
                        notes = nil,
                    },
                },
                automatic = true,
            }
        end
    end]]
   
    --
    -- oils
    --
    if tpl_args._flags.is_blight_item and tpl_args.blight_item_tier > 1 then
        local results = m_cargo.query(
            {'items', 'blight_items'},
            {'items._pageName',  'items.name'},
            {
                join='items._pageID=blight_items._pageID',
                where=string.format('blight_items.tier = %s', tpl_args.blight_item_tier - 1),
            }
        )
        for _, row in ipairs(results) do
            sets[#sets+1] = {
                text = nil,
                result_amount = 1,
                groups = {
                    {
                        item_name = row['items.name'],
                        item_page = row['items._pageName'],
                        amount = 3,
                        notes = nil,
                    },
                },
                automatic = true,
            }
         end
     end
     end
     --
   
     -- Fetch item data in a single query to sacrifice database load with a lot of upgraded_from references
   
     --
    --
     local query_data_array = {
    -- essences
         id = {},
    --
         name = {},
   
         page = {},
    -- exclude remnant of corruption via type
     }
    if tpl_args._flags.is_essence and tpl_args.essence_type > 0 then
     local query_fields = {
        local results = m_cargo.query(
         id = 'items.metadata_id',
            {'items', 'essences'},
         page = 'items._pageName',
            {
         name = 'items.name',
                'items._pageName', 
     }
                'items.name',
     local where = {}
                'items.metadata_id',
     local expected_count = 0
                'essences.category',
     for key, thing_array in pairs(query_data) do
                'essences.type',
         for thing, _ in pairs(thing_array) do
            },
             table.insert(query_data_array[key], thing)
            {
         end
                join='items._pageID=essences._pageID',
         if #query_data_array[key] > 0 then
                where=string.format([[
             expected_count = expected_count + #query_data_array[key]
                        (essences.category="%s" AND essences.level = %s)
             local q_data = table.concat(query_data_array[key], '", "')
                        OR (essences.type = %s AND essences.level = %s)
             table.insert(where, string.format('%s IN ("%s")', query_fields[key], q_data))
                        OR items.metadata_id = 'Metadata/Items/Currency/CurrencyCorruptMonolith'
         end
                        OR (%s = 6 AND essences.type = 5 AND essences.level >= 5)
     end
                    ]],
     local results = m_cargo.query(
                    tpl_args.essence_category, tpl_args.essence_level - 1,
         {'items'},
                    tpl_args.essence_type - 1, tpl_args.essence_level,
         {'items._pageName',  'items.name', 'items.metadata_id'},
                    -- special case for corruption only essences
         {
                    tpl_args.essence_type
             where=table.concat(where, ' OR '),
                ),
         }
                orderBy='essences.level ASC, essences.type ASC',
     )
            }
      
        )
       
        local remnant = results[1]
        if remnant['items.metadata_id'] ~= 'Metadata/Items/Currency/CurrencyCorruptMonolith' then
            error(string.format('Something went seriously wrong here. Got results: %s', mw.dumpObject(results)))
        end
        for i=2, #results do
            local row = results[i]
            if row['essences.category'] == tpl_args.essence_category then
                -- 3 to 1 recipe
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = nil,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 3,
                        },
                    },
                }
                -- corruption +1
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.essence_plus_one_level,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 1,
                        },
                        {
                            item_id = remnant['items.metadata_id'],
                            item_page = remnant['items._pageName'],
                            item_name = remnant['items.name'],
                            amount = 1,
                        },
                    },
                }
            elseif tonumber(row['essences.type']) == tpl_args.essence_type - 1 then
                -- corruption type change
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.essence_type_change,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 1,
                        },
                        {
                            item_id = remnant['items.metadata_id'],
                            item_page = remnant['items._pageName'],
                            item_name = remnant['items.name'],
                            amount = 1,
                        },
                    },
                }
            end
        end
    end
   
    -- data based on mapping
    if tpl_args.drop_enabled and not tpl_args.disable_automatic_recipes then
        for _, data in ipairs(c.automatic_recipes) do
            data.defaults = data.defaults or {}
            local continue = true
            for key, value in pairs(c.automatic_recipe_defaults) do
                local func
                local v = data.defaults[key]
                if v == false then
                    -- check is disabled specifically, continue
                elseif v == nil then
                    func = value
                elseif type(v) == 'function' then
                    func = v
                else
                    error(string.format('Invalid value for defaults at data %s', mw.dumpObject(data)))
                end
                if func then
                    continue = func(tpl_args) and continue
                    if not continue then
                        break
                    end
                end
            end
            for _, condition in ipairs(data.condition) do
                continue = condition(tpl_args) and continue
                if not continue then
                    break
                end
            end
           
            if continue then
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = data.text(),
                    groups = data.groups,
                }
                for groupid, row in ipairs(data.groups) do
                    if query_data['id'][row.item_id] then
                        table.insert(query_data['id'][row.item_id], {#sets, groupid})
                    else
                        query_data['id'][row.item_id] = {{#sets, groupid}, }
                    end
                end
            end
        end
    end
   
    if #sets == 0 then
        return
    end
     --
     -- Fetch item data in a single query to sacrifice database load with a lot of references
     --
     local query_data_array = {
         id = {},
         name = {},
         page = {},
     }
     local query_fields = {
         id = 'items.metadata_id',
         page = 'items._pageName',
         name = 'items.name',
     }
     local where = {}
     local expected_count = 0
     for key, thing_array in pairs(query_data) do
         for thing, _ in pairs(thing_array) do
             table.insert(query_data_array[key], thing)
         end
         if #query_data_array[key] > 0 then
             expected_count = expected_count + #query_data_array[key]
             local q_data = table.concat(query_data_array[key], '", "')
             table.insert(where, string.format('%s IN ("%s")', query_fields[key], q_data))
         end
     end
     local results = m_cargo.query(
         {'items'},
         {'items._pageName',  'items.name', 'items.metadata_id'},
         {
             where=table.concat(where, ' OR '),
         }
     )
 
     -- Now do The Void
    for _, row in ipairs(results) do
        if row[query_fields.id] and string.find(row[query_fields.id], 'Metadata/Items/DivinationCards/', 1, true) then
            local group = {
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheVoid',
                amount = 1,
            }
            local result = m_cargo.query(
                {'items'},
                {'items._pageName',  'items.name', 'items.metadata_id'},
                {
                    where=string.format('%s = "%s"', query_fields.id, group.item_id),
                }
            )
            if #result > 0 then
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.the_void,
                    groups = {group},
                }
                if query_data['id'][group.item_id] then
                    table.insert(query_data['id'][group.item_id], {#sets, 1})
                else
                    query_data['id'][group.item_id] = {{#sets, 1}, }
                end
                table.insert(results, result[1])
            end
            break
        end
    end
 
     for _, row in ipairs(results) do
     for _, row in ipairs(results) do
         for key, thing_array in pairs(query_data) do
         for key, thing_array in pairs(query_data) do
Line 2,957: Line 3,874:
             for thing, set_groups in pairs(array) do
             for thing, set_groups in pairs(array) do
                 for _, set_group in ipairs(set_groups) do
                 for _, set_group in ipairs(set_groups) do
                     tpl_args._flags.broken_upgraded_from_reference = true
                     tpl_args._flags.invalid_recipe_parts = true
                     tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.upgraded_from_broken_reference, string.format('upgraded_from_set%s_group%s_item_%s', set_group[1], set_group[2], key), thing)
                     tpl_args._errors[#tpl_args._errors+1] = m_util.string.format(i18n.errors.invalid_recipe_parts, string.format('recipe%s_part%s_item_%s', set_group[1], set_group[2], key), thing)
                 end
                 end
             end
             end
Line 2,979: Line 3,896:
                 end
                 end
                 if match then
                 if match then
                     tpl_args._flags.duplicate_upgraded_from_reference = true
                     tpl_args._flags.duplicate_recipes = true
                     tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.upgraded_from_duplicate, j)
                     tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.duplicate_recipes, j)
                     delete_sets[#delete_sets+1] = j  
                     delete_sets[#delete_sets+1] = j  
                 end
                 end
Line 2,993: Line 3,910:
     -- Set data
     -- Set data
     --  
     --  
     tpl_args.upgrade_from_sets = sets
     tpl_args.recipes = sets
      
      
     -- set upgraded_from data
     -- set recipes data
     for i, set in ipairs(sets) do
     for i, set in ipairs(sets) do
         tpl_args._subobjects[#tpl_args._subobjects+1] = {
         table.insert(tpl_args._store_data, {
             _table = 'upgraded_from_sets',
             _table = 'acquisition_recipes',
             set_id = i,
             recipe_id = i,
             text = set.text,
             result_amount = set.result_amount,
            description = set.text,
             automatic = set.automatic,
             automatic = set.automatic,
         }
         })
       
         for j, group in ipairs(set.groups) do
         for j, group in ipairs(set.groups) do
             tpl_args._subobjects[#tpl_args._subobjects+1] = {
             table.insert(tpl_args._store_data, {
                 _table = 'upgraded_from_groups',
                 _table = 'acquisition_recipe_parts',
                 group_id = j,
                 part_id = j,
                 set_id = i,
                 recipe_id = i,
                 item_name = group.item_name,
                 item_name = group.item_name,
                 item_id = group.item_id,
                 item_id = group.item_id,
Line 3,014: Line 3,931:
                 amount = group.amount,
                 amount = group.amount,
                 notes = group.notes,
                 notes = group.notes,
             }
             })
         end
         end
     end
     end
Line 3,024: Line 3,941:


function p.debug_validate_auto_upgraded_from(frame)
function p.debug_validate_auto_upgraded_from(frame)
    frame = m_util.misc.get_frame(frame)
   
     local q = {}
     local q = {}
     local chk = {}
     local chk = {}
     for _, data in ipairs(c.automatic_upgraded_from) do
     for _, data in ipairs(c.automatic_recipes) do
         for _, group in ipairs(data.groups) do
         for _, group in ipairs(data.groups) do
             q[#q+1] = group.item_id
             q[#q+1] = group.item_id
             chk[group.item_id] = {
             chk[group.item_id] = {
                 amount=group.amount,
                 amount=group.amount,
                 text=data.text({}, frame),
                 text=data.text(),
             }
             }
         end
         end

Latest revision as of 15:07, 31 March 2024

Module documentation[view] [edit] [history] [purge]


Lua logo

This module depends on the following other modules:

This submodule of Module:Item2 contains configuration and functions for item recipes.


-------------------------------------------------------------------------------
-- 
-- Recipes for Module:Item2
-- 
-------------------------------------------------------------------------------

local m_util = require('Module:Util')
local m_cargo = require('Module:Cargo')

local m_game = mw.loadData('Module:Game')

-- Lazy loading
local f_modifier_link -- require('Module:Modifier link').modifier_link

-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox('Item2')

-- The cfg table contains all localisable strings and configuration, to make it
-- easier to port this module to another wiki.
local cfg = use_sandbox and mw.loadData('Module:Item2/config/sandbox') or mw.loadData('Module:Item2/config')

local i18n = cfg.i18n.recipes

-- ----------------------------------------------------------------------------
-- Helper functions 
-- ----------------------------------------------------------------------------

local h = {}

-- Lazy loading for Module:Modifier link
function h.modifier_link(args)
    if not f_modifier_link then
        f_modifier_link = require('Module:Modifier link').main
    end
    return f_modifier_link(args)
end

h.conditions = {}
h.conditions.factory = {}

function h.conditions.factory.arg(args)
    -- Required:
    --  arg: The argument to check against
    --  One must be specified
    --   value: check whether the argument equals this value
    --   values: check whether the argument is in this list of values
    --   values_assoc: check whether the argument is in this associative table
    --
    -- Optional:
    --  negate: negates the check against the value, i.e. whether the value is not equal or not in the list/table.
    args = args or {}
    
    -- Inner type of function depending on whether to check a single value, a list of values or an associative list of values
    local inner
    if args.value ~= nil then
        inner = function (tpl)
            return tpl == args.value
        end
    elseif args.values ~= nil then
        inner = function (tpl)
            for _, value in ipairs(args.values) do
                if tpl == value then
                    return true
                end
            end
            return false
        end
    elseif args.values_assoc ~= nil then
        inner = function(tpl) 
            return args.values_assoc[tpl] ~= nil
        end
    else
        error(string.format('Missing inner comparision function. Args: %s', mw.dumpObject(args)))
    end
    
    -- Outer type of function depending on whether to check a single value or against a table
    return function (tpl_args)
        local tpl_value = tpl_args[args.arg]
        local rtr
        if type(tpl_value) == 'table' then
            rtr = false
            for key, value in pairs(tpl_value) do
                if type(key) == 'number' then
                    rtr = rtr or inner(value)
                else
                    rtr = rtr or inner(key)
                end
            end
        else
            rtr = inner(tpl_value)
        end
        if args.negate then
            rtr = not rtr
        end
        return rtr
     end
end

function h.conditions.factory.not_arg(args)
    args = args or {}
    args.negate = true
    return h.conditions.factory.arg(args)
end

function h.conditions.factory.flag_is_set(args)
    return function (tpl_args)
        return tpl_args._flags[args.flag] == true
    end
end

function h.conditions.factory.acquisition_tag(args)
    return function (tpl_args)
        local negate = args.negate or false
        for _, tag in ipairs(tpl_args.acquisition_tags or {}) do
            if tag == args.tag then
                return not negate
            end
        end
        return negate
    end
end

function h.conditions.factory.drop_monsters(args)
    return function (tpl_args)
        for _, monster in ipairs(tpl_args.drop_monsters or {}) do
            if string.find(monster, args.monster, 1, true) then
                return true
            end
        end
        return false
    end
end

function h.conditions.factory.drop_rarity(args)
    return function (tpl_args)
        for _, rarity in ipairs(tpl_args.drop_rarities_ids or {}) do
            if rarity == args.rarity then
                return true
            end
        end
        return false
    end
end

h.conditions.normal = h.conditions.factory.arg{arg='rarity_id', value='normal'}
h.conditions.unique = h.conditions.factory.arg{arg='rarity_id', value='unique'}

function h.conditions.item_class_has_corrupted_implicits(tpl_args)
    local groups = {
        cfg.class_groups.weapons.keys,
        cfg.class_groups.armor.keys,
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true, ['Jewel'] = true, ['AbyssJewel'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) then
            return true
        end
    end
    return false
end

function h.conditions.item_class_has_influences(tpl_args)
    local groups = {
        cfg.class_groups.weapons.keys,
        cfg.class_groups.armor.keys,
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
            return true
        end
    end
    return false
end

function h.conditions.item_class_has_synthesised_implicits(tpl_args)
    local groups = {
        cfg.class_groups.weapons.keys,
        cfg.class_groups.armor.keys,
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true, ['Jewel'] = true, ['AbyssJewel'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
            return true
        end
    end
    return false
end

function h.conditions.item_class_has_fractured_modifiers(tpl_args)
    local groups = {
        cfg.class_groups.weapons.keys,
        cfg.class_groups.armor.keys,
        cfg.class_groups.jewellery.keys,
        {['Quiver'] = true, ['Jewel'] = true, ['Map'] = true},
    }
    for _, g in ipairs(groups) do
        if h.conditions.factory.arg{arg='class_id', values_assoc=g}(tpl_args) and h.conditions.factory.not_arg{arg='class_id', value='FishingRod'}(tpl_args) then
            return true
        end
    end
    return false
end

-- ----------------------------------------------------------------------------
-- Additional configuration
-- ----------------------------------------------------------------------------

local c = {}

-- Default for all entries, but can be disabled by specific ones.
c.automatic_recipe_defaults = {
    is_drop_restricted = h.conditions.factory.arg{arg='is_drop_restricted', value=false},
    is_corrupted = h.conditions.factory.arg{arg='is_corrupted', value=false},
    is_replica = h.conditions.factory.arg{arg='is_replica', value=false},
}
-- Order matters!
-- Put most specific outcome at the top and the least specific at the bottom.
c.automatic_recipes = {
--[[
    {
        defaults = {
            arg_key = function (tpl_args) end,
        },
        condition = {
            function (tpl_args) end,
        },
        text = '',
        groups = {
            {
                name = '',
                item_id = '',
                amount = 0,
                notes = '',
            },
        },
    },
]]
    --
    -- Automatic recipes for specific maps - reduces maintenance when a new map series is introduced
    --
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='name', values={i18n['Forge of the Phoenix Map'], i18n['Lair of the Hydra Map'], i18n['Maze of the Minotaur Map'], i18n['Pit of the Chimera Map']}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.shaper_guardian_map))
        end,
        groups = {
            {
                -- Guardian's Challenge
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGuardiansChallenge',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']},
        },
        text = function ()
            return string.format(i18n.fmt.corrupted_x, string.format(i18n.fmt.item_level_x, 83, m_util.html.poe_color('rare', i18n['Vaal Temple Map'])))
        end,
        groups = {
            {
                -- Lingering Remnants
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLingeringRemnants',
                amount = 16,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']},
        },
        text = function ()
            return string.format(i18n.fmt.corrupted_x, string.format(i18n.fmt.map_with_x_percent_delirium, string.format(i18n.fmt.tier_x, 16, m_util.html.poe_color('rare', i18n['Vaal Temple Map'])), 100))
        end,
        groups = {
            {
                -- The Price of Prescience
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfPrescience',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item', value=i18n['Synthesised Map']},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n['Synthesised Map']))
        end,
        groups = {
            {
                -- Justified Ambition
                item_id = 'Metadata/Items/DivinationCards/DivinationCardJustifiedAmbition',
                amount = 5,
            },
        },
    },
    --
    -- Item base specific
    --
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Amulets/Amulet9'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.agate_amulet))
        end,
        groups = {
            {
                -- Lysah's Respite
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLysahsRespite',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring15'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.unset_ring))
        end,
        groups = {
            {
                -- The Penitent
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThePenitent',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring4'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gold_ring))
        end,
        groups = {
            {
                -- Glimmer of Hope
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGlimmerOfHope',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring8'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.prismatic_ring))
        end,
        groups = {
            {
                -- Hope
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHope',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='metadata_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('rare', i18n.two_stone_ring))
        end,
        groups = {
            {
                -- Lantador's Lost Love
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLantadorsLostLove',
                amount = 7,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.two_stone_ring))
        end,
        groups = {
            {
                -- Heterochromia
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHeterochromia',
                amount = 2,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Weapons/OneHandWeapons/OneHandMaces/Sceptre11'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.crystal_sceptre))
        end,
        groups = {
            {
                -- Light and Truth
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLightAndTruth',
                amount = 2,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Flasks/FlaskUtility5'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.granite_flask))
        end,
        groups = {
            {
                -- Earth Drinker
                item_id = 'Metadata/Items/DivinationCards/DivinationCardEarthDrinker',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Armours/Helmets/HelmetStrDex10'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.nightmare_bascinet))
        end,
        groups = {
            {
                -- The Gladiator
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGladiator',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt1'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.rustic_sash))
        end,
        groups = {
            {
                -- The Standoff
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheStandoff',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt3'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n['Leather Belt']))
        end,
        groups = {
            {
                -- The Forgotten Treasure
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForgottenTreasure',
                amount = 6,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.timeless_jewel))
        end,
        groups = {
            {
                -- Peaceful Moments
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPeacefulMoments',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique, 
            h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.timeless_jewel))
        end,
        groups = {
            {
                -- The Eternal War
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEternalWar',
                amount = 4,
            },
        },
    },
    -- 
    -- Item name
    -- 
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.precursors_emblem))
        end,
        groups = {
            {
                -- Remembrance
                item_id = 'Metadata/Items/DivinationCards/DivinationCardRemembrance',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='name', value=i18n.grand_spectrum},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.grand_spectrum))
        end,
        groups = {
            {
                -- Divine Justice
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDivineJustice',
                amount = 1,
            },
        },
    },
    -- 
    -- Item name like
    -- 
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            function (tpl_args)
                -- Items that have "Atziri" in their name
                if string.find(tpl_args.name, i18n.atziri, 1, true) then
                    return true
                end
                -- Items that drop from Atziri
                for _, monster in ipairs(tpl_args.drop_monsters or {}) do
                    if string.find(monster, 'Metadata/Monsters/Atziri/Atziri', 1, true) then
                        return true
                    end
                end
                return false
            end,
            h.conditions.factory.not_arg{arg='class_id', value='UniqueFragment'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.atziri)))
        end,
        groups = {
            {
                -- The Admirer
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAdmirer',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.doedre, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.doedre)))
        end,
        groups = {
            {
                -- Doedre's Madness
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDoedresMadness',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.shavronne, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.shavronne)))
        end,
        groups = {
            {
                -- The Aesthete
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAesthete',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.rigwald, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.rigwald)))
        end,
        groups = {
            {
                -- The Wolf
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolf',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.lioneye, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.lioneye)))
        end,
        groups = {
            {
                -- The Lion
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLion',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.farrul, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.farrul)))
        end,
        groups = {
            {
                -- Council of Cats
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCouncilOfCats',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            function (tpl_args)
                return string.find(tpl_args.name, i18n.farrul, 1, true) or string.find(tpl_args.name, i18n.fenumus, 1, true) or string.find(tpl_args.name, i18n.saqawal, 1, true) or string.find(tpl_args.name, i18n.craiceann, 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Bestiary'].name)))
        end,
        groups = {
            {
                -- Boon of the First Ones
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBoonOfTheFirstOnes',
                amount = 6,
            },
        },
    },
    -- 
    -- Monster-specific items
    --
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/BreachBossChaos'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.chayula)))
        end,
        groups = {
            {
                -- The Dreamer
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDreamer',
                amount = 6,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Breach'].name)))
        end,
        groups = {
            {
                -- The Breach
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBreach',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/MavenBoss/TheMaven'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.maven)))
        end,
        groups = {
            {
                -- The Leviathan
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLeviathan',
                amount = 7,
            },
        },
    },
    -- 
    -- Themed/league items (acquisition tags)
    --
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = 'fishing'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.fishing)))
        end,
        groups = {
            {
                -- Baited Expectations
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBaitedExpectations',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_replica = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='is_replica', value=true},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.replica)))
        end,
        groups = {
            {
                -- The Forward Gaze
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForwardGaze',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
        end,
        groups = {
            {
                -- The Valkyrie
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheValkyrie',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name)))
        end,
        groups = {
            {
                -- The Undaunted
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheUndaunted',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Beyond'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Beyond'].name)))
        end,
        groups = {
            {
                -- The Calling
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCalling',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Delve'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Delve'].name)))
        end,
        groups = {
            {
                -- Alone in the Darkness
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAloneInTheDarkness',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Metamorph'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Metamorph'].name)))
        end,
        groups = {
            {
                -- Haunting Shadows
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHauntingShadows',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Abyss'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Abyss'].name))
        end,
        groups = {
            {
                -- Abyssal Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationAbyssStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
             -- Must have Synthesis tag, but not league-specific tag
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Synthesis'].name},
            h.conditions.factory.acquisition_tag{tag = 'league-specific', negate = true},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Synthesis'].name)))
        end,
        groups = {
            {
                -- Chasing Risk
                item_id = 'Metadata/Items/DivinationCards/DivinationCardChasingRisk',
                amount = 4,
            },
        },
    },
    --
    -- Subset of item class
    --
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
            function(tpl_args)
                -- Get Primordial modifier from stats
                if tpl_args._stats.primordial_jewel_count then
                    return true
                end
                return false
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel)))
        end,
        groups = {
            {
                -- The Primordial
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThePrimordial',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
            function(tpl_args)
                -- Get Primordial modifier from stats
                if tpl_args._stats.primordial_jewel_count then
                    return true
                end
                return false
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_one_or_two_implicit_corrupted, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel)))
        end,
        groups = {
            {
                -- A Stone Perfected
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAStonePerfected',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_talisman'},
            h.conditions.factory.arg{arg='talisman_tier', value=1},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.tier_1_talisman))
        end,
        groups = {
            {
                -- Call to the First Ones
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCallToTheFirstOnes',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.factory.flag_is_set{flag = 'is_talisman'},
        },
        text = function ()
            return string.format(i18n.fmt.random, i18n.talisman)
        end,
        groups = {
            {
                -- Primal Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationTalismansStackable',
                amount = 1,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            h.conditions.factory.arg{arg='tags', value='atziri1'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sacrifice_fragment))
        end,
        groups = {
            {
                -- Her Mask
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHerMask',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            h.conditions.factory.arg{arg='tags', value='atziri2'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.mortal_fragment))
        end,
        groups = {
            {
                -- Sambodhi's Vow
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisVow',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            function (tpl_args)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'UberElderFragment', 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.uber_elder_fragment))
        end,
        groups = {
            {
                -- The Eldritch Decay
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEldritchDecay',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            function (tpl_args)
                if tpl_args.metadata_id then
                    local patterns = {
                        'CurrencyShaperFragment',
                        'CurrencyElderFragment',
                        'CurrencySirusFragment',
                        'CurrencyVaalFragment1_',
                        'CurrencyVaalFragment2_',
                        'CurrencyOfferingToTheGoddess$',
                    }
                    for _, p in ipairs(patterns) do
                        if string.find(tpl_args.metadata_id, p) then
                            return true
                        end
                    end
                end
                return false
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.fragment))
        end,
        groups = {
            {
                -- Fragmented Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationFragmentsStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='MapFragment'},
            h.conditions.factory.arg{arg='tags', value='breachstone'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.breachstone))
        end,
        groups = {
            {
                -- The Obscured
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheObscured',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_essence'},
            h.conditions.factory.arg{arg='essence_level', value=7},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.deafening_essence), 3)
        end,
        groups = {
            {
                -- The Cacophony
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCacophony',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_essence'},
            h.conditions.factory.arg{arg='essence_level', value=6},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.shrieking_essence), 9)
        end,
        groups = {
            {
                -- Harmony of Souls
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHarmonyOfSouls',
                amount = 9,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_essence'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
        end,
        groups = {
            {
                -- Three Voices
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThreeVoices',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_essence'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3)
        end,
        groups = {
            {
                -- Infused Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationEssenceHighStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Ultimatum'].name},
        },
        text = function ()
            return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Ultimatum'].name))
        end,
        groups = {
            {
                -- Challenging Incubator (previously Morphing Incubator)
                item_id = 'Metadata/Items/Currency/CurrencyIncubationMetamorphStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.delirium_orb))
        end,
        groups = {
            {
                -- Disdain
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDisdain',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.delirium_orb), 10)
        end,
        groups = {
            {
                -- Dementophobia
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDementophobia',
                amount = 11,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_blight_item'},
            function (tpl_args)
                return tpl_args.blight_item_tier >= 1
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.oil), 10)
        end,
        groups = {
            {
                -- The Tireless Extractor
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTirelessExtractor',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            function (tpl_args)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'Metadata/Items/Currency/CurrencyIncursionVial', 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.vial), 10)
        end,
        groups = {
            {
                -- The Rabbit's Foot
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRabbitsFoot',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=5},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 5)))
        end,
        groups = {
            {
                -- Cartographer's Delight
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCartographersDelight',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=6},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 6)))
        end,
        groups = {
            {
                -- Rain Tempter
                item_id = 'Metadata/Items/DivinationCards/DivinationCardRainTempter',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=12},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 12)))
        end,
        groups = {
            {
                -- The Arena Champion
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheArenaChampion',
                amount = 10,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=14},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 14)))
        end,
        groups = {
            {
                -- The Surveyor
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurveyor',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=15},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 15)))
        end,
        groups = {
            {
                -- Lost Worlds
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLostWorlds',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=15},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 15)))
        end,
        groups = {
            {
                -- The Trial
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTrial',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=15},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map_with_y_modifiers, 15, 8)))
        end,
        groups = {
            {
                -- The Easy Stroll
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEasyStroll',
                amount = 2,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            function (tpl_args)
                return tpl_args.map_tier >= 14 and tpl_args.map_tier <= 16
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, string.format(i18n.fmt.the_price_of_protection, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_to_y_map, 14, 16))))
        end,
        groups = {
            {
                -- The Price of Protection
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfProtection',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=16},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='MapMonsterPhysicalReflection3MapWorlds'}, string.format(i18n.fmt.tier_x_map, 16))))
        end,
        groups = {
            {
                -- Azure Rage
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAzureRage',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=16},
        },
        text = function ()
            return string.format(i18n.fmt.random_unidentified_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 16)))
        end,
        groups = {
            {
                -- Left to Fate
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLeftToFate',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
            h.conditions.factory.arg{arg='map_tier', value=13},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, string.format(i18n.fmt.triskaidekaphobia, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 13))))
        end,
        groups = {
            {
                -- Triskaidekaphobia
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTriskaidekaphobia',
                amount = 13,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.aura.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.aura.tag)))
        end,
        groups = {
            {
                -- The Wilted Rose
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWiltedRose',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.golem.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.golem.tag)))
        end,
        groups = {
            {
                -- The Rite of Elements
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRiteOfElements',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.golem.tag},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_y_gem_z_quality, 21, m_game.constants.item.gem_tags.golem.tag, 23)))
        end,
        groups = {
            {
                -- Terrible Secret of Space
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTerribleSecretOfSpace',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.trap.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 21, m_game.constants.item.gem_tags.trap.tag, 23)))
        end,
        groups = {
            {
                -- Deathly Designs
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDeathlyDesigns',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.chaos.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 21, m_game.constants.item.gem_tags.chaos.tag, 23)))
        end,
        groups = {
            {
                -- The Bitter Blossom
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBitterBlossom',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.minion.tag},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, m_game.constants.item.gem_tags.minion.tag, 20)))
        end,
        groups = {
            {
                -- The Summoner
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSummoner',
                amount = 6,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.spell.tag},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 21, m_game.constants.item.gem_tags.spell.tag)))
        end,
        groups = {
            {
                --The Cataclysm
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCataclysm',
                amount = 13,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.vaal.tag},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, m_game.constants.item.gem_tags.vaal.tag, 20)))
        end,
        groups = {
            {
                -- Volatile Power
                item_id = 'Metadata/Items/DivinationCards/DivinationCardVolatilePower',
                amount = 9,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem, 21)))
        end,
        groups = {
            {
                -- The Blessing of Moosh
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBlessingOfMoosh',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 21, 23)))
        end,
        groups = {
            {
                -- The Hook
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHook',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 21, 20)))
        end,
        groups = {
            {
                -- Doryani's Epiphany
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDoryanisEpiphany',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'},
            h.conditions.factory.flag_is_set{flag = 'is_derived'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 19, 19))
        end,
        groups = {
            {
                -- Dying Anguish
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDyingAnguish',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem, m_game.constants.item.gem_tags.exceptional.tag)))
        end,
        groups = {
            {
                -- Gemcutter's Mercy
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersMercy',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_quality, m_game.constants.item.gem_tags.exceptional.tag)))
        end,
        groups = {
            {
                -- Home
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHome',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 20, i18n.support)))
        end,
        groups = {
            {
                -- Gift of the Gemling Queen
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGiftOfTheGemlingQueen',
                amount = 9,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, i18n.support, 23)))
        end,
        groups = {
            {
                -- Dialla's Subjugation
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDiallasSubjugation',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='is_awakened_support_gem', value=true},
            h.conditions.factory.arg{arg='max_level', value=5},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 6, i18n.awakened_support, 20)))
        end,
        groups = {
            {
                -- The Cheater
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCheater',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'},
            h.conditions.factory.arg{arg='is_awakened_support_gem', value=true},
            h.conditions.factory.arg{arg='max_level', value=5},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem_z_quality, 6, i18n.awakened_support, 23)))
        end,
        groups = {
            {
                -- Desecrated Virtue
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDesecratedVirtue',
                amount = 9,
            },
        },
    },
    --[[{
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
            h.conditions.factory.arg{arg='tags', value='gilded_scarab'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.gilded_scarab))
        end,
        groups = {
            {
                -- More is Never Enough
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMoreIsNeverEnough',
                amount = 7,
            },
        },
    },--]]
    --[[{
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
            h.conditions.factory.arg{arg='tags', value='jewelled_scarab'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.winged_scarab))
        end,
        groups = {
            {
                -- Rebirth and Renewal
                item_id = 'Metadata/Items/DivinationCards/DivinationCardRebirthAndRenewal',
                amount = 4,
            },
        },
    },--]]
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
        end,
        groups = {
            {
                -- Cameria's Cut
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCameriasCut',
                amount = 2,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_scarab'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.scarab))
        end,
        groups = {
            {
                -- Skittering Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationScarabsStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            h.conditions.factory.arg{arg='tags', value='breachstone_splinter'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.breachstone_splinter), 5)
        end,
        groups = {
            {
                -- The Puzzle
                item_id = 'Metadata/Items/DivinationCards/DivinationCardThePuzzle',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            h.conditions.factory.arg{arg='tags', value='quality_currency'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.quality_currency), 20)
        end,
        groups = {
            {
                -- The Master Artisan
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMasterArtisan',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_fossil'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.fossil), 5)
        end,
        groups = {
            {
                -- The Tinkerer's Table
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTinkerersTable',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.flag_is_set{flag = 'is_fossil'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.fossil))
        end,
        groups = {
            {
                -- Fossilised Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationFossilsStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='StackableCurrency'},
            function (tpl_args)
                return tpl_args.metadata_id and string.find(tpl_args.metadata_id, 'ScoutingReport', 1, true)
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.scouting_report), 20)
        end,
        groups = {
            {
                -- The Side Quest
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSideQuest',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='UniqueFragment'},
            h.conditions.factory.acquisition_tag{tag = 'Harbinger'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.harbinger_fragment))
        end,
        groups = {
            {
                -- The Messenger
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMessenger',
                amount = 4,
            },
        },
    },
    --
    -- Single item class
    --
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.body_armour))
        end,
        groups = {
            {
                -- The Body
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBody',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Shield'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.shield))
        end,
        groups = {
            {
                -- The Mercenary
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMercenary',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Shield'},
        },
        text = function ()
            return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('normal', i18n.shield))
        end,
        groups = {
            {
                -- Astral Protection
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAstralProtection',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Helmet'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('magic', i18n.helmet))
        end,
        groups = {
            {
                -- Further Invention
                item_id = 'Metadata/Items/DivinationCards/DivinationCardFurtherInvention',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Helmet'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_veiled, m_util.html.poe_color('rare', i18n.helmet))
        end,
        groups = {
            {
                -- The Journalist
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJournalist',
                amount = 10,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Claw'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.claw))
        end,
        groups = {
            {
                -- The Wolverine
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolverine',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values={'Dagger', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.dagger))
        end,
        groups = {
            {
                -- Assassin's Favour
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAssassinsFavour',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Sceptre'},
        },
        text = function ()
            return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('magic', string.format('%s %s', i18n.sceptre, h.modifier_link{id='LocalIncreasedAttackSpeed8'})))
        end,
        groups = {
            {
                -- The Lord of Celebration
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordOfCelebration',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Bow'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.bow))
        end,
        groups = {
            {
                -- Hunter's Resolve
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHuntersResolve',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewel))
        end,
        groups = {
            {
                -- The Garish Power
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGarishPower',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.jewel))
        end,
        groups = {
            {
                -- The Eye of the Dragon
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEyeOfTheDragon',
                amount = 10,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='PercentIncreasedLifeJewel'}, i18n.jewel)))
        end,
        groups = {
            {
                -- Shard of Fate
                item_id = 'Metadata/Items/DivinationCards/DivinationCardShardOfFate',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewel, h.modifier_link{id='CriticalStrikeMultiplierJewel'})))
        end,
        groups = {
            {
                -- The Mountain
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMountain',
                amount = 6,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Jewel'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted_implicit, m_util.html.poe_color('rare', i18n.jewel), h.modifier_link{id='V2CorruptedBloodImmunityCorrupted'})
        end,
        groups = {
            {
                -- Lachrymal Necrosis
                item_id = 'Metadata/Items/DivinationCards/DivinationCardLachrymalNecrosis',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Amulet'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='IncreasedEnergyShieldPercent7'}, i18n.amulet)))
        end,
        groups = {
            {
                -- The Sigil
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSigil',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Amulet'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.amulet))
        end,
        groups = {
            {
                -- The Warden
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWarden',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Ring'},
            function (tpl_args)
                return tpl_args.drop_level <= 83
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('magic', string.format('%s %s', i18n.ring, h.modifier_link{id='ChaosResist6'})))
        end,
        groups = {
            {
                -- The Lord in Black
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordInBlack',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Ring'},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.ring))
        end,
        groups = {
            {
                -- The Opulent
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheOpulecent',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Ring'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.ring))
        end,
        groups = {
            {
                -- Hubris
                item_id = 'Metadata/Items/DivinationCards/DivinationCardHubris',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Ring'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.ring))
        end,
        groups = {
            {
                -- Blind Venture
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBlindVenture',
                amount = 7,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Belt'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.belt))
        end,
        groups = {
            {
                -- The Wretched
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWretched',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Belt'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.belt))
        end,
        groups = {
            {
                -- The Dungeon Master
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDungeonMaster',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Map'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.map))
        end,
        groups = {
            {
                -- The Encroaching Darkness
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEncroachingDarkness',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Map'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.map))
        end,
        groups = {
            {
                -- Otherworldly Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueMapsStackable',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Wand'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.wand))
        end,
        groups = {
            {
                -- The Traitor
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTraitor',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.staff))
        end,
        groups = {
            {
                -- The Tower
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTower',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
            h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets
            function (tpl_args)
                return tpl_args.drop_level <= 66
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link_item_level_y, 5, 66, m_util.html.poe_color('normal', i18n.staff))
        end,
        groups = {
            {
                -- The Flora's Gift
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFlorasGift',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}},
            h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets
            function (tpl_args)
                return tpl_args.drop_level <= 55
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link_item_level_y, 6, 55, m_util.html.poe_color('normal', i18n.staff))
        end,
        groups = {
            {
                -- The Dark Mage
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDarkMage',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link_item_level_y, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
        end,
        groups = {
            {
                -- The Dapper Prodigy
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDapperProdigy',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link_item_level_y_random_influenced, 6, 100, m_util.html.poe_color('normal', i18n.body_armour))
        end,
        groups = {
            {
                -- Draped in Dreams
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDrapedInDreams',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
        end,
        groups = {
            {
                -- The Chains that Bind
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheChainsThatBind',
                amount = 11,
            },
        },
    },
    {
        condition = {
            h.conditions.normal, 
            h.conditions.factory.arg{arg='class_id', value='Body Armour'}, 
        },
        text = function ()
            return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour))
        end,
        groups = {
            {
                -- Geomancer's Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationArmour6LinkedStackable',
                amount = 1,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.body_armour))
        end,
        groups = {
            {
                -- Destined to Crumble
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDestinedToCrumble',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Body Armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.body_armour))
        end,
        groups = {
            {
                -- Duality
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDuality',
                amount = 2,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.map))
        end,
        groups = {
            {
                -- Boundless Realms
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBoundlessRealms',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='Map'},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.map))
        end,
        groups = {
            {
                -- The Explorer
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheExplorer',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Gloves'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gloves))
        end,
        groups = {
            {
                -- Mitts
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMitts',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', value='Boots'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted, string.format(i18n.fmt.item_level_x, 100, m_util.html.poe_color('unique', i18n.boots)))
        end,
        groups = {
            {
                -- The Shepherd's Sandals
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheShepherdsSandals',
                amount = 3,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
        end,
        groups = {
            {
                -- The Gambler
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGambler',
                item_page = 'The Gambler', -- These need to be specified so that The Gambler can be a recipe for itself while saving itself.
                item_name = 'The Gambler',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='DivinationCard'},
            h.conditions.factory.not_arg{arg='tags', value='boss_drop_card'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('divination', i18n.divination_card))
        end,
        groups = {
            {
                -- Stacked Deck
                item_id = 'Metadata/Items/DivinationCards/DivinationCardDeck',
                amount = 1,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='HeistBlueprint'},
        },
        text = function ()
            return string.format(i18n.fmt.random, string.format(i18n.fmt.fully_revealed_x_area_level_y, m_util.html.poe_color('normal', i18n.blueprint), 83))
        end,
        groups = {
            {
                -- Something Dark
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSomethingDark',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', value='IncubatorStackable'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_amount, string.format(i18n.fmt.item_level_x, 84, m_util.html.poe_color('currency', i18n.incubator)), 10)
        end,
        groups = {
            {
                -- Parasitic Passengers
                item_id = 'Metadata/Items/DivinationCards/DivinationCardParasiticPassengers',
                amount = 8,
            },
        },
    },
    --
    -- Multiple item classes
    --
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values={'One Hand Axe', 'Two Hand Axe'}},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.axe))
        end,
        groups = {
            {
                -- The Battle Born
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBattleBorn',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
            h.conditions.factory.arg{arg='max_level', value=20},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_gem, 20)))
        end,
        groups = {
            {
                -- The Fox
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFox',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.gem_x_quality, 20)))
        end,
        groups = {
            {
                -- Gemcutter's Promise
                item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersPromise',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('gem', i18n.fmt.gem_quality))
        end,
        groups = {
            {
                -- Gemcutter's Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationGemLowStackable',
                amount = 1,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_quality, m_util.html.poe_color('unique', i18n.armour), 30)
        end,
        groups = {
            {
                -- Sambodhi's Wisdom
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisWisdom',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
            h.conditions.factory.arg{arg='tags', value='int_armour'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedEnergyShieldPercentAndStunRecovery6'}, i18n.armour)))
        end,
        groups = {
            {
                -- The Inoculated
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheInoculated',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.life, i18n.armour)))
        end,
        groups = {
            {
                -- The Carrion Crow
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCarrionCrow',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_shaper_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery))
        end,
        groups = {
            {
                -- Perfection
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPerfection',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewellery))
        end,
        groups = {
            {
                -- The Cache
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCache',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 86, m_util.html.poe_color('rare', i18n.jewellery))
        end,
        groups = {
            {
                -- The Awakened
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAwakened',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
            function (tpl_args)
                return tpl_args.drop_level <= 79
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 79, m_util.html.poe_color('rare', i18n.jewellery))
        end,
        groups = {
            {
                -- The Lover
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLover',
                amount = 2,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
            function (tpl_args)
                return tpl_args.drop_level <= 85
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 85, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='ReduceGlobalFlatManaCostStrIntMasterVendor'}, i18n.jewellery)))
        end,
        groups = {
            {
                -- Blessing of God
                item_id = 'Metadata/Items/DivinationCards/DivinationCardBlessingOfGod',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
            function (tpl_args)
                return tpl_args.drop_level <= 76
            end,
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 76, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='AddedLightningDamage9'}, i18n.jewellery)))
        end,
        groups = {
            {
                -- Struck by Lightning
                item_id = 'Metadata/Items/DivinationCards/DivinationCardStruckByLightning',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_shaper_hunter_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewellery, h.modifier_link{id='GrantsCatAspectCrafted'})))
        end,
        groups = {
            {
                -- A Familiar Call
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAFamiliarCall',
                amount = 3,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery))
        end,
        groups = {
            {
                -- Imperfect Memories
                item_id = 'Metadata/Items/DivinationCards/DivinationCardImperfectMemories',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Two Hand Sword', 'Two Hand Axe', 'Two Hand Mace', 'Staff', 'Bow', 'Warstaff'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.two_hand_weapon)))
        end,
        groups = {
            {
                -- Merciless Armament
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMercilessArmament',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('rare', i18n.one_hand_weapon))
        end,
        groups = {
            {
                -- Prometheus' Armoury
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPrometheusArmoury',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.one_hand_weapon)))
        end,
        groups = {
            {
                -- The Jester
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJester',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values={'Sceptre', 'Wand', 'Rune Dagger'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='SpellDamageOnWeapon8_'}, i18n.one_hand_weapon)))
        end,
        groups = {
            {
                -- The Road to Power
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRoadToPower',
                amount = 7,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values={'Thrusting One Hand Sword', 'One Hand Sword', 'Two Hand Sword'}},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.sword))
        end,
        groups = {
            {
                -- The Gentleman
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGentleman',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('magic',string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.weapon)))
        end,
        groups = {
            {
                -- The Tyrant
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTyrant',
                amount = 9,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.weapon, h.modifier_link{id='StrIntMasterItemGenerationCanHaveMultipleCraftedMods'})))
        end,
        groups = {
            {
                -- The Web
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWeb',
                amount = 8,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.weapon))
        end,
        groups = {
            {
                -- Atziri's Arsenal
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAtzirisArsenal',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.flasks.keys},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='FlaskChanceRechargeOnCrit5'}, i18n.flask)))
        end,
        groups = {
            {
                -- The Surgeon
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurgeon',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.factory.arg{arg='tags', value='two_hand_weapon'},
            h.conditions.factory.acquisition_tag{tag = 'experimented base type'},
        },
        text = function ()
            return string.format(i18n.fmt.random_x_quality, string.format(i18n.fmt.item_level_x, 86, m_util.html.poe_color('rare', i18n.experimented_two_hand_weapon)), 30)
        end,
        groups = {
            {
                -- Soul Quenched
                item_id = 'Metadata/Items/DivinationCards/DivinationCardSoulQuenched',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_drop_restricted = false,
        },
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
            h.conditions.factory.acquisition_tag{tag = 'experimented base type'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.experimented_base_type))
        end,
        groups = {
            {
                -- Auspicious Ambitions
                item_id = 'Metadata/Items/DivinationCards/DivinationCardAuspiciousAmbitions',
                amount = 4,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_corrupted_implicits,
            h.conditions.item_class_has_influences,
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted_two_influenced_item_level_x, 97, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Fateful Meeting
                item_id = 'Metadata/Items/DivinationCards/DivinationCardFatefulMeeting',
                amount = 9,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique, 
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Time-Lost Relic
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTimeLostRelic',
                amount = 10,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique, 
            h.conditions.factory.acquisition_tag{tag = 'league-specific'},
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.league_specific_item))
        end,
        groups = {
            {
                -- Time-Lost Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueLeagueStackable',
                amount = 1,
            },
        },
    },
    --
    -- Generic items
    --
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_fractured_modifiers,
        },
        text = function ()
            return string.format(i18n.fmt.random_fractured_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
        end,
        groups = {
            {
                -- A Dusty Memory
                item_id = 'Metadata/Items/DivinationCards/DivinationCardADustyMemory',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_elder_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
        end,
        groups = {
            {
                -- The Hale Heart
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHaleHeart',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Prejudice
                item_id = 'Metadata/Items/DivinationCards/DivinationCardPrejudice',
                amount = 7,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Costly Curio
                item_id = 'Metadata/Items/DivinationCards/DivinationCardCostlyCurio',
                amount = 6,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_influences,
        },
        text = function ()
            return string.format(i18n.fmt.random_influenced_x_elevated, m_util.html.poe_color('magic', i18n.item))
        end,
        groups = {
            {
                -- The Aspirant
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAspirant',
                amount = 5,
            },
        },
    },
    {
        condition = {
            h.conditions.normal,
            h.conditions.item_class_has_synthesised_implicits,
        },
        text = function ()
            return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('normal', i18n.item))
        end,
        groups = {
            {
                -- Magnum Opus
                item_id = 'Metadata/Items/DivinationCards/DivinationCardMagnumOpus',
                amount = 5,
            },
        },
    },
    {
        defaults = {
            is_corrupted = false,
        },
        condition = {
            h.conditions.unique,
            h.conditions.item_class_has_corrupted_implicits,
        },
        text = function ()
            return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Arrogance of the Vaal
                item_id = 'Metadata/Items/DivinationCards/DivinationCardArroganceOfTheVaal',
                amount = 8,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Jack in the Box
                item_id = 'Metadata/Items/DivinationCards/DivinationCardJackInTheBox',
                amount = 4,
            },
        },
    },
    {
        condition = {
            h.conditions.unique,
        },
        text = function ()
            return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
        end,
        groups = {
            {
                -- Singular Incubator
                item_id = 'Metadata/Items/Currency/CurrencyIncubationUniquesStackable',
                amount = 1,
            },
        },
    },
}

-- ----------------------------------------------------------------------------
-- Exported functions
-- ----------------------------------------------------------------------------

local p = {}

function p.process_recipes(tpl_args)
    local query_data = {
        id = {},
        name = {},
        page = {},
    }
    local sets = {}
    
    -- ------------------------------------------------------------------------
    -- Manual data
    -- ------------------------------------------------------------------------
    local setid = #sets + 1
    local set
    repeat
        local prefix = string.format('recipe%s_', setid)
        local groupid = 1
        local group
        set = {
            groups = {},
            result_amount = tonumber(tpl_args[prefix .. 'result_amount']) or 1,
            text = m_util.cast.text(tpl_args[prefix .. 'description']),
            automatic = false,
        }
        repeat 
            local group_prefix = string.format('%spart%s_', prefix, groupid)
            group = {
                item_name = tpl_args[group_prefix .. 'item_name'],
                item_id = tpl_args[group_prefix .. 'item_id'], 
                item_page = tpl_args[group_prefix .. 'item_page'], 
                amount = tonumber(tpl_args[group_prefix .. 'amount']),
                notes = m_util.cast.text(tpl_args[group_prefix .. 'notes']),
            }
            
            if group.item_name ~= nil or group.item_id ~= nil or group.item_page ~= nil then
                if group.amount == nil then
                    error(string.format(i18n.errors.missing_amount, group_prefix .. 'amount'))
                else
                    for key, array in pairs(query_data) do
                        local value = group['item_' .. key]
                        if value then
                            if array[value] then
                                table.insert(array[value], {setid, groupid})
                            else
                                array[value] = {{setid, groupid}, }
                            end
                        end
                    end
                    set.groups[#set.groups+1] = group
                end
            end
            
            groupid = groupid + 1
        until group.item_name == nil and group.item_id == nil and group.item_page == nil
        
        -- set was empty, can terminate safely
        if #set.groups == 0 then
            set = nil
        else
            setid = setid + 1
            sets[#sets+1] = set
        end
    until set == nil

    -- ------------------------------------------------------------------------
    -- Automatic
    -- ------------------------------------------------------------------------
    
    --
    --  maps
    --
    local automatic_index = #sets + 1
    -- TODO: 3.9.0 Unsure how this works yet, so disabled for now
    --[[if tpl_args.atlas_connections and tpl_args.rarity_id == 'normal' then
        local results = m_cargo.query(
            {'items', 'maps'},
            {'items._pageName',  'items.name'},
            {
                join='items._pageID=maps._pageID',
                where=string.format('items.class_id = "Map" AND items.rarity_id = "normal" AND maps.tier < %s AND items._pageName IN ("%s")', tpl_args.map_tier, table.concat(tpl_args.atlas_connections, '", "')),
            }
        )
        for _, row in ipairs(results) do
            sets[#sets+1] = {
                text = i18n.misc.upgraded_from_map,
                result_amount = 1,
                groups = {
                    {
                        item_name = row['items.name'],
                        item_page = row['items._pageName'],
                        amount = 3,
                        notes = nil,
                    },
                },
                automatic = true,
            }
        end
    end]]
    
    --
    -- oils
    --
    if tpl_args._flags.is_blight_item and tpl_args.blight_item_tier > 1 then
        local results = m_cargo.query(
            {'items', 'blight_items'},
            {'items._pageName',  'items.name'},
            {
                join='items._pageID=blight_items._pageID',
                where=string.format('blight_items.tier = %s', tpl_args.blight_item_tier - 1),
            }
        )
        for _, row in ipairs(results) do
            sets[#sets+1] = {
                text = nil,
                result_amount = 1,
                groups = {
                    {
                        item_name = row['items.name'],
                        item_page = row['items._pageName'],
                        amount = 3,
                        notes = nil,
                    },
                },
                automatic = true,
            }
        end
    end
    
    
    --
    -- essences
    --
    
    -- exclude remnant of corruption via type
    if tpl_args._flags.is_essence and tpl_args.essence_type > 0 then 
        local results = m_cargo.query(
            {'items', 'essences'},
            {
                'items._pageName',  
                'items.name', 
                'items.metadata_id',
                'essences.category',
                'essences.type',
            },
            {
                join='items._pageID=essences._pageID',
                where=string.format([[
                        (essences.category="%s" AND essences.level = %s)
                        OR (essences.type = %s AND essences.level = %s)
                        OR items.metadata_id = 'Metadata/Items/Currency/CurrencyCorruptMonolith'
                        OR (%s = 6 AND essences.type = 5 AND essences.level >= 5) 
                    ]], 
                    tpl_args.essence_category, tpl_args.essence_level - 1, 
                    tpl_args.essence_type - 1, tpl_args.essence_level,
                    -- special case for corruption only essences
                    tpl_args.essence_type
                ),
                orderBy='essences.level ASC, essences.type ASC',
            }
        )
        
        local remnant = results[1]
        if remnant['items.metadata_id'] ~= 'Metadata/Items/Currency/CurrencyCorruptMonolith' then
            error(string.format('Something went seriously wrong here. Got results: %s', mw.dumpObject(results)))
        end
        for i=2, #results do
            local row = results[i]
            if row['essences.category'] == tpl_args.essence_category then
                -- 3 to 1 recipe
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = nil,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 3,
                        },
                    },
                }
                -- corruption +1
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.essence_plus_one_level,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 1,
                        },
                        {
                            item_id = remnant['items.metadata_id'],
                            item_page = remnant['items._pageName'],
                            item_name = remnant['items.name'],
                            amount = 1,
                        },
                    },
                }
            elseif tonumber(row['essences.type']) == tpl_args.essence_type - 1 then
                -- corruption type change
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.essence_type_change,
                    groups = {
                        {
                            item_id = row['items.metadata_id'],
                            item_page = row['items._pageName'],
                            item_name = row['items.name'],
                            amount = 1,
                        },
                        {
                            item_id = remnant['items.metadata_id'],
                            item_page = remnant['items._pageName'],
                            item_name = remnant['items.name'],
                            amount = 1,
                        },
                    },
                }
            end
        end
    end
    
    -- data based on mapping
    if tpl_args.drop_enabled and not tpl_args.disable_automatic_recipes then
        for _, data in ipairs(c.automatic_recipes) do
            data.defaults = data.defaults or {}
            local continue = true
            for key, value in pairs(c.automatic_recipe_defaults) do
                local func
                local v = data.defaults[key]
                if v == false then
                    -- check is disabled specifically, continue
                elseif v == nil then
                    func = value
                elseif type(v) == 'function' then
                    func = v
                else 
                    error(string.format('Invalid value for defaults at data %s', mw.dumpObject(data)))
                end
                if func then
                    continue = func(tpl_args) and continue
                    if not continue then
                        break
                    end 
                end
            end
            for _, condition in ipairs(data.condition) do
                continue = condition(tpl_args) and continue
                if not continue then
                    break
                end
            end
            
            if continue then
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = data.text(),
                    groups = data.groups,
                }
                for groupid, row in ipairs(data.groups) do
                    if query_data['id'][row.item_id] then
                        table.insert(query_data['id'][row.item_id], {#sets, groupid})
                    else
                        query_data['id'][row.item_id] = {{#sets, groupid}, }
                    end
                end
            end
        end
    end
    
    if #sets == 0 then
        return
    end
    --
    -- Fetch item data in a single query to sacrifice database load with a lot of references
    --
    local query_data_array = {
        id = {},
        name = {},
        page = {},
    }
    local query_fields = {
        id = 'items.metadata_id',
        page = 'items._pageName',
        name = 'items.name',
    }
    local where = {}
    local expected_count = 0
    for key, thing_array in pairs(query_data) do
        for thing, _ in pairs(thing_array) do
            table.insert(query_data_array[key], thing)
        end
        if #query_data_array[key] > 0 then
            expected_count = expected_count + #query_data_array[key]
            local q_data = table.concat(query_data_array[key], '", "')
            table.insert(where, string.format('%s IN ("%s")', query_fields[key], q_data))
        end
    end
    local results = m_cargo.query(
        {'items'},
        {'items._pageName',  'items.name', 'items.metadata_id'},
        {
            where=table.concat(where, ' OR '),
        }
    )

    -- Now do The Void
    for _, row in ipairs(results) do
        if row[query_fields.id] and string.find(row[query_fields.id], 'Metadata/Items/DivinationCards/', 1, true) then
            local group = {
                item_id = 'Metadata/Items/DivinationCards/DivinationCardTheVoid',
                amount = 1,
            }
            local result = m_cargo.query(
                {'items'},
                {'items._pageName',  'items.name', 'items.metadata_id'},
                {
                    where=string.format('%s = "%s"', query_fields.id, group.item_id),
                }
            )
            if #result > 0 then
                sets[#sets+1] = {
                    automatic = true,
                    result_amount = 1,
                    text = i18n.the_void,
                    groups = {group},
                }
                if query_data['id'][group.item_id] then
                    table.insert(query_data['id'][group.item_id], {#sets, 1})
                else
                    query_data['id'][group.item_id] = {{#sets, 1}, }
                end
                table.insert(results, result[1])
            end
            break
        end
    end

    for _, row in ipairs(results) do
        for key, thing_array in pairs(query_data) do
            local set_groups = thing_array[row[query_fields[key]]]
            if set_groups then
                for _, set_group in ipairs(set_groups) do
                    local entry = sets[set_group[1]].groups[set_group[2]]
                    for entry_key, data_key in pairs(query_fields) do
                        -- metadata_id may be nil, since we don't know them for unique items
                        if row[data_key] then
                            entry['item_' .. entry_key] = row[data_key]
                        end
                    end
                end
                -- set this to nil for error checking in later step
                thing_array[row[query_fields[key]]] = nil
            end
        end
    end
    
    -- sbow the broken references if needed
    if #results ~= expected_count then
        -- query data was pruned of existing keys earlier, so only broken keys remain
        for key, array in pairs(query_data) do
            for thing, set_groups in pairs(array) do
                for _, set_group in ipairs(set_groups) do
                    tpl_args._flags.invalid_recipe_parts = true
                    tpl_args._errors[#tpl_args._errors+1] = m_util.string.format(i18n.errors.invalid_recipe_parts, string.format('recipe%s_part%s_item_%s', set_group[1], set_group[2], key), thing)
                end
            end
        end
    end
    
    --
    -- Check for duplicates
    --
    local delete_sets = {}
    for i=automatic_index, #sets do
        for j=1, automatic_index-1 do
            if #sets[i].groups == #sets[j].groups then
                local match = true
                for row_id, row in ipairs(sets[i].groups) do
                    -- Only the fields from the database query are matched since we can be sure they're correct. Other fields may be subject to user error.
                    for _, key in ipairs({'item_id', 'item_name', 'item_page'})  do
                        match = match and (row[key] == sets[j].groups[row_id][key])
                    end
                end
                if match then
                    tpl_args._flags.duplicate_recipes = true
                    tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.duplicate_recipes, j)
                    delete_sets[#delete_sets+1] = j 
                end
            end
        end
    end
    
    for offset, index in ipairs(delete_sets) do
        table.remove(sets, index-(offset-1))
    end
    --
    -- Set data
    -- 
    tpl_args.recipes = sets
    
    -- set recipes data
    for i, set in ipairs(sets) do
        table.insert(tpl_args._store_data, {
            _table = 'acquisition_recipes',
            recipe_id = i,
            result_amount = set.result_amount,
            description = set.text,
            automatic = set.automatic,
        })
        for j, group in ipairs(set.groups) do
            table.insert(tpl_args._store_data, {
                _table = 'acquisition_recipe_parts',
                part_id = j,
                recipe_id = i,
                item_name = group.item_name,
                item_id = group.item_id,
                item_page = group.item_page,
                amount = group.amount,
                notes = group.notes,
            })
        end
    end
end

--
-- Debugging
--

function p.debug_validate_auto_upgraded_from(frame)
    local q = {}
    local chk = {}
    for _, data in ipairs(c.automatic_recipes) do
        for _, group in ipairs(data.groups) do
            q[#q+1] = group.item_id
            chk[group.item_id] = {
                amount=group.amount,
                text=data.text(),
            }
        end
    end
    
    local results = m_cargo.array_query{
        tables={'items', 'stackables'},
        fields={'items.name', 'items.class_id', 'items.description', 'stackables.stack_size'},
        id_field='items.metadata_id',
        id_array=q,
        query={
            join='items._pageName=stackables._pageName',
        },
    }
    
    for _, row in ipairs(results) do
        if row['items.class_id'] == 'DivinationCard' and chk[row['items.metadata_id']].amount ~= tonumber(row['stackables.stack_size']) then
            mw.logObject(string.format('Amount mismatch %s, expected %s', row['items.metadata_id'], row['stackables.stack_size']))
        end
    end
    
    tbl = mw.html.create('table')
    tbl:attr('class', 'wikitable sortable')
    for _, row in ipairs(results) do
        tbl
            :tag('tr')
                :tag('td')
                    :wikitext(row['items.name'])
                    :done()
                :tag('td')
                    :wikitext(chk[row['items.metadata_id']].text)
                    :done()
                :tag('td')
                    :wikitext(row['items.description'])
                    :done()
                :done()
    end
    
    return tostring(tbl)
end

return p