Module:Item/recipes: Difference between revisions
Jump to navigation
Jump to search
m (Repositioned rule for recipes using Temperance. It belongs in the "single item class" grouping.) |
(Refactored for better readability and performance. Added automatic recipe conditions that check drop level. Fixed automatic recipes using The Obscured.) |
||
| Line 143: | Line 143: | ||
end | end | ||
h.conditions. | function h.conditions.factory.drop_level_not_greater_than(args) | ||
return function (tpl_args) | |||
if tpl_args.drop_level == nil then | |||
return true | |||
end | |||
return tpl_args.drop_level <= args.level | |||
end | |||
end | |||
function h.conditions.item_class_has_corrupted_implicits(tpl_args) | function h.conditions.item_class_has_corrupted_implicits(tpl_args) | ||
| Line 212: | Line 218: | ||
local c = {} | local c = {} | ||
c.named_conditions = { | |||
is_normal = h.conditions.factory.arg{arg='rarity_id', value='normal'}, | |||
is_unique = h.conditions.factory.arg{arg='rarity_id', value='unique'}, | |||
is_not_drop_restricted = h.conditions.factory.arg{arg='is_drop_restricted', value=false}, | |||
is_not_corrupted = h.conditions.factory.arg{arg='is_corrupted', value=false}, | |||
is_not_replica = h.conditions.factory.arg{arg='is_replica', value=false}, | |||
drop_level_ngt_divcard_default_max_ilvl = h.conditions.factory.drop_level_not_greater_than{level=cfg.divination_card_exchange_default_max_ilvl}, | |||
item_class_has_corrupted_implicits = h.conditions.item_class_has_corrupted_implicits, | |||
item_class_has_influences = h.conditions.item_class_has_influences, | |||
item_class_has_synthesised_implicits = h.conditions.item_class_has_synthesised_implicits, | |||
item_class_has_fractured_modifiers = h.conditions.item_class_has_fractured_modifiers, | |||
} | } | ||
-- Order matters! | -- Order matters! | ||
| Line 223: | Line 235: | ||
--[[ | --[[ | ||
{ | { | ||
conditions = { | |||
function (tpl_args) end, | function (tpl_args) end, | ||
}, | }, | ||
text = '', | text = '', | ||
parts = { | |||
{ | { | ||
name = '', | name = '', | ||
| Line 244: | Line 253: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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']}}, | 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']}}, | ||
}, | }, | ||
| Line 251: | Line 262: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.shaper_guardian_map)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.shaper_guardian_map)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Guardian's Challenge | -- Guardian's Challenge | ||
| Line 260: | Line 271: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']}, | h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']}, | ||
h.conditions.factory.drop_level_not_greater_than{level=83}, | |||
}, | }, | ||
text = function () | 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']))) | 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, | ||
parts = { | |||
{ | { | ||
-- Lingering Remnants | -- Lingering Remnants | ||
| Line 279: | Line 289: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']}, | h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']}, | ||
}, | }, | ||
| Line 289: | Line 297: | ||
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)) | 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, | ||
parts = { | |||
{ | { | ||
-- The Price of Prescience | -- The Price of Prescience | ||
| Line 298: | Line 306: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
h.conditions.factory.arg{arg='base_item', value=i18n['Synthesised Map']}, | h.conditions.factory.arg{arg='base_item', value=i18n['Synthesised Map']}, | ||
}, | }, | ||
| Line 309: | Line 314: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n['Synthesised Map'])) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n['Synthesised Map'])) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Justified Ambition | -- Justified Ambition | ||
| Line 321: | Line 326: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Amulets/Amulet9'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Amulets/Amulet9'}, | ||
}, | }, | ||
| Line 331: | Line 334: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.agate_amulet)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.agate_amulet)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Lysah's Respite | -- Lysah's Respite | ||
| Line 340: | Line 343: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring15'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring15'}, | ||
}, | }, | ||
| Line 347: | Line 352: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.unset_ring)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.unset_ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Penitent | -- The Penitent | ||
| Line 356: | Line 361: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring4'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring4'}, | ||
}, | }, | ||
| Line 363: | Line 370: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gold_ring)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gold_ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Glimmer of Hope | -- Glimmer of Hope | ||
| Line 372: | Line 379: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring8'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Rings/Ring8'}, | ||
}, | }, | ||
| Line 382: | Line 387: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.prismatic_ring)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.prismatic_ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Hope | -- Hope | ||
| Line 391: | Line 396: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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='metadata_id', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}}, | ||
}, | }, | ||
| Line 398: | Line 405: | ||
return string.format(i18n.fmt.random_variant, m_util.html.poe_color('rare', i18n.two_stone_ring)) | return string.format(i18n.fmt.random_variant, m_util.html.poe_color('rare', i18n.two_stone_ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Lantador's Lost Love | -- Lantador's Lost Love | ||
| Line 407: | Line 414: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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', values={'Metadata/Items/Rings/Ring12', 'Metadata/Items/Rings/Ring13', 'Metadata/Items/Rings/Ring14'}}, | ||
}, | }, | ||
| Line 414: | Line 423: | ||
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.two_stone_ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Heterochromia | -- Heterochromia | ||
| Line 423: | Line 432: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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/Weapons/OneHandWeapons/OneHandMaces/Sceptre11'}, | ||
}, | }, | ||
| Line 430: | Line 441: | ||
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.crystal_sceptre)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Light and Truth | -- Light and Truth | ||
| Line 439: | Line 450: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Flasks/FlaskUtility5'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Flasks/FlaskUtility5'}, | ||
}, | }, | ||
| Line 446: | Line 459: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.granite_flask)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.granite_flask)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Earth Drinker | -- Earth Drinker | ||
| Line 455: | Line 468: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Armours/Helmets/HelmetStrDex10'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Armours/Helmets/HelmetStrDex10'}, | ||
}, | }, | ||
| Line 462: | Line 477: | ||
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('unique', i18n.nightmare_bascinet)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Gladiator | -- The Gladiator | ||
| Line 471: | Line 486: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt1'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt1'}, | ||
}, | }, | ||
| Line 478: | Line 495: | ||
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.rustic_sash)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Standoff | -- The Standoff | ||
| Line 487: | Line 504: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt3'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Belts/Belt3'}, | ||
}, | }, | ||
| Line 494: | Line 513: | ||
return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n['Leather Belt'])) | return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n['Leather Belt'])) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Forgotten Treasure | -- The Forgotten Treasure | ||
| Line 503: | Line 522: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'}, | ||
}, | }, | ||
| Line 513: | Line 531: | ||
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.timeless_jewel)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Peaceful Moments | -- Peaceful Moments | ||
| Line 522: | Line 540: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'}, | h.conditions.factory.arg{arg='base_item_id', value='Metadata/Items/Jewels/JewelTimeless'}, | ||
}, | }, | ||
| Line 532: | Line 549: | ||
return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.timeless_jewel)) | return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.timeless_jewel)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Eternal War | -- The Eternal War | ||
| Line 544: | Line 561: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem}, | h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem}, | ||
}, | }, | ||
| Line 555: | Line 569: | ||
return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.precursors_emblem))) | return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.precursors_emblem))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Remembrance | -- Remembrance | ||
| Line 564: | Line 578: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
h.conditions.factory.arg{arg='name', value=i18n.grand_spectrum}, | h.conditions.factory.arg{arg='name', value=i18n.grand_spectrum}, | ||
}, | }, | ||
| Line 575: | Line 586: | ||
return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.grand_spectrum))) | return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.grand_spectrum))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Divine Justice | -- Divine Justice | ||
| Line 587: | Line 598: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | function (tpl_args) | ||
-- Items that have "Atziri" in their name | -- Items that have "Atziri" in their name | ||
| Line 610: | Line 620: | ||
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', string.format(i18n.fmt.x_item, i18n.atziri))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Admirer | -- The Admirer | ||
| Line 619: | Line 629: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | function (tpl_args) | ||
return string.find(tpl_args.name, i18n.doedre, 1, true) | return string.find(tpl_args.name, i18n.doedre, 1, true) | ||
| Line 628: | Line 640: | ||
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, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.doedre))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Doedre's Madness | -- Doedre's Madness | ||
| Line 637: | Line 649: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | function (tpl_args) | ||
return string.find(tpl_args.name, i18n.shavronne, 1, true) | return string.find(tpl_args.name, i18n.shavronne, 1, true) | ||
| Line 646: | Line 660: | ||
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, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.shavronne))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Aesthete | -- The Aesthete | ||
| Line 655: | Line 669: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
function (tpl_args) | function (tpl_args) | ||
return string.find(tpl_args.name, i18n.rigwald, 1, true) | return string.find(tpl_args.name, i18n.rigwald, 1, true) | ||
| Line 668: | Line 679: | ||
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, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.rigwald))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Wolf | -- The Wolf | ||
| Line 677: | Line 688: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | function (tpl_args) | ||
return string.find(tpl_args.name, i18n.lioneye, 1, true) | return string.find(tpl_args.name, i18n.lioneye, 1, true) | ||
| Line 686: | Line 699: | ||
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.lioneye))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Lion | -- The Lion | ||
| Line 695: | Line 708: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | function (tpl_args) | ||
return string.find(tpl_args.name, i18n.farrul, 1, true) | return string.find(tpl_args.name, i18n.farrul, 1, true) | ||
| Line 707: | Line 719: | ||
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.farrul))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Council of Cats | -- Council of Cats | ||
| Line 716: | Line 728: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
function (tpl_args) | 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.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) | ||
| Line 728: | Line 739: | ||
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, m_game.constants.leagues['Bestiary'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Boon of the First Ones | -- Boon of the First Ones | ||
| Line 740: | Line 751: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/BreachBossChaos'}, | h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/BreachBossChaos'}, | ||
}, | }, | ||
| Line 750: | Line 760: | ||
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.chayula))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Dreamer | -- The Dreamer | ||
| Line 759: | Line 769: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/'}, | h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/BreachBosses/'}, | ||
}, | }, | ||
| Line 769: | Line 778: | ||
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, m_game.constants.leagues['Breach'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Breach | -- The Breach | ||
| Line 778: | Line 787: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/MavenBoss/TheMaven'}, | h.conditions.factory.drop_monsters{monster = 'Metadata/Monsters/MavenBoss/TheMaven'}, | ||
}, | }, | ||
| Line 788: | Line 796: | ||
return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.maven))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Leviathan | -- The Leviathan | ||
| Line 800: | Line 808: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
h.conditions.factory.acquisition_tag{tag = 'fishing'}, | h.conditions.factory.acquisition_tag{tag = 'fishing'}, | ||
}, | }, | ||
| Line 811: | Line 816: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.fishing))) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.fishing))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Baited Expectations | -- Baited Expectations | ||
| Line 820: | Line 825: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='is_replica', value=true}, | h.conditions.factory.arg{arg='is_replica', value=true}, | ||
}, | }, | ||
| Line 831: | Line 833: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.replica))) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, i18n.replica))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Forward Gaze | -- The Forward Gaze | ||
| Line 840: | Line 842: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name}, | ||
}, | }, | ||
| Line 847: | Line 851: | ||
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, m_game.constants.leagues['Nemesis'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Valkyrie | -- The Valkyrie | ||
| Line 856: | Line 860: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Nemesis'].name}, | ||
}, | }, | ||
| Line 866: | Line 868: | ||
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_corrupted, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Nemesis'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Undaunted | -- The Undaunted | ||
| Line 875: | Line 877: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Beyond'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Beyond'].name}, | ||
}, | }, | ||
| Line 882: | Line 886: | ||
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, m_game.constants.leagues['Beyond'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Calling | -- The Calling | ||
| Line 891: | Line 895: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Delve'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Delve'].name}, | ||
}, | }, | ||
| Line 898: | Line 904: | ||
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['Delve'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Alone in the Darkness | -- Alone in the Darkness | ||
| Line 907: | Line 913: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Metamorph'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Metamorph'].name}, | ||
}, | }, | ||
| Line 917: | Line 922: | ||
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, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Metamorph'].name))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Haunting Shadows | -- Haunting Shadows | ||
| Line 926: | Line 931: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Abyss'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Abyss'].name}, | ||
}, | }, | ||
| Line 936: | Line 940: | ||
return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Abyss'].name)) | return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Abyss'].name)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Abyssal Incubator | -- Abyssal Incubator | ||
| Line 945: | Line 949: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
-- 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 = m_game.constants.leagues['Synthesis'].name}, | ||
h.conditions.factory.acquisition_tag{tag = 'league-specific', negate = true}, | h.conditions.factory.acquisition_tag{tag = 'league-specific', negate = true}, | ||
| Line 957: | Line 960: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', string.format(i18n.fmt.x_item, m_game.constants.leagues['Synthesis'].name))) | 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, | ||
parts = { | |||
{ | { | ||
-- Chasing Risk | -- Chasing Risk | ||
| Line 969: | Line 972: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
function(tpl_args) | function(tpl_args) | ||
| Line 986: | Line 988: | ||
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, string.format('%s %s', m_util.html.poe_color('mod', i18n.primordial), m_util.html.poe_color('unique', i18n.jewel))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Primordial | -- The Primordial | ||
| Line 995: | Line 997: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
function(tpl_args) | function(tpl_args) | ||
| Line 1,012: | Line 1,013: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- A Stone Perfected | -- A Stone Perfected | ||
| Line 1,021: | Line 1,022: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_talisman'}, | h.conditions.factory.flag_is_set{flag = 'is_talisman'}, | ||
h.conditions.factory.arg{arg='talisman_tier', value=1}, | h.conditions.factory.arg{arg='talisman_tier', value=1}, | ||
| Line 1,033: | Line 1,030: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.tier_1_talisman)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.tier_1_talisman)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Call to the First Ones | -- Call to the First Ones | ||
| Line 1,042: | Line 1,039: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_not_replica = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_talisman'}, | h.conditions.factory.flag_is_set{flag = 'is_talisman'}, | ||
}, | }, | ||
| Line 1,052: | Line 1,046: | ||
return string.format(i18n.fmt.random, i18n.talisman) | return string.format(i18n.fmt.random, i18n.talisman) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Primal Incubator | -- Primal Incubator | ||
| Line 1,061: | Line 1,055: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | ||
h.conditions.factory.arg{arg='tags', value='atziri1'}, | h.conditions.factory.arg{arg='tags', value='atziri1'}, | ||
| Line 1,069: | Line 1,064: | ||
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('normal', i18n.sacrifice_fragment)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Her Mask | -- Her Mask | ||
| Line 1,078: | Line 1,073: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | ||
h.conditions.factory.arg{arg='tags', value='atziri2'}, | h.conditions.factory.arg{arg='tags', value='atziri2'}, | ||
| Line 1,089: | Line 1,082: | ||
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('normal', i18n.mortal_fragment)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Sambodhi's Vow | -- Sambodhi's Vow | ||
| Line 1,098: | Line 1,091: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 1,111: | Line 1,102: | ||
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('normal', i18n.uber_elder_fragment)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Eldritch Decay | -- The Eldritch Decay | ||
| Line 1,120: | Line 1,111: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | h.conditions.factory.arg{arg='class_id', value='MapFragment'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 1,148: | Line 1,137: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.fragment)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.fragment)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Fragmented Incubator | -- Fragmented Incubator | ||
| Line 1,157: | Line 1,146: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Breachstone'}, | |||
h.conditions.factory.arg{arg='class_id', value=' | |||
h.conditions.factory.arg{arg='tags', value='breachstone'}, | h.conditions.factory.arg{arg='tags', value='breachstone'}, | ||
}, | }, | ||
| Line 1,168: | Line 1,155: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.breachstone)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.breachstone)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Obscured | -- The Obscured | ||
| Line 1,177: | Line 1,164: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_essence'}, | h.conditions.factory.flag_is_set{flag = 'is_essence'}, | ||
h.conditions.factory.arg{arg='essence_level', value=7}, | h.conditions.factory.arg{arg='essence_level', value=7}, | ||
| Line 1,188: | Line 1,173: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.deafening_essence), 3) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.deafening_essence), 3) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Cacophony | -- The Cacophony | ||
| Line 1,197: | Line 1,182: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_essence'}, | h.conditions.factory.flag_is_set{flag = 'is_essence'}, | ||
h.conditions.factory.arg{arg='essence_level', value=6}, | h.conditions.factory.arg{arg='essence_level', value=6}, | ||
| Line 1,208: | Line 1,191: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.shrieking_essence), 9) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.shrieking_essence), 9) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Harmony of Souls | -- Harmony of Souls | ||
| Line 1,217: | Line 1,200: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_essence'}, | h.conditions.factory.flag_is_set{flag = 'is_essence'}, | ||
}, | }, | ||
| Line 1,227: | Line 1,208: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Three Voices | -- Three Voices | ||
| Line 1,236: | Line 1,217: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_essence'}, | h.conditions.factory.flag_is_set{flag = 'is_essence'}, | ||
}, | }, | ||
| Line 1,246: | Line 1,225: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.essence), 3) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Infused Incubator | -- Infused Incubator | ||
| Line 1,255: | Line 1,234: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Ultimatum'].name}, | h.conditions.factory.acquisition_tag{tag = m_game.constants.leagues['Ultimatum'].name}, | ||
}, | }, | ||
| Line 1,265: | Line 1,242: | ||
return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Ultimatum'].name)) | return string.format(i18n.fmt.random, string.format(i18n.fmt.x_item, m_game.constants.leagues['Ultimatum'].name)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Challenging Incubator (previously Morphing Incubator) | -- Challenging Incubator (previously Morphing Incubator) | ||
| Line 1,274: | Line 1,251: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'}, | h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'}, | ||
}, | }, | ||
| Line 1,284: | Line 1,259: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.delirium_orb)) | return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.delirium_orb)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Disdain | -- Disdain | ||
| Line 1,293: | Line 1,268: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'}, | h.conditions.factory.flag_is_set{flag = 'is_delirium_orb'}, | ||
}, | }, | ||
| Line 1,303: | Line 1,276: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.delirium_orb), 10) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.delirium_orb), 10) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Dementophobia | -- Dementophobia | ||
| Line 1,312: | Line 1,285: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_blight_item'}, | h.conditions.factory.flag_is_set{flag = 'is_blight_item'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 1,325: | Line 1,296: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.oil), 10) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.oil), 10) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Tireless Extractor | -- The Tireless Extractor | ||
| Line 1,334: | Line 1,305: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 1,347: | Line 1,316: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.vial), 10) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.vial), 10) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Rabbit's Foot | -- The Rabbit's Foot | ||
| Line 1,356: | Line 1,325: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=5}, | h.conditions.factory.arg{arg='map_tier', value=5}, | ||
| Line 1,364: | Line 1,335: | ||
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', string.format(i18n.fmt.tier_x_map, 5))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Cartographer's Delight | -- Cartographer's Delight | ||
| Line 1,373: | Line 1,344: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=6}, | h.conditions.factory.arg{arg='map_tier', value=6}, | ||
| Line 1,381: | Line 1,354: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 6))) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 6))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Rain Tempter | -- Rain Tempter | ||
| Line 1,390: | Line 1,363: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=12}, | h.conditions.factory.arg{arg='map_tier', value=12}, | ||
| Line 1,398: | Line 1,373: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 12))) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', string.format(i18n.fmt.tier_x_map, 12))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Arena Champion | -- The Arena Champion | ||
| Line 1,407: | Line 1,382: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=14}, | h.conditions.factory.arg{arg='map_tier', value=14}, | ||
| Line 1,415: | Line 1,392: | ||
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', string.format(i18n.fmt.tier_x_map, 14))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Surveyor | -- The Surveyor | ||
| Line 1,424: | Line 1,401: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=15}, | h.conditions.factory.arg{arg='map_tier', value=15}, | ||
| Line 1,432: | Line 1,411: | ||
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', string.format(i18n.fmt.tier_x_map, 15))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Lost Worlds | -- Lost Worlds | ||
| Line 1,441: | Line 1,420: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=15}, | h.conditions.factory.arg{arg='map_tier', value=15}, | ||
| Line 1,452: | Line 1,429: | ||
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_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 15))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Trial | -- The Trial | ||
| Line 1,461: | Line 1,438: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=15}, | h.conditions.factory.arg{arg='map_tier', value=15}, | ||
| Line 1,472: | Line 1,447: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Easy Stroll | -- The Easy Stroll | ||
| Line 1,481: | Line 1,456: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 1,494: | Line 1,467: | ||
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)))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Price of Protection | -- The Price of Protection | ||
| Line 1,503: | Line 1,476: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=16}, | h.conditions.factory.arg{arg='map_tier', value=16}, | ||
| Line 1,511: | Line 1,486: | ||
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)))) | 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, | ||
parts = { | |||
{ | { | ||
-- Azure Rage | -- Azure Rage | ||
| Line 1,520: | Line 1,495: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=16}, | h.conditions.factory.arg{arg='map_tier', value=16}, | ||
| Line 1,531: | Line 1,504: | ||
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_unidentified_corrupted, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 16))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Left to Fate | -- Left to Fate | ||
| Line 1,540: | Line 1,513: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
h.conditions.factory.arg{arg='map_tier', value=13}, | h.conditions.factory.arg{arg='map_tier', value=13}, | ||
| Line 1,551: | Line 1,522: | ||
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_corrupted, string.format(i18n.fmt.triskaidekaphobia, m_util.html.poe_color('rare', string.format(i18n.fmt.tier_x_map, 13)))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Triskaidekaphobia | -- Triskaidekaphobia | ||
| Line 1,560: | Line 1,531: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | 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='gem_tags', value=m_game.constants.item.gem_tags.aura.tag}, | ||
| Line 1,572: | Line 1,541: | ||
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_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, | ||
parts = { | |||
{ | { | ||
-- The Wilted Rose | -- The Wilted Rose | ||
| Line 1,581: | Line 1,550: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | 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='gem_tags', value=m_game.constants.item.gem_tags.golem.tag}, | ||
| Line 1,593: | Line 1,560: | ||
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_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, | ||
parts = { | |||
{ | { | ||
-- The Rite of Elements | -- The Rite of Elements | ||
| Line 1,602: | Line 1,569: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | 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='gem_tags', value=m_game.constants.item.gem_tags.golem.tag}, | ||
| Line 1,616: | Line 1,579: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Terrible Secret of Space | -- Terrible Secret of Space | ||
| Line 1,625: | Line 1,588: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | 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='gem_tags', value=m_game.constants.item.gem_tags.trap.tag}, | ||
| Line 1,637: | Line 1,598: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Deathly Designs | -- Deathly Designs | ||
| Line 1,646: | Line 1,607: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | 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='gem_tags', value=m_game.constants.item.gem_tags.chaos.tag}, | ||
| Line 1,658: | Line 1,617: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Bitter Blossom | -- The Bitter Blossom | ||
| Line 1,667: | Line 1,626: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | 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}, | h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.minion.tag}, | ||
| Line 1,675: | Line 1,636: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Summoner | -- The Summoner | ||
| Line 1,684: | Line 1,645: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | 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='gem_tags', value=m_game.constants.item.gem_tags.spell.tag}, | ||
| Line 1,696: | Line 1,655: | ||
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_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, | ||
parts = { | |||
{ | { | ||
--The Cataclysm | --The Cataclysm | ||
| Line 1,705: | Line 1,664: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | 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}, | h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.vaal.tag}, | ||
| Line 1,717: | Line 1,672: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Volatile Power | -- Volatile Power | ||
| Line 1,726: | Line 1,681: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | ||
h.conditions.factory.flag_is_set{flag = 'is_derived'}, | h.conditions.factory.flag_is_set{flag = 'is_derived'}, | ||
| Line 1,739: | Line 1,690: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem, 21))) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem, 21))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Blessing of Moosh | -- The Blessing of Moosh | ||
| Line 1,748: | Line 1,699: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | ||
h.conditions.factory.flag_is_set{flag = 'is_derived'}, | h.conditions.factory.flag_is_set{flag = 'is_derived'}, | ||
| Line 1,761: | Line 1,708: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Hook | -- The Hook | ||
| Line 1,770: | Line 1,717: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | ||
h.conditions.factory.flag_is_set{flag = 'is_derived'}, | h.conditions.factory.flag_is_set{flag = 'is_derived'}, | ||
| Line 1,783: | Line 1,726: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Doryani's Epiphany | -- Doryani's Epiphany | ||
| Line 1,792: | Line 1,735: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Active Skill Gem'}, | ||
h.conditions.factory.flag_is_set{flag = 'is_derived'}, | h.conditions.factory.flag_is_set{flag = 'is_derived'}, | ||
| Line 1,805: | Line 1,744: | ||
return m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 19, 19)) | return m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_trans_gem_y_quality, 19, 19)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Dying Anguish | -- Dying Anguish | ||
| Line 1,814: | Line 1,753: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | 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}, | h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag}, | ||
| Line 1,822: | Line 1,763: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Gemcutter's Mercy | -- Gemcutter's Mercy | ||
| Line 1,831: | Line 1,772: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | 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}, | h.conditions.factory.arg{arg='gem_tags', value=m_game.constants.item.gem_tags.exceptional.tag}, | ||
| Line 1,839: | Line 1,782: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Home | -- Home | ||
| Line 1,848: | Line 1,791: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | ||
h.conditions.factory.arg{arg='max_level', value=20}, | h.conditions.factory.arg{arg='max_level', value=20}, | ||
| Line 1,856: | Line 1,801: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.level_x_y_gem, 20, i18n.support))) | 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, | ||
parts = { | |||
{ | { | ||
-- Gift of the Gemling Queen | -- Gift of the Gemling Queen | ||
| Line 1,865: | Line 1,810: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | ||
}, | }, | ||
| Line 1,875: | Line 1,818: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('gem', string.format(i18n.fmt.x_gem_y_quality, i18n.support, 23))) | 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, | ||
parts = { | |||
{ | { | ||
-- Dialla's Subjugation | -- Dialla's Subjugation | ||
| Line 1,884: | Line 1,827: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | 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='is_awakened_support_gem', value=true}, | ||
| Line 1,897: | Line 1,836: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Cheater | -- The Cheater | ||
| Line 1,906: | Line 1,845: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
h.conditions.factory.arg{arg='class_id', value='Support Skill Gem'}, | 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='is_awakened_support_gem', value=true}, | ||
| Line 1,919: | Line 1,854: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- Desecrated Virtue | -- Desecrated Virtue | ||
| Line 1,928: | Line 1,863: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
h.conditions.factory.arg{arg='tags', value='bestiary_scarab'}, | h.conditions.factory.arg{arg='tags', value='bestiary_scarab'}, | ||
| Line 1,936: | Line 1,873: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.bestiary_scarab)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.bestiary_scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Man With Bear | -- Man With Bear | ||
| Line 1,945: | Line 1,882: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
h.conditions.factory.arg{arg='tags', value='maps_scarab'}, | h.conditions.factory.arg{arg='tags', value='maps_scarab'}, | ||
| Line 1,953: | Line 1,892: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.cartography_scarab)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.cartography_scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Deal | -- The Deal | ||
| Line 1,962: | Line 1,901: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
h.conditions.factory.arg{arg='tags', value='divination_scarab'}, | h.conditions.factory.arg{arg='tags', value='divination_scarab'}, | ||
| Line 1,970: | Line 1,911: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.divination_scarab)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.divination_scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Card Sharp | -- The Card Sharp | ||
| Line 1,979: | Line 1,920: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
h.conditions.factory.arg{arg='tags', value='uber_scarab'}, | h.conditions.factory.arg{arg='tags', value='uber_scarab'}, | ||
| Line 1,987: | Line 1,930: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.horned_scarab)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.horned_scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Rebirth and Renewal | -- Rebirth and Renewal | ||
| Line 1,996: | Line 1,939: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
h.conditions.factory.arg{arg='tags', value='delve_scarab'}, | h.conditions.factory.arg{arg='tags', value='delve_scarab'}, | ||
| Line 2,004: | Line 1,949: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sulphite_scarab)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sulphite_scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Buried Treasure | -- Buried Treasure | ||
| Line 2,013: | Line 1,958: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
}, | }, | ||
| Line 2,020: | Line 1,967: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('normal', i18n.scarab), 4) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('normal', i18n.scarab), 4) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- More is Never Enough | -- More is Never Enough | ||
| Line 2,029: | Line 1,976: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
}, | }, | ||
| Line 2,039: | Line 1,985: | ||
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', i18n.scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Cameria's Cut | -- Cameria's Cut | ||
| Line 2,048: | Line 1,994: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | h.conditions.factory.flag_is_set{flag = 'is_scarab'}, | ||
}, | }, | ||
| Line 2,058: | Line 2,003: | ||
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', i18n.scarab)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Skittering Incubator | -- Skittering Incubator | ||
| Line 2,067: | Line 2,012: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | ||
h.conditions.factory.arg{arg='tags', value='breachstone_splinter'}, | h.conditions.factory.arg{arg='tags', value='breachstone_splinter'}, | ||
| Line 2,078: | Line 2,021: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.breachstone_splinter), 5) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.breachstone_splinter), 5) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Puzzle | -- The Puzzle | ||
| Line 2,087: | Line 2,030: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | ||
h.conditions.factory.arg{arg='tags', value='quality_currency'}, | h.conditions.factory.arg{arg='tags', value='quality_currency'}, | ||
| Line 2,095: | Line 2,040: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.quality_currency), 20) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.quality_currency), 20) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Master Artisan | -- The Master Artisan | ||
| Line 2,104: | Line 2,049: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_fossil'}, | h.conditions.factory.flag_is_set{flag = 'is_fossil'}, | ||
}, | }, | ||
| Line 2,114: | Line 2,057: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.fossil), 5) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.fossil), 5) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Tinkerer's Table | -- The Tinkerer's Table | ||
| Line 2,123: | Line 2,066: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.flag_is_set{flag = 'is_fossil'}, | h.conditions.factory.flag_is_set{flag = 'is_fossil'}, | ||
}, | }, | ||
| Line 2,133: | Line 2,074: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.fossil)) | return string.format(i18n.fmt.random, m_util.html.poe_color('currency', i18n.fossil)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Fossilised Incubator | -- Fossilised Incubator | ||
| Line 2,142: | Line 2,083: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | h.conditions.factory.arg{arg='class_id', value='StackableCurrency'}, | ||
function (tpl_args) | function (tpl_args) | ||
| Line 2,155: | Line 2,094: | ||
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.scouting_report), 20) | return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('currency', i18n.scouting_report), 20) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Side Quest | -- The Side Quest | ||
| Line 2,164: | Line 2,103: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='UniqueFragment'}, | h.conditions.factory.arg{arg='class_id', value='UniqueFragment'}, | ||
h.conditions.factory.acquisition_tag{tag = 'Harbinger'}, | h.conditions.factory.acquisition_tag{tag = 'Harbinger'}, | ||
| Line 2,175: | Line 2,113: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.harbinger_fragment)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.harbinger_fragment)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Messenger | -- The Messenger | ||
| Line 2,187: | Line 2,125: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,194: | Line 2,134: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.body_armour)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Body | -- The Body | ||
| Line 2,203: | Line 2,143: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Shield'}, | h.conditions.factory.arg{arg='class_id', value='Shield'}, | ||
}, | }, | ||
| Line 2,213: | Line 2,151: | ||
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('unique', i18n.shield)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Mercenary | -- The Mercenary | ||
| Line 2,222: | Line 2,160: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Shield'}, | h.conditions.factory.arg{arg='class_id', value='Shield'}, | ||
}, | }, | ||
| Line 2,229: | Line 2,170: | ||
return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('normal', i18n.shield)) | return string.format(i18n.fmt.random_shaper, m_util.html.poe_color('normal', i18n.shield)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Astral Protection | -- Astral Protection | ||
| Line 2,238: | Line 2,179: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Helmet'}, | h.conditions.factory.arg{arg='class_id', value='Helmet'}, | ||
}, | }, | ||
| Line 2,245: | Line 2,188: | ||
return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('magic', i18n.helmet)) | return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('magic', i18n.helmet)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Further Invention | -- Further Invention | ||
| Line 2,254: | Line 2,197: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Helmet'}, | h.conditions.factory.arg{arg='class_id', value='Helmet'}, | ||
}, | }, | ||
| Line 2,261: | Line 2,207: | ||
return string.format(i18n.fmt.random_two_veiled, m_util.html.poe_color('rare', i18n.helmet)) | return string.format(i18n.fmt.random_two_veiled, m_util.html.poe_color('rare', i18n.helmet)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Journalist | -- The Journalist | ||
| Line 2,270: | Line 2,216: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Claw'}, | h.conditions.factory.arg{arg='class_id', value='Claw'}, | ||
}, | }, | ||
| Line 2,280: | Line 2,224: | ||
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('unique', i18n.claw)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Wolverine | -- The Wolverine | ||
| Line 2,289: | Line 2,233: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Dagger', 'Rune Dagger'}}, | h.conditions.factory.arg{arg='class_id', values={'Dagger', 'Rune Dagger'}}, | ||
}, | }, | ||
| Line 2,296: | Line 2,242: | ||
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('unique', i18n.dagger)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Assassin's Favour | -- Assassin's Favour | ||
| Line 2,305: | Line 2,251: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Sceptre'}, | h.conditions.factory.arg{arg='class_id', value='Sceptre'}, | ||
}, | }, | ||
| Line 2,312: | Line 2,261: | ||
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_shaper, m_util.html.poe_color('magic', string.format('%s %s', i18n.sceptre, h.modifier_link{id='LocalIncreasedAttackSpeed8'}))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Lord of Celebration | -- The Lord of Celebration | ||
| Line 2,321: | Line 2,270: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Bow'}, | h.conditions.factory.arg{arg='class_id', value='Bow'}, | ||
}, | }, | ||
| Line 2,328: | Line 2,279: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.bow)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.bow)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Hunter's Resolve | -- Hunter's Resolve | ||
| Line 2,337: | Line 2,288: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
}, | }, | ||
| Line 2,344: | Line 2,297: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewel)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewel)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Garish Power | -- The Garish Power | ||
| Line 2,353: | Line 2,306: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
}, | }, | ||
| Line 2,363: | Line 2,314: | ||
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('unique', i18n.jewel)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Eye of the Dragon | -- The Eye of the Dragon | ||
| Line 2,372: | Line 2,323: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
}, | }, | ||
| Line 2,379: | Line 2,332: | ||
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, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='PercentIncreasedLifeJewel'}, i18n.jewel))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Shard of Fate | -- Shard of Fate | ||
| Line 2,388: | Line 2,341: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
}, | }, | ||
| Line 2,395: | Line 2,350: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewel, h.modifier_link{id='CriticalStrikeMultiplierJewel'}))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Mountain | -- The Mountain | ||
| Line 2,404: | Line 2,359: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Jewel'}, | h.conditions.factory.arg{arg='class_id', value='Jewel'}, | ||
}, | }, | ||
| Line 2,414: | Line 2,367: | ||
return string.format(i18n.fmt.random_corrupted_implicit, m_util.html.poe_color('rare', i18n.jewel), h.modifier_link{id='V2CorruptedBloodImmunityCorrupted'}) | return string.format(i18n.fmt.random_corrupted_implicit, m_util.html.poe_color('rare', i18n.jewel), h.modifier_link{id='V2CorruptedBloodImmunityCorrupted'}) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Lachrymal Necrosis | -- Lachrymal Necrosis | ||
| Line 2,423: | Line 2,376: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Amulet'}, | h.conditions.factory.arg{arg='class_id', value='Amulet'}, | ||
}, | }, | ||
| Line 2,430: | Line 2,386: | ||
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('magic', string.format('%s %s', h.modifier_link{id='IncreasedEnergyShieldPercent7'}, i18n.amulet))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Sigil | -- The Sigil | ||
| Line 2,439: | Line 2,395: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Amulet'}, | h.conditions.factory.arg{arg='class_id', value='Amulet'}, | ||
}, | }, | ||
| Line 2,449: | Line 2,404: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.amulet)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.amulet)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Warden | -- The Warden | ||
| Line 2,458: | Line 2,413: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Ring'}, | h.conditions.factory.arg{arg='class_id', value='Ring'}, | ||
h.conditions.factory.drop_level_not_greater_than{level=83}, | |||
}, | }, | ||
text = function () | 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_item_level_x, 83, m_util.html.poe_color('magic', string.format('%s %s', i18n.ring, h.modifier_link{id='ChaosResist6'}))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Lord in Black | -- The Lord in Black | ||
| Line 2,477: | Line 2,432: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Ring'}, | h.conditions.factory.arg{arg='class_id', value='Ring'}, | ||
}, | }, | ||
| Line 2,484: | Line 2,441: | ||
return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.ring)) | return string.format(i18n.fmt.random_item_level_x, 100, m_util.html.poe_color('rare', i18n.ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Opulent | -- The Opulent | ||
| Line 2,493: | Line 2,450: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Ring'}, | h.conditions.factory.arg{arg='class_id', value='Ring'}, | ||
}, | }, | ||
| Line 2,500: | Line 2,459: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.ring)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Hubris | -- Hubris | ||
| Line 2,509: | Line 2,468: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Ring'}, | h.conditions.factory.arg{arg='class_id', value='Ring'}, | ||
}, | }, | ||
| Line 2,519: | Line 2,476: | ||
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('unique', i18n.ring)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Blind Venture | -- Blind Venture | ||
| Line 2,528: | Line 2,485: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Belt'}, | h.conditions.factory.arg{arg='class_id', value='Belt'}, | ||
}, | }, | ||
| Line 2,535: | Line 2,494: | ||
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('unique', i18n.belt)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Wretched | -- The Wretched | ||
| Line 2,544: | Line 2,503: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Belt'}, | h.conditions.factory.arg{arg='class_id', value='Belt'}, | ||
}, | }, | ||
| Line 2,551: | Line 2,512: | ||
return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.belt)) | return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.belt)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Dungeon Master | -- The Dungeon Master | ||
| Line 2,560: | Line 2,521: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
}, | }, | ||
| Line 2,570: | Line 2,529: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.map)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.map)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Encroaching Darkness | -- The Encroaching Darkness | ||
| Line 2,579: | Line 2,538: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
}, | }, | ||
| Line 2,586: | Line 2,547: | ||
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('unique', i18n.map)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Otherworldly Incubator | -- Otherworldly Incubator | ||
| Line 2,595: | Line 2,556: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Wand'}, | h.conditions.factory.arg{arg='class_id', value='Wand'}, | ||
}, | }, | ||
| Line 2,605: | Line 2,564: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.wand)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.wand)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Traitor | -- The Traitor | ||
| Line 2,614: | Line 2,573: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}}, | h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}}, | ||
}, | }, | ||
| Line 2,621: | Line 2,582: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.staff)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.staff)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Tower | -- The Tower | ||
| Line 2,630: | Line 2,591: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Staff', 'Warstaff'}}, | 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 | h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets | ||
h.conditions.factory.drop_level_not_greater_than{level=66}, | |||
}, | }, | ||
text = function () | 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_link_item_level_y, 5, 66, m_util.html.poe_color('normal', i18n.staff)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Flora's Gift | -- The Flora's Gift | ||
| Line 2,650: | Line 2,611: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Staff'}, | h.conditions.factory.arg{arg='class_id', value='Staff'}, | ||
h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets | h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets | ||
h.conditions.factory.drop_level_not_greater_than{level=55}, | |||
}, | }, | ||
text = function () | 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_link_item_level_y, 6, 55, m_util.html.poe_color('normal', i18n.staff)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Dark Mage | -- The Dark Mage | ||
| Line 2,670: | Line 2,631: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,677: | Line 2,640: | ||
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_x_link_item_level_y, 6, 100, m_util.html.poe_color('normal', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Dapper Prodigy | -- The Dapper Prodigy | ||
| Line 2,686: | Line 2,649: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,693: | Line 2,658: | ||
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_link_item_level_y_random_influenced, 6, 100, m_util.html.poe_color('normal', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Draped in Dreams | -- Draped in Dreams | ||
| Line 2,702: | Line 2,667: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,709: | Line 2,677: | ||
return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour)) | return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Chains that Bind | -- The Chains that Bind | ||
| Line 2,718: | Line 2,686: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,725: | Line 2,695: | ||
return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour)) | return string.format(i18n.fmt.random_x_link, 6, m_util.html.poe_color('normal', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Geomancer's Incubator | -- Geomancer's Incubator | ||
| Line 2,734: | Line 2,704: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,741: | Line 2,713: | ||
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_item_level_x, 100, m_util.html.poe_color('rare', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Destined to Crumble | -- Destined to Crumble | ||
| Line 2,750: | Line 2,722: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | h.conditions.factory.arg{arg='class_id', value='Body Armour'}, | ||
}, | }, | ||
| Line 2,757: | Line 2,731: | ||
return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.body_armour)) | return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.body_armour)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Duality | -- Duality | ||
| Line 2,766: | Line 2,740: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
}, | }, | ||
| Line 2,773: | Line 2,749: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.map)) | return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.map)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Boundless Realms | -- Boundless Realms | ||
| Line 2,782: | Line 2,758: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Map'}, | h.conditions.factory.arg{arg='class_id', value='Map'}, | ||
}, | }, | ||
| Line 2,792: | Line 2,766: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.map)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('rare', i18n.map)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Explorer | -- The Explorer | ||
| Line 2,801: | Line 2,775: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Gloves'}, | h.conditions.factory.arg{arg='class_id', value='Gloves'}, | ||
}, | }, | ||
| Line 2,808: | Line 2,784: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gloves)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.gloves)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Mitts | -- Mitts | ||
| Line 2,817: | Line 2,793: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Boots'}, | h.conditions.factory.arg{arg='class_id', value='Boots'}, | ||
}, | }, | ||
| Line 2,827: | Line 2,801: | ||
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))) | 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, | ||
parts = { | |||
{ | { | ||
-- The Shepherd's Sandals | -- The Shepherd's Sandals | ||
| Line 2,836: | Line 2,810: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='DivinationCard'}, | h.conditions.factory.arg{arg='class_id', value='DivinationCard'}, | ||
}, | }, | ||
| Line 2,846: | Line 2,818: | ||
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('divination', i18n.divination_card)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Gambler | -- The Gambler | ||
| Line 2,857: | Line 2,829: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='DivinationCard'}, | h.conditions.factory.arg{arg='class_id', value='DivinationCard'}, | ||
h.conditions.factory.not_arg{arg='tags', value='boss_drop_card'}, | h.conditions.factory.not_arg{arg='tags', value='boss_drop_card'}, | ||
| Line 2,868: | Line 2,838: | ||
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('divination', i18n.divination_card)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Stacked Deck | -- Stacked Deck | ||
| Line 2,877: | Line 2,847: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='HeistBlueprint'}, | h.conditions.factory.arg{arg='class_id', value='HeistBlueprint'}, | ||
}, | }, | ||
| Line 2,887: | Line 2,855: | ||
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)) | 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, | end, | ||
parts = { | |||
{ | { | ||
-- Something Dark | -- Something Dark | ||
| Line 2,896: | Line 2,864: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='IncubatorStackable'}, | h.conditions.factory.arg{arg='class_id', value='IncubatorStackable'}, | ||
}, | }, | ||
| Line 2,906: | Line 2,872: | ||
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) | 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, | end, | ||
parts = { | |||
{ | { | ||
-- Parasitic Passengers | -- Parasitic Passengers | ||
| Line 2,915: | Line 2,881: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_replica = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', value='Relic'}, | h.conditions.factory.arg{arg='class_id', value='Relic'}, | ||
}, | }, | ||
| Line 2,925: | Line 2,890: | ||
return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('unique', i18n.relic)) | return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('unique', i18n.relic)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Temperance | -- Temperance | ||
| Line 2,937: | Line 2,902: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'One Hand Axe', 'Two Hand Axe'}}, | h.conditions.factory.arg{arg='class_id', values={'One Hand Axe', 'Two Hand Axe'}}, | ||
}, | }, | ||
| Line 2,944: | Line 2,911: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.axe)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.axe)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Battle Born | -- The Battle Born | ||
| Line 2,953: | Line 2,920: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | ||
h.conditions.factory.arg{arg='max_level', value=20}, | h.conditions.factory.arg{arg='max_level', value=20}, | ||
| Line 2,961: | Line 2,930: | ||
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('gem', string.format(i18n.fmt.level_x_gem, 20))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Fox | -- The Fox | ||
| Line 2,970: | Line 2,939: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | ||
}, | }, | ||
| Line 2,977: | Line 2,948: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.gem_x_quality, 20))) | return string.format(i18n.fmt.random, m_util.html.poe_color('gem', string.format(i18n.fmt.gem_x_quality, 20))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Gemcutter's Promise | -- Gemcutter's Promise | ||
| Line 2,986: | Line 2,957: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.gems.keys}, | ||
}, | }, | ||
| Line 2,993: | Line 2,966: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('gem', i18n.fmt.gem_quality)) | return string.format(i18n.fmt.random, m_util.html.poe_color('gem', i18n.fmt.gem_quality)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Gemcutter's Incubator | -- Gemcutter's Incubator | ||
| Line 3,002: | Line 2,975: | ||
}, | }, | ||
--[[{ | --[[{ | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | ||
}, | }, | ||
| Line 3,009: | Line 2,984: | ||
return string.format(i18n.fmt.random_x_quality, m_util.html.poe_color('unique', i18n.armour), 30) | return string.format(i18n.fmt.random_x_quality, m_util.html.poe_color('unique', i18n.armour), 30) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Sambodhi's Wisdom | -- Sambodhi's Wisdom | ||
| Line 3,018: | Line 2,993: | ||
},--]] | },--]] | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | ||
h.conditions.factory.arg{arg='tags', value='int_armour'}, | h.conditions.factory.arg{arg='tags', value='int_armour'}, | ||
| Line 3,026: | Line 3,004: | ||
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, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedEnergyShieldPercentAndStunRecovery6'}, i18n.armour))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Inoculated | -- The Inoculated | ||
| Line 3,035: | Line 3,013: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.armor.keys}, | ||
}, | }, | ||
| Line 3,042: | Line 3,023: | ||
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', i18n.life, i18n.armour))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Carrion Crow | -- The Carrion Crow | ||
| Line 3,051: | Line 3,032: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
}, | }, | ||
| Line 3,058: | Line 3,041: | ||
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_shaper_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Perfection | -- Perfection | ||
| Line 3,067: | Line 3,050: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
}, | }, | ||
| Line 3,074: | Line 3,059: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewellery)) | return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.jewellery)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Cache | -- The Cache | ||
| Line 3,083: | Line 3,068: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
h.conditions.factory.drop_level_not_greater_than{level=86}, | |||
}, | }, | ||
text = function () | 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_two_influenced_item_level_x, 86, m_util.html.poe_color('rare', i18n.jewellery)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Awakened | -- The Awakened | ||
| Line 3,099: | Line 3,087: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
h.conditions.factory.drop_level_not_greater_than{level=79}, | |||
}, | }, | ||
text = function () | 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_item_level_x, 79, m_util.html.poe_color('rare', i18n.jewellery)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Lover | -- The Lover | ||
| Line 3,118: | Line 3,106: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}}, | h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}}, | ||
h.conditions.factory.drop_level_not_greater_than{level=85}, | |||
}, | }, | ||
text = function () | 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_item_level_x, 85, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='ReduceGlobalFlatManaCostStrIntMasterVendor'}, i18n.jewellery))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Blessing of God | -- Blessing of God | ||
| Line 3,137: | Line 3,125: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}}, | h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}}, | ||
h.conditions.factory.drop_level_not_greater_than{level=76}, | |||
}, | }, | ||
text = function () | 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_item_level_x, 76, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='AddedLightningDamage9'}, i18n.jewellery))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Struck by Lightning | -- Struck by Lightning | ||
| Line 3,156: | Line 3,144: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
}, | }, | ||
| Line 3,163: | Line 3,153: | ||
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_shaper_hunter_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', i18n.jewellery, h.modifier_link{id='GrantsCatAspectCrafted'}))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- A Familiar Call | -- A Familiar Call | ||
| Line 3,172: | Line 3,162: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys}, | ||
}, | }, | ||
| Line 3,179: | Line 3,171: | ||
return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery)) | return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('rare', i18n.jewellery)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Imperfect Memories | -- Imperfect Memories | ||
| Line 3,188: | Line 3,180: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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', values={'Two Hand Sword', 'Two Hand Axe', 'Two Hand Mace', 'Staff', 'Bow', 'Warstaff'}}, | ||
}, | }, | ||
| Line 3,195: | Line 3,189: | ||
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_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.two_hand_weapon))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Merciless Armament | -- Merciless Armament | ||
| Line 3,204: | Line 3,198: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}}, | ||
}, | }, | ||
| Line 3,211: | Line 3,207: | ||
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_two_influenced_item_level_x, 100, m_util.html.poe_color('rare', i18n.one_hand_weapon)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Prometheus' Armoury | -- Prometheus' Armoury | ||
| Line 3,220: | Line 3,216: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
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', values={'Thrusting One Hand Sword', 'One Hand Sword', 'One Hand Axe', 'One Hand Mace', 'Sceptre', 'Dagger', 'Claw', 'Wand', 'Rune Dagger'}}, | ||
}, | }, | ||
| Line 3,227: | Line 3,225: | ||
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_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.one_hand_weapon))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Jester | -- The Jester | ||
| Line 3,236: | Line 3,234: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values={'Sceptre', 'Wand', 'Rune Dagger'}}, | h.conditions.factory.arg{arg='class_id', values={'Sceptre', 'Wand', 'Rune Dagger'}}, | ||
}, | }, | ||
| Line 3,243: | Line 3,243: | ||
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_item_level_x, 100, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='SpellDamageOnWeapon8_'}, i18n.one_hand_weapon))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Road to Power | -- The Road to Power | ||
| Line 3,252: | Line 3,252: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
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={'Thrusting One Hand Sword', 'One Hand Sword', 'Two Hand Sword'}}, | ||
}, | }, | ||
| Line 3,262: | Line 3,260: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.sword)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.sword)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Gentleman | -- The Gentleman | ||
| Line 3,271: | Line 3,269: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | ||
}, | }, | ||
| Line 3,278: | Line 3,278: | ||
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_item_level_x, 100, m_util.html.poe_color('magic',string.format('%s %s', h.modifier_link{id='LocalIncreasedPhysicalDamagePercent8'}, i18n.weapon))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Tyrant | -- The Tyrant | ||
| Line 3,287: | Line 3,287: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | ||
}, | }, | ||
| Line 3,294: | Line 3,297: | ||
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, m_util.html.poe_color('magic', string.format('%s %s', i18n.weapon, h.modifier_link{id='StrIntMasterItemGenerationCanHaveMultipleCraftedMods'}))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Web | -- The Web | ||
| Line 3,303: | Line 3,306: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.weapons.keys}, | ||
}, | }, | ||
| Line 3,313: | Line 3,314: | ||
return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.weapon)) | return string.format(i18n.fmt.random_corrupted, m_util.html.poe_color('unique', i18n.weapon)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Atziri's Arsenal | -- Atziri's Arsenal | ||
| Line 3,322: | Line 3,323: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.flasks.keys}, | h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.flasks.keys}, | ||
}, | }, | ||
| Line 3,329: | Line 3,333: | ||
return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='FlaskChanceRechargeOnCrit5'}, i18n.flask))) | return string.format(i18n.fmt.random, m_util.html.poe_color('magic', string.format('%s %s', h.modifier_link{id='FlaskChanceRechargeOnCrit5'}, i18n.flask))) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Surgeon | -- The Surgeon | ||
| Line 3,338: | Line 3,342: | ||
}, | }, | ||
--[[{ | --[[{ | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
h.conditions.factory.arg{arg='tags', value='two_hand_weapon'}, | h.conditions.factory.arg{arg='tags', value='two_hand_weapon'}, | ||
h.conditions.factory.acquisition_tag{tag = 'experimented base type'}, | h.conditions.factory.acquisition_tag{tag = 'experimented base type'}, | ||
h.conditions.factory.drop_level_not_greater_than{level=86}, | |||
}, | }, | ||
text = function () | 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) | 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, | end, | ||
parts = { | |||
{ | { | ||
-- Soul Quenched | -- Soul Quenched | ||
| Line 3,358: | Line 3,361: | ||
},--]] | },--]] | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_corrupted = true, | |||
item_class_has_influences = true, | |||
h.conditions.factory.acquisition_tag{tag = 'experimented base type'}, | h.conditions.factory.acquisition_tag{tag = 'experimented base type'}, | ||
}, | }, | ||
| Line 3,369: | Line 3,370: | ||
return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.experimented_base_type)) | return string.format(i18n.fmt.random_two_influenced_item_level_x, 100, m_util.html.poe_color('normal', i18n.experimented_base_type)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Auspicious Ambitions | -- Auspicious Ambitions | ||
| Line 3,378: | Line 3,379: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
item_class_has_corrupted_implicits = true, | |||
item_class_has_influences = true, | |||
h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | ||
}, | }, | ||
| Line 3,390: | Line 3,389: | ||
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_two_implicit_corrupted_two_influenced_item_level_x, 97, m_util.html.poe_color('unique', i18n.league_specific_item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Fateful Meeting | -- Fateful Meeting | ||
| Line 3,399: | Line 3,398: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | ||
}, | }, | ||
| Line 3,409: | Line 3,406: | ||
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('unique', i18n.league_specific_item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Time-Lost Relic | -- Time-Lost Relic | ||
| Line 3,418: | Line 3,415: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | h.conditions.factory.acquisition_tag{tag = 'league-specific'}, | ||
}, | }, | ||
| Line 3,428: | Line 3,423: | ||
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('unique', i18n.league_specific_item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Time-Lost Incubator | -- Time-Lost Incubator | ||
| Line 3,440: | Line 3,435: | ||
-- | -- | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
item_class_has_fractured_modifiers = true, | |||
}, | }, | ||
text = function () | text = function () | ||
return string.format(i18n.fmt.random_fractured_item_level_x, 100, m_util.html.poe_color('rare', i18n.item)) | return string.format(i18n.fmt.random_fractured_item_level_x, 100, m_util.html.poe_color('rare', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- A Dusty Memory | -- A Dusty Memory | ||
| Line 3,456: | Line 3,453: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
item_class_has_influences = true, | |||
}, | }, | ||
text = function () | 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_elder_item_level_x, 100, m_util.html.poe_color('rare', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Hale Heart | -- The Hale Heart | ||
| Line 3,472: | Line 3,471: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
item_class_has_influences = true, | |||
}, | }, | ||
text = function () | text = function () | ||
return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item)) | return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Prejudice | -- Prejudice | ||
| Line 3,488: | Line 3,489: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
item_class_has_influences = true, | |||
}, | }, | ||
text = function () | text = function () | ||
return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.item)) | return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Costly Curio | -- Costly Curio | ||
| Line 3,504: | Line 3,507: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
drop_level_ngt_divcard_default_max_ilvl = true, | |||
item_class_has_influences = true, | |||
}, | }, | ||
text = function () | text = function () | ||
return string.format(i18n.fmt.random_influenced_x_elevated, m_util.html.poe_color('magic', i18n.item)) | return string.format(i18n.fmt.random_influenced_x_elevated, m_util.html.poe_color('magic', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- The Aspirant | -- The Aspirant | ||
| Line 3,520: | Line 3,526: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_normal = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
item_class_has_synthesised_implicits = true, | |||
}, | }, | ||
text = function () | text = function () | ||
return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('normal', i18n.item)) | return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('normal', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Magnum Opus | -- Magnum Opus | ||
| Line 3,536: | Line 3,544: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
item_class_has_corrupted_implicits = true, | |||
}, | }, | ||
text = function () | 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_implicit_corrupted, m_util.html.poe_color('unique', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Arrogance of the Vaal | -- Arrogance of the Vaal | ||
| Line 3,555: | Line 3,561: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
}, | }, | ||
text = function () | 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('unique', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Jack in the Box | -- Jack in the Box | ||
| Line 3,570: | Line 3,578: | ||
}, | }, | ||
{ | { | ||
conditions = { | |||
is_unique = true, | |||
is_not_drop_restricted = true, | |||
is_not_corrupted = true, | |||
}, | }, | ||
text = function () | 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('unique', i18n.item)) | ||
end, | end, | ||
parts = { | |||
{ | { | ||
-- Singular Incubator | -- Singular Incubator | ||
| Line 3,598: | Line 3,608: | ||
page = {}, | page = {}, | ||
} | } | ||
local | local recipes = {} | ||
-- ------------------------------------------------------------------------ | -- ------------------------------------------------------------------------ | ||
-- Manual data | -- Manual data | ||
-- ------------------------------------------------------------------------ | -- ------------------------------------------------------------------------ | ||
local | local recipe_num = #recipes + 1 | ||
local | local recipe | ||
repeat | repeat | ||
local prefix = string.format('recipe%s_', | local prefix = string.format('recipe%s_', recipe_num) | ||
local | local part_num = 1 | ||
local | local part | ||
recipe = { | |||
parts = {}, | |||
result_amount = tonumber(tpl_args[prefix .. 'result_amount']) or 1, | result_amount = tonumber(tpl_args[prefix .. 'result_amount']) or 1, | ||
text = m_util.cast.text(tpl_args[prefix .. 'description']), | text = m_util.cast.text(tpl_args[prefix .. 'description']), | ||
| Line 3,616: | Line 3,626: | ||
} | } | ||
repeat | repeat | ||
local | local part_prefix = string.format('%spart%s_', prefix, part_num) | ||
part = { | |||
item_name = tpl_args[ | item_name = tpl_args[part_prefix .. 'item_name'], | ||
item_id = tpl_args[ | item_id = tpl_args[part_prefix .. 'item_id'], | ||
item_page = tpl_args[ | item_page = tpl_args[part_prefix .. 'item_page'], | ||
amount = tonumber(tpl_args[ | amount = tonumber(tpl_args[part_prefix .. 'amount']), | ||
notes = m_util.cast.text(tpl_args[ | notes = m_util.cast.text(tpl_args[part_prefix .. 'notes']), | ||
} | } | ||
if | if part.item_name ~= nil or part.item_id ~= nil or part.item_page ~= nil then | ||
if | if part.amount == nil then | ||
error(string.format(i18n.errors.missing_amount, | error(string.format(i18n.errors.missing_amount, part_prefix .. 'amount')) | ||
else | else | ||
for key, array in pairs(query_data) do | for key, array in pairs(query_data) do | ||
local value = | local value = part['item_' .. key] | ||
if value then | if value then | ||
if array[value] then | if array[value] then | ||
table.insert(array[value], { | table.insert(array[value], {recipe_num, part_num}) | ||
else | else | ||
array[value] = {{ | array[value] = {{recipe_num, part_num}, } | ||
end | end | ||
end | end | ||
end | end | ||
recipe.parts[#recipe.parts+1] = part | |||
end | end | ||
end | end | ||
part_num = part_num + 1 | |||
until | until part.item_name == nil and part.item_id == nil and part.item_page == nil | ||
-- | -- recipe was empty, can terminate safely | ||
if # | if #recipe.parts == 0 then | ||
recipe = nil | |||
else | else | ||
recipe_num = recipe_num + 1 | |||
recipes[#recipes+1] = recipe | |||
end | end | ||
until | until recipe == nil | ||
-- ------------------------------------------------------------------------ | -- ------------------------------------------------------------------------ | ||
| Line 3,662: | Line 3,672: | ||
-- maps | -- maps | ||
-- | -- | ||
local automatic_index = # | local automatic_index = #recipes + 1 | ||
-- TODO: 3.9.0 Unsure how this works yet, so disabled for now | -- 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 | --[[if tpl_args.atlas_connections and tpl_args.rarity_id == 'normal' then | ||
| Line 3,674: | Line 3,684: | ||
) | ) | ||
for _, row in ipairs(results) do | for _, row in ipairs(results) do | ||
recipes[#recipes+1] = { | |||
text = i18n.misc.upgraded_from_map, | text = i18n.misc.upgraded_from_map, | ||
result_amount = 1, | result_amount = 1, | ||
parts = { | |||
{ | { | ||
item_name = row['items.name'], | item_name = row['items.name'], | ||
| Line 3,703: | Line 3,713: | ||
) | ) | ||
for _, row in ipairs(results) do | for _, row in ipairs(results) do | ||
recipes[#recipes+1] = { | |||
text = nil, | text = nil, | ||
result_amount = 1, | result_amount = 1, | ||
parts = { | |||
{ | { | ||
item_name = row['items.name'], | item_name = row['items.name'], | ||
| Line 3,760: | Line 3,770: | ||
if row['essences.category'] == tpl_args.essence_category then | if row['essences.category'] == tpl_args.essence_category then | ||
-- 3 to 1 recipe | -- 3 to 1 recipe | ||
recipes[#recipes+1] = { | |||
automatic = true, | automatic = true, | ||
result_amount = 1, | result_amount = 1, | ||
text = nil, | text = nil, | ||
parts = { | |||
{ | { | ||
item_id = row['items.metadata_id'], | item_id = row['items.metadata_id'], | ||
| Line 3,774: | Line 3,784: | ||
} | } | ||
-- corruption +1 | -- corruption +1 | ||
recipes[#recipes+1] = { | |||
automatic = true, | automatic = true, | ||
result_amount = 1, | result_amount = 1, | ||
text = i18n.essence_plus_one_level, | text = i18n.essence_plus_one_level, | ||
parts = { | |||
{ | { | ||
item_id = row['items.metadata_id'], | item_id = row['items.metadata_id'], | ||
| Line 3,795: | Line 3,805: | ||
elseif tonumber(row['essences.type']) == tpl_args.essence_type - 1 then | elseif tonumber(row['essences.type']) == tpl_args.essence_type - 1 then | ||
-- corruption type change | -- corruption type change | ||
recipes[#recipes+1] = { | |||
automatic = true, | automatic = true, | ||
result_amount = 1, | result_amount = 1, | ||
text = i18n.essence_type_change, | text = i18n.essence_type_change, | ||
parts = { | |||
{ | { | ||
item_id = row['items.metadata_id'], | item_id = row['items.metadata_id'], | ||
| Line 3,820: | Line 3,830: | ||
-- data based on mapping | -- data based on mapping | ||
if tpl_args.drop_enabled and not tpl_args.disable_automatic_recipes then | if tpl_args.drop_enabled and not tpl_args.disable_automatic_recipes then | ||
-- Test and cache results of all named conditions | |||
for k, condition in pairs(c.named_conditions) do | |||
if type(condition) == 'function' then | |||
c.named_conditions[k] = condition(tpl_args) | |||
end | |||
end | |||
for _, data in ipairs(c.automatic_recipes) do | for _, data in ipairs(c.automatic_recipes) do | ||
local valid = true -- Can this recipe produce the item? | |||
for | -- Check cached results for named conditions | ||
for k, condition in pairs(c.named_conditions) do | |||
if data.conditions[k] then | |||
valid = condition | |||
if not valid then | |||
if not | |||
break | break | ||
end | end | ||
end | end | ||
end | end | ||
for _, condition in ipairs(data. | |||
-- Test anonymous conditions | |||
if not | for _, condition in ipairs(data.conditions) do | ||
valid = condition(tpl_args) and valid | |||
if not valid then | |||
break | break | ||
end | end | ||
end | end | ||
if | if valid then | ||
recipes[#recipes+1] = { | |||
automatic = true, | automatic = true, | ||
result_amount = 1, | result_amount = 1, | ||
text = data.text(), | text = data.text(), | ||
parts = data.parts, | |||
} | } | ||
for | for part_num, row in ipairs(data.parts) do | ||
if query_data['id'][row.item_id] then | if query_data['id'][row.item_id] then | ||
table.insert(query_data['id'][row.item_id], {# | table.insert(query_data['id'][row.item_id], {#recipes, part_num}) | ||
else | else | ||
query_data['id'][row.item_id] = {{# | query_data['id'][row.item_id] = {{#recipes, part_num}, } | ||
end | end | ||
end | end | ||
| Line 3,867: | Line 3,876: | ||
end | end | ||
if # | if #recipes == 0 then | ||
return | return | ||
end | end | ||
| Line 3,906: | Line 3,915: | ||
for _, row in ipairs(results) do | for _, row in ipairs(results) do | ||
if row[query_fields.id] and string.find(row[query_fields.id], 'Metadata/Items/DivinationCards/', 1, true) then | if row[query_fields.id] and string.find(row[query_fields.id], 'Metadata/Items/DivinationCards/', 1, true) then | ||
local | local part = { | ||
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheVoid', | item_id = 'Metadata/Items/DivinationCards/DivinationCardTheVoid', | ||
amount = 1, | amount = 1, | ||
| Line 3,914: | Line 3,923: | ||
{'items._pageName', 'items.name', 'items.metadata_id'}, | {'items._pageName', 'items.name', 'items.metadata_id'}, | ||
{ | { | ||
where=string.format('%s = "%s"', query_fields.id, | where=string.format('%s = "%s"', query_fields.id, part.item_id), | ||
} | } | ||
) | ) | ||
if #result > 0 then | if #result > 0 then | ||
recipes[#recipes+1] = { | |||
automatic = true, | automatic = true, | ||
result_amount = 1, | result_amount = 1, | ||
text = i18n.the_void, | text = i18n.the_void, | ||
parts = {part}, | |||
} | } | ||
if query_data['id'][ | if query_data['id'][part.item_id] then | ||
table.insert(query_data['id'][ | table.insert(query_data['id'][part.item_id], {#recipes, 1}) | ||
else | else | ||
query_data['id'][ | query_data['id'][part.item_id] = {{#recipes, 1}, } | ||
end | end | ||
table.insert(results, result[1]) | table.insert(results, result[1]) | ||
| Line 3,937: | Line 3,946: | ||
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 | ||
local | local recipe_parts = thing_array[row[query_fields[key]]] | ||
if | if recipe_parts then | ||
for _, | for _, recipe_part in ipairs(recipe_parts) do | ||
local entry = | local entry = recipes[recipe_part[1]].parts[recipe_part[2]] | ||
for entry_key, data_key in pairs(query_fields) do | for entry_key, data_key in pairs(query_fields) do | ||
-- metadata_id may be nil, since we don't know them for unique items | -- metadata_id may be nil, since we don't know them for unique items | ||
| Line 3,958: | Line 3,967: | ||
-- query data was pruned of existing keys earlier, so only broken keys remain | -- query data was pruned of existing keys earlier, so only broken keys remain | ||
for key, array in pairs(query_data) do | for key, array in pairs(query_data) do | ||
for thing, | for thing, recipe_parts in pairs(array) do | ||
for _, | for _, recipe_part in ipairs(recipe_parts) do | ||
tpl_args._flags.invalid_recipe_parts = true | 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', | tpl_args._errors[#tpl_args._errors+1] = m_util.string.format(i18n.errors.invalid_recipe_parts, string.format('recipe%s_part%s_item_%s', recipe_part[1], recipe_part[2], key), thing) | ||
end | end | ||
end | end | ||
| Line 3,970: | Line 3,979: | ||
-- Check for duplicates | -- Check for duplicates | ||
-- | -- | ||
local | local delete_recipes = {} | ||
for i=automatic_index, # | for i=automatic_index, #recipes do | ||
for j=1, automatic_index-1 do | for j=1, automatic_index-1 do | ||
if # | if #recipes[i].parts == #recipes[j].parts then | ||
local match = true | local match = true | ||
for row_id, row in ipairs( | for row_id, row in ipairs(recipes[i].parts) 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. | -- 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 | for _, key in ipairs({'item_id', 'item_name', 'item_page'}) do | ||
match = match and (row[key] == | match = match and (row[key] == recipes[j].parts[row_id][key]) | ||
end | end | ||
end | end | ||
| Line 3,984: | Line 3,993: | ||
tpl_args._flags.duplicate_recipes = true | tpl_args._flags.duplicate_recipes = true | ||
tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.duplicate_recipes, j) | tpl_args._errors[#tpl_args._errors+1] = string.format(i18n.errors.duplicate_recipes, j) | ||
delete_recipes[#delete_recipes+1] = j | |||
end | end | ||
end | end | ||
| Line 3,990: | Line 3,999: | ||
end | end | ||
for offset, index in ipairs( | for offset, index in ipairs(delete_recipes) do | ||
table.remove( | table.remove(recipes, index-(offset-1)) | ||
end | end | ||
-- | -- | ||
-- Set data | -- Set data | ||
-- | -- | ||
tpl_args.recipes = | tpl_args.recipes = recipes | ||
-- | -- Set recipes data | ||
for i, | for i, recipe in ipairs(recipes) do | ||
table.insert(tpl_args._store_data, { | table.insert(tpl_args._store_data, { | ||
_table = 'acquisition_recipes', | _table = 'acquisition_recipes', | ||
recipe_id = i, | recipe_id = i, | ||
result_amount = | result_amount = recipe.result_amount, | ||
description = | description = recipe.text, | ||
automatic = | automatic = recipe.automatic, | ||
}) | }) | ||
for j, | for j, part in ipairs(recipe.parts) do | ||
table.insert(tpl_args._store_data, { | table.insert(tpl_args._store_data, { | ||
_table = 'acquisition_recipe_parts', | _table = 'acquisition_recipe_parts', | ||
part_id = j, | part_id = j, | ||
recipe_id = i, | recipe_id = i, | ||
item_name = | item_name = part.item_name, | ||
item_id = | item_id = part.item_id, | ||
item_page = | item_page = part.item_page, | ||
amount = | amount = part.amount, | ||
notes = | notes = part.notes, | ||
}) | }) | ||
end | end | ||
| Line 4,026: | Line 4,036: | ||
-- | -- | ||
function p.debug_validate_auto_upgraded_from( | function p.debug_validate_auto_upgraded_from() | ||
local q = {} | local q = {} | ||
local chk = {} | local chk = {} | ||
for _, data in ipairs(c.automatic_recipes) do | for _, data in ipairs(c.automatic_recipes) do | ||
for _, | for _, part in ipairs(data.parts) do | ||
q[#q+1] = | q[#q+1] = part.item_id | ||
chk[ | chk[part.item_id] = { | ||
amount= | amount=part.amount, | ||
text=data.text(), | text=data.text(), | ||
} | } | ||
| Line 4,055: | Line 4,065: | ||
end | end | ||
tbl = mw.html.create('table') | local tbl = mw.html.create('table') | ||
tbl:attr('class', 'wikitable sortable') | tbl:attr('class', 'wikitable sortable') | ||
for _, row in ipairs(results) do | for _, row in ipairs(results) do | ||
Revision as of 21:07, 25 August 2024
This submodule of Module:Item contains configuration and functions for item recipes.
The above documentation is transcluded from Module:Item/recipes/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
-------------------------------------------------------------------------------
--
-- 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
function h.conditions.factory.drop_level_not_greater_than(args)
return function (tpl_args)
if tpl_args.drop_level == nil then
return true
end
return tpl_args.drop_level <= args.level
end
end
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 = {}
c.named_conditions = {
is_normal = h.conditions.factory.arg{arg='rarity_id', value='normal'},
is_unique = h.conditions.factory.arg{arg='rarity_id', value='unique'},
is_not_drop_restricted = h.conditions.factory.arg{arg='is_drop_restricted', value=false},
is_not_corrupted = h.conditions.factory.arg{arg='is_corrupted', value=false},
is_not_replica = h.conditions.factory.arg{arg='is_replica', value=false},
drop_level_ngt_divcard_default_max_ilvl = h.conditions.factory.drop_level_not_greater_than{level=cfg.divination_card_exchange_default_max_ilvl},
item_class_has_corrupted_implicits = h.conditions.item_class_has_corrupted_implicits,
item_class_has_influences = h.conditions.item_class_has_influences,
item_class_has_synthesised_implicits = h.conditions.item_class_has_synthesised_implicits,
item_class_has_fractured_modifiers = h.conditions.item_class_has_fractured_modifiers,
}
-- Order matters!
-- Put most specific outcome at the top and the least specific at the bottom.
c.automatic_recipes = {
--[[
{
conditions = {
function (tpl_args) end,
},
text = '',
parts = {
{
name = '',
item_id = '',
amount = 0,
notes = '',
},
},
},
]]
--
-- Automatic recipes for specific maps - reduces maintenance when a new map series is introduced
--
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Guardian's Challenge
item_id = 'Metadata/Items/DivinationCards/DivinationCardGuardiansChallenge',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
h.conditions.factory.arg{arg='name', value=i18n['Vaal Temple Map']},
h.conditions.factory.drop_level_not_greater_than{level=83},
},
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,
parts = {
{
-- Lingering Remnants
item_id = 'Metadata/Items/DivinationCards/DivinationCardLingeringRemnants',
amount = 16,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Price of Prescience
item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfPrescience',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
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,
parts = {
{
-- Justified Ambition
item_id = 'Metadata/Items/DivinationCards/DivinationCardJustifiedAmbition',
amount = 5,
},
},
},
--
-- Item base specific
--
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Lysah's Respite
item_id = 'Metadata/Items/DivinationCards/DivinationCardLysahsRespite',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Penitent
item_id = 'Metadata/Items/DivinationCards/DivinationCardThePenitent',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Glimmer of Hope
item_id = 'Metadata/Items/DivinationCards/DivinationCardGlimmerOfHope',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Hope
item_id = 'Metadata/Items/DivinationCards/DivinationCardHope',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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_variant, m_util.html.poe_color('rare', i18n.two_stone_ring))
end,
parts = {
{
-- Lantador's Lost Love
item_id = 'Metadata/Items/DivinationCards/DivinationCardLantadorsLostLove',
amount = 7,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Heterochromia
item_id = 'Metadata/Items/DivinationCards/DivinationCardHeterochromia',
amount = 2,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Light and Truth
item_id = 'Metadata/Items/DivinationCards/DivinationCardLightAndTruth',
amount = 2,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Earth Drinker
item_id = 'Metadata/Items/DivinationCards/DivinationCardEarthDrinker',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Gladiator
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGladiator',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Standoff
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheStandoff',
amount = 3,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Forgotten Treasure
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForgottenTreasure',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- Peaceful Moments
item_id = 'Metadata/Items/DivinationCards/DivinationCardPeacefulMoments',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Eternal War
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEternalWar',
amount = 4,
},
},
},
--
-- Item name (item variants)
--
{
conditions = {
is_unique = true,
is_not_replica = true,
h.conditions.factory.arg{arg='name', value=i18n.precursors_emblem},
},
text = function ()
return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.precursors_emblem)))
end,
parts = {
{
-- Remembrance
item_id = 'Metadata/Items/DivinationCards/DivinationCardRemembrance',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
h.conditions.factory.arg{arg='name', value=i18n.grand_spectrum},
},
text = function ()
return string.format(i18n.fmt.random_variant, string.format(i18n.fmt.corrupted_x, m_util.html.poe_color('unique', i18n.grand_spectrum)))
end,
parts = {
{
-- Divine Justice
item_id = 'Metadata/Items/DivinationCards/DivinationCardDivineJustice',
amount = 1,
},
},
},
--
-- Item name like (themed items)
--
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Admirer
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAdmirer',
amount = 9,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Doedre's Madness
item_id = 'Metadata/Items/DivinationCards/DivinationCardDoedresMadness',
amount = 9,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Aesthete
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAesthete',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
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,
parts = {
{
-- The Wolf
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolf',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Lion
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLion',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- Council of Cats
item_id = 'Metadata/Items/DivinationCards/DivinationCardCouncilOfCats',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- Boon of the First Ones
item_id = 'Metadata/Items/DivinationCards/DivinationCardBoonOfTheFirstOnes',
amount = 6,
},
},
},
--
-- Monster-specific items
--
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Dreamer
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDreamer',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Breach
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBreach',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Leviathan
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLeviathan',
amount = 7,
},
},
},
--
-- Themed/league items (acquisition tags)
--
{
conditions = {
is_unique = true,
is_not_replica = true,
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,
parts = {
{
-- Baited Expectations
item_id = 'Metadata/Items/DivinationCards/DivinationCardBaitedExpectations',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Forward Gaze
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheForwardGaze',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Valkyrie
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheValkyrie',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Undaunted
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheUndaunted',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Calling
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCalling',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Alone in the Darkness
item_id = 'Metadata/Items/DivinationCards/DivinationCardAloneInTheDarkness',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Haunting Shadows
item_id = 'Metadata/Items/DivinationCards/DivinationCardHauntingShadows',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- Abyssal Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationAbyssStackable',
amount = 1,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
-- 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,
parts = {
{
-- Chasing Risk
item_id = 'Metadata/Items/DivinationCards/DivinationCardChasingRisk',
amount = 4,
},
},
},
--
-- Subset of item class
--
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Primordial
item_id = 'Metadata/Items/DivinationCards/DivinationCardThePrimordial',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- A Stone Perfected
item_id = 'Metadata/Items/DivinationCards/DivinationCardAStonePerfected',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Call to the First Ones
item_id = 'Metadata/Items/DivinationCards/DivinationCardCallToTheFirstOnes',
amount = 5,
},
},
},
{
conditions = {
is_not_replica = true,
h.conditions.factory.flag_is_set{flag = 'is_talisman'},
},
text = function ()
return string.format(i18n.fmt.random, i18n.talisman)
end,
parts = {
{
-- Primal Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationTalismansStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Her Mask
item_id = 'Metadata/Items/DivinationCards/DivinationCardHerMask',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Sambodhi's Vow
item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisVow',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Eldritch Decay
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEldritchDecay',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Fragmented Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationFragmentsStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', value='Breachstone'},
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,
parts = {
{
-- The Obscured
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheObscured',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Cacophony
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCacophony',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Harmony of Souls
item_id = 'Metadata/Items/DivinationCards/DivinationCardHarmonyOfSouls',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Three Voices
item_id = 'Metadata/Items/DivinationCards/DivinationCardThreeVoices',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Infused Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationEssenceHighStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Challenging Incubator (previously Morphing Incubator)
item_id = 'Metadata/Items/Currency/CurrencyIncubationMetamorphStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Disdain
item_id = 'Metadata/Items/DivinationCards/DivinationCardDisdain',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Dementophobia
item_id = 'Metadata/Items/DivinationCards/DivinationCardDementophobia',
amount = 11,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Tireless Extractor
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTirelessExtractor',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Rabbit's Foot
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRabbitsFoot',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Cartographer's Delight
item_id = 'Metadata/Items/DivinationCards/DivinationCardCartographersDelight',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Rain Tempter
item_id = 'Metadata/Items/DivinationCards/DivinationCardRainTempter',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Arena Champion
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheArenaChampion',
amount = 10,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Surveyor
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurveyor',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Lost Worlds
item_id = 'Metadata/Items/DivinationCards/DivinationCardLostWorlds',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Trial
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTrial',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Easy Stroll
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEasyStroll',
amount = 2,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Price of Protection
item_id = 'Metadata/Items/DivinationCards/DivinationCardThePriceOfProtection',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Azure Rage
item_id = 'Metadata/Items/DivinationCards/DivinationCardAzureRage',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Left to Fate
item_id = 'Metadata/Items/DivinationCards/DivinationCardLeftToFate',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Triskaidekaphobia
item_id = 'Metadata/Items/DivinationCards/DivinationCardTriskaidekaphobia',
amount = 13,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Wilted Rose
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWiltedRose',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Rite of Elements
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRiteOfElements',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Terrible Secret of Space
item_id = 'Metadata/Items/DivinationCards/DivinationCardTerribleSecretOfSpace',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Deathly Designs
item_id = 'Metadata/Items/DivinationCards/DivinationCardDeathlyDesigns',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Bitter Blossom
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBitterBlossom',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Summoner
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSummoner',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
--The Cataclysm
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCataclysm',
amount = 13,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Volatile Power
item_id = 'Metadata/Items/DivinationCards/DivinationCardVolatilePower',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- The Blessing of Moosh
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBlessingOfMoosh',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- The Hook
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHook',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Doryani's Epiphany
item_id = 'Metadata/Items/DivinationCards/DivinationCardDoryanisEpiphany',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Dying Anguish
item_id = 'Metadata/Items/DivinationCards/DivinationCardDyingAnguish',
amount = 8,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Gemcutter's Mercy
item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersMercy',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Home
item_id = 'Metadata/Items/DivinationCards/DivinationCardHome',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Gift of the Gemling Queen
item_id = 'Metadata/Items/DivinationCards/DivinationCardGiftOfTheGemlingQueen',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Dialla's Subjugation
item_id = 'Metadata/Items/DivinationCards/DivinationCardDiallasSubjugation',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- The Cheater
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCheater',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
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,
parts = {
{
-- Desecrated Virtue
item_id = 'Metadata/Items/DivinationCards/DivinationCardDesecratedVirtue',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
h.conditions.factory.arg{arg='tags', value='bestiary_scarab'},
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.bestiary_scarab))
end,
parts = {
{
-- Man With Bear
item_id = 'Metadata/Items/DivinationCards/DivinationCardManWithBear',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
h.conditions.factory.arg{arg='tags', value='maps_scarab'},
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.cartography_scarab))
end,
parts = {
{
-- The Deal
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDeal',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
h.conditions.factory.arg{arg='tags', value='divination_scarab'},
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.divination_scarab))
end,
parts = {
{
-- The Card Sharp
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCardSharp',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
h.conditions.factory.arg{arg='tags', value='uber_scarab'},
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.horned_scarab))
end,
parts = {
{
-- Rebirth and Renewal
item_id = 'Metadata/Items/DivinationCards/DivinationCardRebirthAndRenewal',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
h.conditions.factory.arg{arg='tags', value='delve_scarab'},
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('normal', i18n.sulphite_scarab))
end,
parts = {
{
-- Buried Treasure
item_id = 'Metadata/Items/DivinationCards/DivinationCardBuriedTreasure',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.flag_is_set{flag = 'is_scarab'},
},
text = function ()
return string.format(i18n.fmt.random_x_amount, m_util.html.poe_color('normal', i18n.scarab), 4)
end,
parts = {
{
-- More is Never Enough
item_id = 'Metadata/Items/DivinationCards/DivinationCardMoreIsNeverEnough',
amount = 7,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Cameria's Cut
item_id = 'Metadata/Items/DivinationCards/DivinationCardCameriasCut',
amount = 2,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Skittering Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationScarabsStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Puzzle
item_id = 'Metadata/Items/DivinationCards/DivinationCardThePuzzle',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Master Artisan
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMasterArtisan',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Tinkerer's Table
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTinkerersTable',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Fossilised Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationFossilsStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Side Quest
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSideQuest',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Messenger
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMessenger',
amount = 4,
},
},
},
--
-- Single item class
--
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Body
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBody',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Mercenary
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMercenary',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- Astral Protection
item_id = 'Metadata/Items/DivinationCards/DivinationCardAstralProtection',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Further Invention
item_id = 'Metadata/Items/DivinationCards/DivinationCardFurtherInvention',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Journalist
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJournalist',
amount = 10,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Wolverine
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWolverine',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Assassin's Favour
item_id = 'Metadata/Items/DivinationCards/DivinationCardAssassinsFavour',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Lord of Celebration
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordOfCelebration',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Hunter's Resolve
item_id = 'Metadata/Items/DivinationCards/DivinationCardHuntersResolve',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Garish Power
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGarishPower',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Eye of the Dragon
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEyeOfTheDragon',
amount = 10,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Shard of Fate
item_id = 'Metadata/Items/DivinationCards/DivinationCardShardOfFate',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Mountain
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheMountain',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Lachrymal Necrosis
item_id = 'Metadata/Items/DivinationCards/DivinationCardLachrymalNecrosis',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Sigil
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSigil',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Warden
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWarden',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', value='Ring'},
h.conditions.factory.drop_level_not_greater_than{level=83},
},
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,
parts = {
{
-- The Lord in Black
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLordInBlack',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Opulent
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheOpulecent',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Hubris
item_id = 'Metadata/Items/DivinationCards/DivinationCardHubris',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Blind Venture
item_id = 'Metadata/Items/DivinationCards/DivinationCardBlindVenture',
amount = 7,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Wretched
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWretched',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Dungeon Master
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDungeonMaster',
amount = 7,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Encroaching Darkness
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheEncroachingDarkness',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Otherworldly Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueMapsStackable',
amount = 1,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Traitor
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTraitor',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Tower
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTower',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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
h.conditions.factory.drop_level_not_greater_than{level=66},
},
text = function ()
return string.format(i18n.fmt.random_x_link_item_level_y, 5, 66, m_util.html.poe_color('normal', i18n.staff))
end,
parts = {
{
-- The Flora's Gift
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFlorasGift',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', value='Staff'},
h.conditions.factory.not_arg{arg='tags', value='small_staff'}, -- Small staves excluded because they don't have enough sockets
h.conditions.factory.drop_level_not_greater_than{level=55},
},
text = function ()
return string.format(i18n.fmt.random_x_link_item_level_y, 6, 55, m_util.html.poe_color('normal', i18n.staff))
end,
parts = {
{
-- The Dark Mage
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDarkMage',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Dapper Prodigy
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheDapperProdigy',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Draped in Dreams
item_id = 'Metadata/Items/DivinationCards/DivinationCardDrapedInDreams',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Chains that Bind
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheChainsThatBind',
amount = 11,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Geomancer's Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationArmour6LinkedStackable',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Destined to Crumble
item_id = 'Metadata/Items/DivinationCards/DivinationCardDestinedToCrumble',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Duality
item_id = 'Metadata/Items/DivinationCards/DivinationCardDuality',
amount = 2,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Boundless Realms
item_id = 'Metadata/Items/DivinationCards/DivinationCardBoundlessRealms',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Explorer
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheExplorer',
amount = 6,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Mitts
item_id = 'Metadata/Items/DivinationCards/DivinationCardMitts',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Shepherd's Sandals
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheShepherdsSandals',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- 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,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Stacked Deck
item_id = 'Metadata/Items/DivinationCards/DivinationCardDeck',
amount = 1,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Something Dark
item_id = 'Metadata/Items/DivinationCards/DivinationCardSomethingDark',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_corrupted = true,
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,
parts = {
{
-- Parasitic Passengers
item_id = 'Metadata/Items/DivinationCards/DivinationCardParasiticPassengers',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_replica = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', value='Relic'},
},
text = function ()
return string.format(i18n.fmt.random_item_level_x, 83, m_util.html.poe_color('unique', i18n.relic))
end,
parts = {
{
-- Temperance
item_id = 'Metadata/Items/DivinationCards/DivinationCardTemperance',
amount = 4,
},
},
},
--
-- Multiple item classes
--
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Battle Born
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheBattleBorn',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Fox
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheFox',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Gemcutter's Promise
item_id = 'Metadata/Items/DivinationCards/DivinationCardGemcuttersPromise',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Gemcutter's Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationGemLowStackable',
amount = 1,
},
},
},
--[[{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Sambodhi's Wisdom
item_id = 'Metadata/Items/DivinationCards/DivinationCardSambodhisWisdom',
amount = 3,
},
},
},--]]
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Inoculated
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheInoculated',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Carrion Crow
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCarrionCrow',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Perfection
item_id = 'Metadata/Items/DivinationCards/DivinationCardPerfection',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Cache
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheCache',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
h.conditions.factory.drop_level_not_greater_than{level=86},
},
text = function ()
return string.format(i18n.fmt.random_two_influenced_item_level_x, 86, m_util.html.poe_color('rare', i18n.jewellery))
end,
parts = {
{
-- The Awakened
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAwakened',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', values_assoc=cfg.class_groups.jewellery.keys},
h.conditions.factory.drop_level_not_greater_than{level=79},
},
text = function ()
return string.format(i18n.fmt.random_item_level_x, 79, m_util.html.poe_color('rare', i18n.jewellery))
end,
parts = {
{
-- The Lover
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheLover',
amount = 2,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
h.conditions.factory.drop_level_not_greater_than{level=85},
},
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,
parts = {
{
-- Blessing of God
item_id = 'Metadata/Items/DivinationCards/DivinationCardBlessingOfGod',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='class_id', values={'Ring', 'Amulet'}},
h.conditions.factory.drop_level_not_greater_than{level=76},
},
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,
parts = {
{
-- Struck by Lightning
item_id = 'Metadata/Items/DivinationCards/DivinationCardStruckByLightning',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- A Familiar Call
item_id = 'Metadata/Items/DivinationCards/DivinationCardAFamiliarCall',
amount = 3,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Imperfect Memories
item_id = 'Metadata/Items/DivinationCards/DivinationCardImperfectMemories',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Merciless Armament
item_id = 'Metadata/Items/DivinationCards/DivinationCardMercilessArmament',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- Prometheus' Armoury
item_id = 'Metadata/Items/DivinationCards/DivinationCardPrometheusArmoury',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Jester
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheJester',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Road to Power
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheRoadToPower',
amount = 7,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- The Gentleman
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheGentleman',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
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,
parts = {
{
-- The Tyrant
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheTyrant',
amount = 9,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Web
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheWeb',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Atziri's Arsenal
item_id = 'Metadata/Items/DivinationCards/DivinationCardAtzirisArsenal',
amount = 4,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
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,
parts = {
{
-- The Surgeon
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheSurgeon',
amount = 4,
},
},
},
--[[{
conditions = {
is_normal = true,
is_not_corrupted = true,
h.conditions.factory.arg{arg='tags', value='two_hand_weapon'},
h.conditions.factory.acquisition_tag{tag = 'experimented base type'},
h.conditions.factory.drop_level_not_greater_than{level=86},
},
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,
parts = {
{
-- Soul Quenched
item_id = 'Metadata/Items/DivinationCards/DivinationCardSoulQuenched',
amount = 5,
},
},
},--]]
{
conditions = {
is_normal = true,
is_not_corrupted = true,
item_class_has_influences = true,
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,
parts = {
{
-- Auspicious Ambitions
item_id = 'Metadata/Items/DivinationCards/DivinationCardAuspiciousAmbitions',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
item_class_has_corrupted_implicits = true,
item_class_has_influences = true,
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,
parts = {
{
-- Fateful Meeting
item_id = 'Metadata/Items/DivinationCards/DivinationCardFatefulMeeting',
amount = 9,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Time-Lost Relic
item_id = 'Metadata/Items/DivinationCards/DivinationCardTimeLostRelic',
amount = 10,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
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,
parts = {
{
-- Time-Lost Incubator
item_id = 'Metadata/Items/Currency/CurrencyIncubationUniqueLeagueStackable',
amount = 1,
},
},
},
--
-- Generic items
--
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
item_class_has_fractured_modifiers = true,
},
text = function ()
return string.format(i18n.fmt.random_fractured_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
end,
parts = {
{
-- A Dusty Memory
item_id = 'Metadata/Items/DivinationCards/DivinationCardADustyMemory',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
item_class_has_influences = true,
},
text = function ()
return string.format(i18n.fmt.random_elder_item_level_x, 100, m_util.html.poe_color('rare', i18n.item))
end,
parts = {
{
-- The Hale Heart
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheHaleHeart',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
item_class_has_influences = true,
},
text = function ()
return string.format(i18n.fmt.random_influenced, m_util.html.poe_color('unique', i18n.item))
end,
parts = {
{
-- Prejudice
item_id = 'Metadata/Items/DivinationCards/DivinationCardPrejudice',
amount = 7,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
item_class_has_influences = true,
},
text = function ()
return string.format(i18n.fmt.random_two_influenced_x, m_util.html.poe_color('unique', i18n.item))
end,
parts = {
{
-- Costly Curio
item_id = 'Metadata/Items/DivinationCards/DivinationCardCostlyCurio',
amount = 6,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
drop_level_ngt_divcard_default_max_ilvl = true,
item_class_has_influences = true,
},
text = function ()
return string.format(i18n.fmt.random_influenced_x_elevated, m_util.html.poe_color('magic', i18n.item))
end,
parts = {
{
-- The Aspirant
item_id = 'Metadata/Items/DivinationCards/DivinationCardTheAspirant',
amount = 5,
},
},
},
{
conditions = {
is_normal = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
item_class_has_synthesised_implicits = true,
},
text = function ()
return string.format(i18n.fmt.random_three_synthesised_item_level_x, 100, m_util.html.poe_color('normal', i18n.item))
end,
parts = {
{
-- Magnum Opus
item_id = 'Metadata/Items/DivinationCards/DivinationCardMagnumOpus',
amount = 5,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
item_class_has_corrupted_implicits = true,
},
text = function ()
return string.format(i18n.fmt.random_two_implicit_corrupted, m_util.html.poe_color('unique', i18n.item))
end,
parts = {
{
-- Arrogance of the Vaal
item_id = 'Metadata/Items/DivinationCards/DivinationCardArroganceOfTheVaal',
amount = 8,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
end,
parts = {
{
-- Jack in the Box
item_id = 'Metadata/Items/DivinationCards/DivinationCardJackInTheBox',
amount = 4,
},
},
},
{
conditions = {
is_unique = true,
is_not_drop_restricted = true,
is_not_corrupted = true,
},
text = function ()
return string.format(i18n.fmt.random, m_util.html.poe_color('unique', i18n.item))
end,
parts = {
{
-- 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 recipes = {}
-- ------------------------------------------------------------------------
-- Manual data
-- ------------------------------------------------------------------------
local recipe_num = #recipes + 1
local recipe
repeat
local prefix = string.format('recipe%s_', recipe_num)
local part_num = 1
local part
recipe = {
parts = {},
result_amount = tonumber(tpl_args[prefix .. 'result_amount']) or 1,
text = m_util.cast.text(tpl_args[prefix .. 'description']),
automatic = false,
}
repeat
local part_prefix = string.format('%spart%s_', prefix, part_num)
part = {
item_name = tpl_args[part_prefix .. 'item_name'],
item_id = tpl_args[part_prefix .. 'item_id'],
item_page = tpl_args[part_prefix .. 'item_page'],
amount = tonumber(tpl_args[part_prefix .. 'amount']),
notes = m_util.cast.text(tpl_args[part_prefix .. 'notes']),
}
if part.item_name ~= nil or part.item_id ~= nil or part.item_page ~= nil then
if part.amount == nil then
error(string.format(i18n.errors.missing_amount, part_prefix .. 'amount'))
else
for key, array in pairs(query_data) do
local value = part['item_' .. key]
if value then
if array[value] then
table.insert(array[value], {recipe_num, part_num})
else
array[value] = {{recipe_num, part_num}, }
end
end
end
recipe.parts[#recipe.parts+1] = part
end
end
part_num = part_num + 1
until part.item_name == nil and part.item_id == nil and part.item_page == nil
-- recipe was empty, can terminate safely
if #recipe.parts == 0 then
recipe = nil
else
recipe_num = recipe_num + 1
recipes[#recipes+1] = recipe
end
until recipe == nil
-- ------------------------------------------------------------------------
-- Automatic
-- ------------------------------------------------------------------------
--
-- maps
--
local automatic_index = #recipes + 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
recipes[#recipes+1] = {
text = i18n.misc.upgraded_from_map,
result_amount = 1,
parts = {
{
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
recipes[#recipes+1] = {
text = nil,
result_amount = 1,
parts = {
{
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
recipes[#recipes+1] = {
automatic = true,
result_amount = 1,
text = nil,
parts = {
{
item_id = row['items.metadata_id'],
item_page = row['items._pageName'],
item_name = row['items.name'],
amount = 3,
},
},
}
-- corruption +1
recipes[#recipes+1] = {
automatic = true,
result_amount = 1,
text = i18n.essence_plus_one_level,
parts = {
{
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
recipes[#recipes+1] = {
automatic = true,
result_amount = 1,
text = i18n.essence_type_change,
parts = {
{
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
-- Test and cache results of all named conditions
for k, condition in pairs(c.named_conditions) do
if type(condition) == 'function' then
c.named_conditions[k] = condition(tpl_args)
end
end
for _, data in ipairs(c.automatic_recipes) do
local valid = true -- Can this recipe produce the item?
-- Check cached results for named conditions
for k, condition in pairs(c.named_conditions) do
if data.conditions[k] then
valid = condition
if not valid then
break
end
end
end
-- Test anonymous conditions
for _, condition in ipairs(data.conditions) do
valid = condition(tpl_args) and valid
if not valid then
break
end
end
if valid then
recipes[#recipes+1] = {
automatic = true,
result_amount = 1,
text = data.text(),
parts = data.parts,
}
for part_num, row in ipairs(data.parts) do
if query_data['id'][row.item_id] then
table.insert(query_data['id'][row.item_id], {#recipes, part_num})
else
query_data['id'][row.item_id] = {{#recipes, part_num}, }
end
end
end
end
end
if #recipes == 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 part = {
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, part.item_id),
}
)
if #result > 0 then
recipes[#recipes+1] = {
automatic = true,
result_amount = 1,
text = i18n.the_void,
parts = {part},
}
if query_data['id'][part.item_id] then
table.insert(query_data['id'][part.item_id], {#recipes, 1})
else
query_data['id'][part.item_id] = {{#recipes, 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 recipe_parts = thing_array[row[query_fields[key]]]
if recipe_parts then
for _, recipe_part in ipairs(recipe_parts) do
local entry = recipes[recipe_part[1]].parts[recipe_part[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, recipe_parts in pairs(array) do
for _, recipe_part in ipairs(recipe_parts) 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', recipe_part[1], recipe_part[2], key), thing)
end
end
end
end
--
-- Check for duplicates
--
local delete_recipes = {}
for i=automatic_index, #recipes do
for j=1, automatic_index-1 do
if #recipes[i].parts == #recipes[j].parts then
local match = true
for row_id, row in ipairs(recipes[i].parts) 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] == recipes[j].parts[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_recipes[#delete_recipes+1] = j
end
end
end
end
for offset, index in ipairs(delete_recipes) do
table.remove(recipes, index-(offset-1))
end
--
-- Set data
--
tpl_args.recipes = recipes
-- Set recipes data
for i, recipe in ipairs(recipes) do
table.insert(tpl_args._store_data, {
_table = 'acquisition_recipes',
recipe_id = i,
result_amount = recipe.result_amount,
description = recipe.text,
automatic = recipe.automatic,
})
for j, part in ipairs(recipe.parts) do
table.insert(tpl_args._store_data, {
_table = 'acquisition_recipe_parts',
part_id = j,
recipe_id = i,
item_name = part.item_name,
item_id = part.item_id,
item_page = part.item_page,
amount = part.amount,
notes = part.notes,
})
end
end
end
--
-- Debugging
--
function p.debug_validate_auto_upgraded_from()
local q = {}
local chk = {}
for _, data in ipairs(c.automatic_recipes) do
for _, part in ipairs(data.parts) do
q[#q+1] = part.item_id
chk[part.item_id] = {
amount=part.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
local 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