Conversation
There was a problem hiding this comment.
Pull request overview
This PR aims to make build serialization output deterministic by enforcing stable ordering when saving XML (both section order and previously unordered table traversals), which helps reduce noisy diffs and improves reproducibility across runs/environments.
Changes:
- Enforce a fixed save order for build sections and sort various saved key sets (config inputs, calcs inputs, passive spec allocations, item slot names).
- Sort XML attribute emission in
xml.ComposeXMLfor deterministic attribute ordering. - Extend
HeadlessWrapper.luawith JSON-based loading/export helpers and stubs/implementations for compression/UTF-8.
Reviewed changes
Copilot reviewed 9 out of 11 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
src/Modules/Build.lua |
Saves build sections in a fixed order for deterministic output |
src/HeadlessWrapper.lua |
Adds CLI arg preservation, compression functions, UTF-8 stub, and JSON-driven build loading/export behavior |
src/Classes/PassiveSpec.lua |
Sorts passive allocations/mastery/jewel/override data before saving |
src/Classes/ItemsTab.lua |
Sorts equipment slot names before saving item sets |
src/Classes/ConfigTab.lua |
Sorts config input/placeholder keys before saving |
src/Classes/CalcsTab.lua |
Sorts calcs input keys before saving |
runtime/lua/xml.lua |
Sorts XML attribute keys when composing XML |
jsons/items.json |
Adds a build-specific items JSON blob (appears to be debug data) |
jsons/passives.json |
Adds a build-specific passives JSON blob (appears to be debug data) |
.gitignore |
Ignores buildcode.txt and main.go |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| local sortedKeys = {} | ||
| for key in pairs(node.attrib) do | ||
| t_insert(sortedKeys, key) | ||
| end | ||
| table.sort(sortedKeys) | ||
| for _, key in ipairs(sortedKeys) do | ||
| local val = node.attrib[key] | ||
| if val then | ||
| if type(key) ~= "string" then | ||
| return "invalid xml tree (attribute name in <"..node.elem.."> is not a string)" |
There was a problem hiding this comment.
composeNode now sorts node.attrib keys before validating they are strings. If a non-string attribute key ever appears, table.sort(sortedKeys) can throw (attempt to compare number with string / invalid order) rather than returning the existing descriptive error message. Consider validating keys (and maybe values) while building sortedKeys, returning the same error string before sorting, or sorting with a comparator that assumes strings only after validation.
| -- Provide a basic utf8 stub for headless mode | ||
| if name == "lua-utf8" then | ||
| return { | ||
| len = function(s) return #s end, | ||
| sub = function(s, i, j) return string.sub(s, i, j) end, | ||
| char = function(...) return string.char(...) end, | ||
| byte = function(s, i) return string.byte(s, i) end, | ||
| find = function(s, pattern, init, plain) return string.find(s, pattern, init, plain) end, | ||
| gmatch = function(s, pattern) return string.gmatch(s, pattern) end, | ||
| gsub = function(s, pattern, repl, n) return string.gsub(s, pattern, repl, n) end, | ||
| match = function(s, pattern, init) return string.match(s, pattern, init) end, | ||
| reverse = function(s) return string.reverse(s) end, | ||
| upper = function(s) return string.upper(s) end, | ||
| lower = function(s) return string.lower(s) end, | ||
| } |
There was a problem hiding this comment.
The require override always returns the stub table for lua-utf8, even if a real lua-utf8 module is available in the runtime. This can silently break any code relying on correct UTF-8 semantics (the stub uses byte-based #/string.sub, etc.). Prefer attempting l_require("lua-utf8") first (pcall) and only falling back to the stub when the module can’t be loaded.
| @@ -0,0 +1 @@ | |||
| {"items":[{"verified":false,"w":1,"h":2,"icon":"https://web.poecdn.com/gen/image/WzksMTQseyJmIjoiMkRJdGVtcy9GbGFza3MvdG9wYXoiLCJ3IjoxLCJoIjoyLCJzY2FsZSI6MSwibGV2ZWwiOjEsImZzIjp0cnVlfV0/dfefd757a4/topaz.png","league":"Mercenaries","id":"75aff73e23767a6351899b59239e90fc1b766baa3d16bc9fa4135df226e660ee","name":"","typeLine":"Dabbler's Topaz Flask of the Ibex","baseType":"Topaz Flask","rarity":"Magic","ilvl":85,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Lasts {0} Seconds","values":[["6.90",1]],"displayMode":3},{"name":"Consumes {0} of {1} Charges on use","values":[["20",0],["50",0]],"displayMode":3},{"name":"Currently has {0} Charges","values":[["50",0]],"displayMode":3}],"requirements":[{"name":"Level","values":[["46",0]],"displayMode":0,"type":62}],"explicitMods":["28% reduced Duration","25% increased effect","51% increased Evasion Rating during Effect"],"descrText":"Right click to drink. Can only hold charges while in belt. Refills as you kill monsters.","frameType":1,"x":4,"y":0,"inventoryId":"Flask","enchantMods":["70% increased effect","Gains no Charges during Effect"],"utilityMods":["+5% to maximum Lightning Resistance","+40% to Lightning Resistance"]},{"verified":false,"w":2,"h":3,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvV2VhcG9ucy9PbmVIYW5kV2VhcG9ucy9TY2VwdGVycy9UaGVzdXByZW1ldHJ1dGgiLCJ3IjoyLCJoIjozLCJzY2FsZSI6MX1d/1f03434324/Thesupremetruth.png","league":"Mercenaries","id":"d6555e9ca92566bc716fa87b517490e0653fd1286048541162082db0d25dd076","name":"The Supreme Truth","typeLine":"Crystal Sceptre","baseType":"Crystal Sceptre","rarity":"Unique","ilvl":70,"identified":true,"properties":[{"name":"Sceptre","values":[],"displayMode":0},{"name":"Physical Damage","values":[["65-96",1]],"displayMode":0,"type":9},{"name":"Critical Strike Chance","values":[["8.00%",0]],"displayMode":0,"type":12},{"name":"Attacks per Second","values":[["1.39",1]],"displayMode":0,"type":13},{"name":"Weapon Range: {0} metres","values":[["1.1",0]],"displayMode":3,"type":14}],"requirements":[{"name":"Level","values":[["41",0]],"displayMode":0,"type":62},{"name":"Str","values":[["59",0]],"displayMode":1,"type":63},{"name":"Int","values":[["136",1]],"displayMode":1,"type":65}],"explicitMods":["+1 to Level of Socketed Gems","60% increased Intelligence Requirement","85% increased Physical Damage","11% increased Attack Speed","3% increased Experience gain","20% increased Elemental Damage"],"implicitMods":["30% increased Elemental Damage"],"flavourText":["Knowledge brings power, and with power you can\r","grab truth by the throat and shape it as you wish."],"frameType":3,"x":0,"y":0,"inventoryId":"Weapon2","sockets":[{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"D","sColour":"G"}]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvUmluZ3MvUmluZzMiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/4f08d18365/Ring3.png","league":"Mercenaries","id":"4724640d9398d778fa9dfc05ecd25010686b754db8dc3b99e09bde791807ebd4","name":"Storm Gyre","typeLine":"Paua Ring","baseType":"Paua Ring","rarity":"Rare","ilvl":83,"identified":true,"duplicated":true,"requirements":[{"name":"Level","values":[["65",0]],"displayMode":0,"type":62}],"explicitMods":["+16 to all Attributes","+109 to Strength","+94 to Dexterity","+58 to Evasion Rating","+69 to maximum Mana"],"implicitMods":["+28 to maximum Mana"],"frameType":2,"x":0,"y":0,"inventoryId":"Ring"},{"verified":false,"w":2,"h":2,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9TaGllbGRzL01hbGFjaGFpTG9vcCIsInciOjIsImgiOjIsInNjYWxlIjoxfV0/8c38fb6a4e/MalachaiLoop.png","league":"Mercenaries","id":"078967f375295934a2e1d9fa9bac3263c22609660728dd7253b3266346b4b94c","name":"Malachai's Loop","typeLine":"Harmonic Spirit Shield","baseType":"Harmonic Spirit Shield","rarity":"Unique","ilvl":82,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Chance to Block","values":[["23%",0]],"displayMode":0,"type":15},{"name":"Energy Shield","values":[["265",1]],"displayMode":0,"type":18}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62,"suffix":"(gem)"},{"name":"Str","values":[["111",0]],"displayMode":1,"type":63,"suffix":"(gem)"},{"name":"Dex","values":[["155",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["159",0]],"displayMode":1,"type":65}],"explicitMods":["250% increased Energy Shield","+2 to Maximum Power Charges","20% chance to gain a Power Charge on Hit","15% increased Spell Damage per Power Charge","Lose all Power Charges on reaching Maximum Power Charges","Shocks you when you reach Maximum Power Charges"],"implicitMods":["15% increased Spell Damage"],"flavourText":["Thaumaturgy has no limit.\r","It is our fragile reality that imposes boundaries."],"frameType":3,"x":0,"y":0,"inventoryId":"Offhand","corrupted":true,"sockets":[{"group":0,"attr":"S","sColour":"R"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"D","sColour":"G"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0luY3JlYXNlZER1cmF0aW9uIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/a5db7ae0bd/IncreasedDuration.png","support":true,"league":"Mercenaries","id":"af43ffa289014b1fd8f530544085e9f2e7accb6e97faa4d2030ccebd5ba04b04","name":"","typeLine":"More Duration Support","baseType":"More Duration Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Duration","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["130%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["111",0]],"displayMode":1,"type":63}],"explicitMods":["Supported Skills have 49% more Skill Effect Duration"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill with a duration.","frameType":4,"socket":0,"colour":"S"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9EZXNwYWlyIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/5f14a5848e/Despair.png","support":false,"league":"Mercenaries","id":"dcad46c7a47d3a930581ecab77da458f4004513020a6b395dd0a53dab141a494","name":"","typeLine":"Despair","baseType":"Despair","ilvl":0,"identified":true,"properties":[{"name":"Spell, AoE, Duration, Chaos, Curse, Hex","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["33 Mana",0]],"displayMode":0},{"name":"Cast Time","values":[["0.50 sec",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["68",0]],"displayMode":1,"type":64},{"name":"Int","values":[["98",0]],"displayMode":1,"type":65}],"explicitMods":["Base duration is 11.80 seconds","+1 metre to radius","10% increased Effect of Curse","Cursed enemies have -30% to Chaos Resistance"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Curses all targets in an area, lowering their chaos resistance.","frameType":4,"socket":1,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9WYWFsR2Vtcy9WYWFsSGFzdGUiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/f19f4c8a3f/VaalHaste.png","support":false,"league":"Mercenaries","id":"d10afd574e5fa6701f499fb62f8a549d9701c5bcfa3060290754e6f0648bad24","name":"","typeLine":"Vaal Haste","baseType":"Vaal Haste","ilvl":0,"identified":true,"properties":[{"name":"Aura, Spell, AoE, Duration, Vaal","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Reservation","values":[["50% Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["1.20 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["155",0]],"displayMode":1,"type":64}],"explicitMods":["+1.9 metres to radius","You and nearby allies gain 16% increased Movement Speed","You and nearby allies gain 24% increased Cast Speed","You and nearby allies gain 24% increased Attack Speed"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Casts an aura that increases the movement speed, attack speed and cast speed of you and your allies.","frameType":4,"socket":2,"colour":"D","corrupted":true,"hybrid":{"isVaalGem":true,"baseTypeName":"Haste","properties":[{"name":"Cooldown Time","values":[["0.50 sec",0]],"displayMode":0},{"name":"Souls Per Use","values":[["50",0]],"displayMode":0},{"name":"Can Store {0} Use","values":[["1",0]],"displayMode":3},{"name":"Soul Gain Prevention","values":[["6 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0}],"explicitMods":["Base duration is 4.00 seconds","Modifiers to Buff Duration also apply to this Skill's Soul Gain Prevention","+1.9 metres to radius","You and nearby allies gain 20% increased Movement Speed","You and nearby allies gain 31% increased Cast Speed","You and nearby allies gain 31% increased Attack Speed"],"secDescrText":"Casts a temporary aura that increases the movement speed, attack speed and cast speed of you and your allies."}}]},{"verified":false,"w":2,"h":2,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9HbG92ZXMvR2xvdmVzSW50NCIsInciOjIsImgiOjIsInNjYWxlIjoxfV0/484e9bd879/GlovesInt4.png","league":"Mercenaries","id":"cebaf65ba91052a21df2f8799d15dfe0d67ba042ed1c8d101e33f5a81e199c72","name":"Maelström Touch","typeLine":"Warlock Gloves","baseType":"Warlock Gloves","rarity":"Rare","ilvl":85,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Energy Shield","values":[["166",1]],"displayMode":0,"type":18}],"requirements":[{"name":"Level","values":[["84",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["111",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["155",0]],"displayMode":1,"type":65,"suffix":"(gem)"}],"explicitMods":["Socketed Gems are supported by Level 18 Faster Projectiles","Socketed Gems are Supported by Level 16 Faster Casting","Socketed Gems have +3.5% Critical Strike Chance","Socketed Spells have +50% to Critical Strike Multiplier","Adds 5 to 13 Fire Damage to Attacks","8% increased Cast Speed","24% increased Projectile Speed"],"frameType":2,"x":0,"y":0,"inventoryId":"Gloves","craftedMods":["73% increased Energy Shield"],"sockets":[{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"I","sColour":"B"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9Tb3VsZmVhc3RHZW0iLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MSwiZ2QiOjEzfV0/9209c2ea6e/SoulfeastGem.png","support":false,"league":"Mercenaries","id":"2ca113aa954b1ea6bb72bdda10f73c8426282f757070279c0b947ef12020936b","name":"","typeLine":"Forbidden Rite of Soul Sacrifice","baseType":"Forbidden Rite of Soul Sacrifice","ilvl":0,"identified":true,"properties":[{"name":"Spell, AoE, Chaos, Projectile","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["45 Life",0]],"displayMode":0},{"name":"Cast Time","values":[["0.75 sec",0]],"displayMode":0},{"name":"Critical Strike Chance","values":[["6.00%",0]],"displayMode":0},{"name":"Effectiveness of Added Damage","values":[["110%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Int","values":[["155",0]],"displayMode":1,"type":65}],"explicitMods":["Deals 498 to 747 Chaos Damage","Deals 20% of your maximum Energy Shield as base Chaos Damage","Take 50% of maximum Energy Shield as Chaos Damage","Fires extra Projectiles at up to 9 surrounding Enemies"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Lobs an exploding projectile near the targeted location, and extra projectiles toward enemies around you. The projectiles deal chaos damage based on your energy shield. Casting this spell damages you.","frameType":4,"socket":0,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0VjaG8iLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/1868afbf2e/Echo.png","support":true,"league":"Mercenaries","id":"341383942d960ffea716d8acc1496fa016cef90be3a5543280df9ceac69a6fd0","name":"","typeLine":"Spell Echo Support","baseType":"Spell Echo Support","ilvl":0,"identified":true,"properties":[{"name":"Spell, Support","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["140%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Int","values":[["111",0]],"displayMode":1,"type":65}],"explicitMods":["Supported Skills Repeat an additional time","Supported Skills have 54% more Cast Speed","Supported Skills deal 10% increased Spell Damage"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports spell skills, making them repeat when cast. Cannot support Vaal skills, totem skills, channelling skills, triggered skills, instant skills, retaliation skills, blink skills, or skills with a reservation.","frameType":4,"socket":1,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0dyZWF0ZXJWb2xsZXlTdXBwb3J0IiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/bb821215f4/GreaterVolleySupport.png","support":true,"league":"Mercenaries","id":"13e4a3b27a4f304e061e0d5854f70c13a65cfb008922601a1a983089bd78123e","name":"","typeLine":"Greater Volley Support","baseType":"Greater Volley Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Projectile","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["150%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["111",0]],"displayMode":1,"type":64}],"explicitMods":["Supported Skills fire 4 additional Projectiles","Supported Skills deal 20% increased Projectile Damage","Supported Skills also fire Projectiles from up to 4 points on each side of you","Supported Skills deal 21% less Projectile Damage"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports skills that fire projectiles from the user. Does not affect projectiles fired from other locations as secondary effects. Does not support skills that fire projectiles in a spiral.","frameType":4,"socket":2,"colour":"D"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L1Bvd2VyQ2hhcmdlcyIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/d65c84e89f/PowerCharges.png","support":true,"league":"Mercenaries","id":"d1c23610c615051428b40151a314a24b17ed228f92bba55e97e54f0d30d328bb","name":"","typeLine":"Power Charge On Critical Support","baseType":"Power Charge On Critical Support","ilvl":0,"identified":true,"properties":[{"name":"Critical, Support","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["120%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Int","values":[["111",0]],"displayMode":1,"type":65}],"explicitMods":["Supported Skills have 64% chance to gain a Power Charge on Critical Strike","Supported Skills deal 4% more Damage per Power Charge"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill that hits enemies.","frameType":4,"socket":3,"colour":"I"}],"influences":{"elder":true,"shaper":true},"elder":true,"shaper":true},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQW11bGV0cy9XaGlzcGVyc29mSW5maW5pdHkiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/4fc9361433/WhispersofInfinity.png","league":"Mercenaries","id":"022262605e6e55687810dd04061e29aa6c394bf1d7f8a0ab29af06ceac8d866f","name":"Whispers of Infinity","typeLine":"Seaglass Amulet","baseType":"Seaglass Amulet","rarity":"Unique","ilvl":86,"identified":true,"properties":[{"name":"Quality (Defence Modifiers)","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["74",0]],"displayMode":0,"type":62}],"explicitMods":["7 to 24 Added Attack Chaos Damage per 100 Maximum Mana","+450 to maximum Energy Shield","58% reduced maximum Mana","Skills Cost Energy Shield instead of Mana or Life"],"implicitMods":["18% faster start of Energy Shield Recharge"],"flavourText":["In the Atlas, you do not go mad. You are rewritten."],"frameType":3,"x":0,"y":0,"inventoryId":"Amulet","enchantMods":["Allocates Window of Opportunity"]},{"verified":false,"w":2,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQmVsdHMvSW5qZWN0b3JCZWx0IiwidyI6MiwiaCI6MSwic2NhbGUiOjEsInJlbGljIjo4fV0/d2868a013e/InjectorBelt.png","league":"Mercenaries","id":"669cbf1993dcb8a80ff9653ba33a52a6ff6abe59c609aa88fef9b9c309732207","name":"Mageblood","typeLine":"Heavy Belt","baseType":"Heavy Belt","rarity":"Unique","ilvl":84,"identified":true,"properties":[{"name":"Quality (Attribute Modifiers)","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["44",0]],"displayMode":0,"type":62}],"explicitMods":["+58 to Dexterity","+21% to Fire Resistance","+15% to Cold Resistance","Magic Utility Flasks cannot be Used","Leftmost 4 Magic Utility Flasks constantly apply their Flask Effects to you","Magic Utility Flask Effects cannot be removed"],"implicitMods":["+42 to Strength"],"flavourText":["Rivers of power course through your veins."],"frameType":10,"x":0,"y":0,"inventoryId":"Belt","corrupted":true,"isRelic":true,"foilVariation":8},{"verified":false,"w":1,"h":2,"icon":"https://web.poecdn.com/gen/image/WzksMTQseyJmIjoiMkRJdGVtcy9GbGFza3MvcnVieSIsInciOjEsImgiOjIsInNjYWxlIjoxLCJsZXZlbCI6MSwiZnMiOnRydWV9XQ/e6ecc91189/ruby.png","league":"Mercenaries","id":"c24f9466dfff1291253aacc7c4183ae61a0ce7eec46e746a506bb5bb47d9bc24","name":"","typeLine":"Alchemist's Ruby Flask of Bracing","baseType":"Ruby Flask","rarity":"Magic","ilvl":85,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Lasts {0} Seconds","values":[["7.30",1]],"displayMode":3},{"name":"Consumes {0} of {1} Charges on use","values":[["20",0],["50",0]],"displayMode":3},{"name":"Currently has {0} Charges","values":[["50",0]],"displayMode":3}],"requirements":[{"name":"Level","values":[["64",0]],"displayMode":0,"type":62}],"explicitMods":["24% reduced Duration","25% increased effect","58% increased Block and Stun Recovery during Effect"],"descrText":"Right click to drink. Can only hold charges while in belt. Refills as you kill monsters.","frameType":1,"x":2,"y":0,"inventoryId":"Flask","enchantMods":["70% increased effect","Gains no Charges during Effect"],"utilityMods":["+5% to maximum Fire Resistance","+40% to Fire Resistance"]},{"verified":false,"w":2,"h":2,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9IZWxtZXRzL01pbmRCbG9ja01hc2siLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d/aeb4a78ada/MindBlockMask.png","league":"Mercenaries","id":"e9fa017653c0ded0486713cc80c928ab15fe27f458596f6f8c4923cfb53f729f","name":"Willclash","typeLine":"Golden Mask","baseType":"Golden Mask","rarity":"Unique","ilvl":84,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Evasion Rating","values":[["545",1]],"displayMode":0,"type":17},{"name":"Energy Shield","values":[["113",1]],"displayMode":0,"type":18}],"requirements":[{"name":"Level","values":[["72",0]],"displayMode":0,"type":62,"suffix":"(gem)"},{"name":"Str","values":[["68",0]],"displayMode":1,"type":63,"suffix":"(gem)"},{"name":"Dex","values":[["155",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["159",0]],"displayMode":1,"type":65,"suffix":"(gem)"}],"explicitMods":["350% increased Evasion and Energy Shield","+5% Chance to Block Spell Damage per Power Charge","4% increased Elemental Damage per Power charge","Gain a Power Charge every Second if you haven't lost Power Charges Recently","Lose all Power Charges when you Block"],"implicitMods":["+1 to Maximum Power Charges"],"flavourText":["Obtaining information depends upon pretending one already has it."],"frameType":3,"x":0,"y":0,"inventoryId":"Helm","corrupted":true,"sockets":[{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"D","sColour":"G"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0VubGlnaHRlbiIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/05a949e270/Enlighten.png","support":true,"league":"Mercenaries","id":"95d37d3e24b87a2e179d63c98300ba89f837814f5d44d722cffbbd41deac1683","name":"","typeLine":"Enlighten Support","baseType":"Enlighten Support","ilvl":0,"identified":true,"properties":[{"name":"Exceptional, Support","values":[],"displayMode":0},{"name":"Level","values":[["3 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["92%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["45",0]],"displayMode":0,"type":62},{"name":"Int","values":[["73",0]],"displayMode":1,"type":65}],"explicitMods":["This Gem gains 100% increased Experience"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill gem. Once this gem reaches level 2 or above, will apply a cost \u0026 reservation multiplier to supported gems. Cannot support skills that don't come from gems.","frameType":4,"socket":0,"colour":"I","corrupted":true},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9EaXNjaXBsaW5lIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/d802479c30/Discipline.png","support":false,"league":"Mercenaries","id":"b5a2d1357f32838a1dc653fa3c5007195023a0175b7b7beb17847a1bdf332f53","name":"","typeLine":"Discipline","baseType":"Discipline","ilvl":0,"identified":true,"properties":[{"name":"Aura, Spell, AoE","values":[],"displayMode":0},{"name":"Level","values":[["21 (Max)",0]],"displayMode":0,"type":5},{"name":"Reservation","values":[["35% Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["1.20 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["72",0]],"displayMode":0,"type":62},{"name":"Int","values":[["159",0]],"displayMode":1,"type":65}],"explicitMods":["+2 metres to radius","You and nearby allies gain 221 additional Energy Shield","You and nearby Allies gain 30% increased Energy Shield Recharge Rate"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Casts an aura that grants additional energy shield and increased energy shield recharge rate to you and your allies.","frameType":4,"socket":1,"colour":"I","corrupted":true},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9QdXJpdHkiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/0b82235250/Purity.png","support":false,"league":"Mercenaries","id":"bfa12accefac8a5bc82be67716021774c6967da178c9c649eacb82d7f1a7d737","name":"","typeLine":"Purity of Elements","baseType":"Purity of Elements","ilvl":0,"identified":true,"properties":[{"name":"Aura, Spell, AoE","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Reservation","values":[["50% Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["1.20 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["68",0]],"displayMode":1,"type":63},{"name":"Int","values":[["98",0]],"displayMode":1,"type":65}],"explicitMods":["+1.9 metres to radius","You and nearby allies gain +39% to all Elemental Resistances","You and nearby allies are Immune to all Elemental Ailments"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Casts an aura that grants elemental resistances and elemental ailment immunity to you and your allies.","frameType":4,"socket":2,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9HcmFjZSIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/0d4fbca4ae/Grace.png","support":false,"league":"Mercenaries","id":"b0c94430bdabc68fd956a5dde1100c96b761ca0bf99ae12fefc12a9d525332af","name":"","typeLine":"Grace","baseType":"Grace","ilvl":0,"identified":true,"properties":[{"name":"Aura, Spell, AoE","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Reservation","values":[["50% Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["1.20 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["155",0]],"displayMode":1,"type":64}],"explicitMods":["+1.9 metres to radius","40% increased Area of Effect","You and nearby allies gain 1545 additional Evasion Rating","You and nearby allies gain 29% more Evasion rating"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Casts an aura that grants evasion to you and your allies.","frameType":4,"socket":3,"colour":"D"}]},{"verified":false,"w":1,"h":2,"icon":"https://web.poecdn.com/gen/image/WzksMTQseyJmIjoiMkRJdGVtcy9GbGFza3MvQm90dGxlZEZ1dHVyZXMiLCJ3IjoxLCJoIjoyLCJzY2FsZSI6MSwibGV2ZWwiOjEsImZpIjp0cnVlfV0/b19cc88881/BottledFutures.png","league":"Mercenaries","id":"11d117e91cab32008a641cb8be4d62cea1bd5a2d46bbdd52ea597f3762d6492b","name":"Wine of the Prophet","typeLine":"Gold Flask","baseType":"Gold Flask","rarity":"Unique","ilvl":86,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Lasts {0} Seconds","values":[["6",1]],"displayMode":3},{"name":"Consumes {0} of {1} Charges on use","values":[["75",1],["140",1]],"displayMode":3},{"name":"Currently has {0} Charges","values":[["140",0]],"displayMode":3}],"requirements":[{"name":"Level","values":[["33",0]],"displayMode":0,"type":62}],"explicitMods":["+60 to Maximum Charges","25% increased Charges per use","Grants a random Divination Buff for 20 seconds when Used"],"descrText":"Right click to drink. Can only hold charges while in belt. Refills as you kill monsters.","flavourText":["\"To proclaim a vision of the future is to make it so,\r","for those that have the will, and the way!\"\r","- High Templar Andronicus"],"frameType":3,"x":0,"y":0,"inventoryId":"Flask","enchantMods":["Used when Charges reach full"],"utilityMods":["30% increased Rarity of Items found"]},{"verified":false,"w":2,"h":2,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9Cb290cy9SYWxha2VzaHNJbXBhdGllbmNlIiwidyI6MiwiaCI6Miwic2NhbGUiOjF9XQ/54540f0f3d/RalakeshsImpatience.png","league":"Mercenaries","id":"8f6c2b6e4516cce8eae75b07958b40afdc4555f7d2fb08b3c7d9d3fedd18b4d5","name":"Ralakesh's Impatience","typeLine":"Riveted Boots","baseType":"Riveted Boots","rarity":"Unique","ilvl":85,"identified":true,"properties":[{"name":"Armour","values":[["70",0]],"displayMode":0,"type":16},{"name":"Energy Shield","values":[["15",0]],"displayMode":0,"type":18}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62,"suffix":"(gem)"},{"name":"Str","values":[["155",0]],"displayMode":1,"type":63,"suffix":"(gem)"},{"name":"Dex","values":[["68",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["98",0]],"displayMode":1,"type":65,"suffix":"(gem)"}],"explicitMods":["+17% to Cold Resistance","+17% to Chaos Resistance","16% increased Movement Speed","Corrupted Blood cannot be inflicted on you","Count as having maximum number of Power Charges"],"flavourText":["The Master of a Million Faces lived by one\r","simple ethos: why make the effort, when\r","you can simply mimic what others have?"],"frameType":3,"x":0,"y":0,"inventoryId":"Boots","corrupted":true,"sockets":[{"group":0,"attr":"G","sColour":"W"},{"group":0,"attr":"S","sColour":"R"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"S","sColour":"R"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9JbW1vcnRhbENhbGwiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/a88b3eb5d4/ImmortalCall.png","support":false,"league":"Mercenaries","id":"c43cb877d88c4b9c6a7e583f44828ee746f55831b7b49bf6f04f56affb94f486","name":"","typeLine":"Immortal Call","baseType":"Immortal Call","ilvl":0,"identified":true,"properties":[{"name":"Spell, Duration, Guard","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["36 Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["3.00 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["155",0]],"displayMode":1,"type":63}],"explicitMods":["Base duration is 1.00 seconds","20% increased Buff Duration per Endurance Charge removed","20% increased Cooldown Recovery Rate","This Skill's Cooldown does not recover during its effect","34% less Elemental Damage taken","35% less Physical Damage taken","15.0% less Physical Damage taken per Endurance Charge removed"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Take less Physical and Elemental Damage for a short time. Consumes up to 5 Endurance Charges to lengthen the buff and further lessen Physical Damage taken. Shares a cooldown with other Guard skills.","frameType":4,"socket":0,"colour":"S"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0Nhc3RPbkRtZ1Rha2VuIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/2f075f5964/CastOnDmgTaken.png","support":true,"league":"Mercenaries","id":"c238938506473ea2b4ca10bfc89b749dc64e927366e95dfd0100e6d447528fbe","name":"","typeLine":"Cast when Damage Taken Support","baseType":"Cast when Damage Taken Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Spell, Trigger","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["250%",0]],"displayMode":0},{"name":"Cooldown Time","values":[["0.25 sec",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["70",0]],"displayMode":1,"type":63},{"name":"Int","values":[["48",0]],"displayMode":1,"type":65}],"explicitMods":["This Gem can only Support Skill Gems requiring Level 70 or lower","Supported Skills deal 27% less Damage","Trigger Supported Spells when you take 3272 total Damage from Hits","Supported Skills require 10% reduced amount of Damage taken to Trigger"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Each supported spell skill will track damage you take, and be triggered when the total damage taken reaches a threshold. Cannot support skills used by totems, traps, or mines. Vaal skills, channelling skills, and skills with a reservation cannot be triggered.","frameType":4,"socket":1,"colour":"S"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9Gcm9zdEdsb2JlIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/c9d8957c73/FrostGlobe.png","support":false,"league":"Mercenaries","id":"6f64f4a565b506020b202a5b1c8f94c6146776487f8da4e120241147fce6270c","name":"","typeLine":"Frost Shield","baseType":"Frost Shield","ilvl":0,"identified":true,"properties":[{"name":"Critical, Spell, AoE, Duration, Cold","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["54 Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["5.00 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["0.50 sec",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["68",0]],"displayMode":1,"type":64},{"name":"Int","values":[["98",0]],"displayMode":1,"type":65}],"explicitMods":["Base duration is 10.00 seconds","20% increased Effect of Cold Ailments","20% of Damage dealt to you or Allies in Area with Hits by Enemies in Area is taken from Frost Shield's Life before your Life or Energy Shield","60% of Damage dealt to you or Allies in Area with Hits by Enemies outside Area is taken from Frost Shield's Life before your Life or Energy Shield","You gain +0.38% to Spell Critical Strike Chance per Stage while in Area","Frost Shield has 910 maximum Life per Stage","Maximum 4 Stages","Gains 1 Stage every 0.3 seconds while you are losing Energy Shield","You lose 730 Energy Shield per second"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Place a Frost Shield that drains your energy shield for one second or until you run out, gaining stages while this drain occurs. The Frost Shield takes some damage from hits in place of you and allies while in its area. Enemies in the area are Chilled. You can only have one Frost Shield active at once.","frameType":4,"socket":2,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9Sb2NrR29sZW0iLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/f0d237e67b/RockGolem.png","support":false,"league":"Mercenaries","id":"4fc78d0126709118d3b696b053ba116c0fafe54bd44e86c7c886cb96186486df","name":"","typeLine":"Summon Stone Golem","baseType":"Summon Stone Golem","ilvl":0,"identified":true,"properties":[{"name":"Minion, Spell, Golem, Physical","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["54 Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["6.00 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["1.00 sec",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["98",0]],"displayMode":1,"type":63},{"name":"Dex","values":[["68",0]],"displayMode":1,"type":64}],"explicitMods":["Maximum 1 Summoned Golem","Golems grant 105 Life Regenerated per second","Golems grant 20% increased Defences","20% increased Buff Effect"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Summons a Stone Golem that grants you life regeneration and defences. In addition to its melee attack, the Stone Golem uses a rolling charge and a powerful slam that can taunt enemies.","frameType":4,"socket":3,"colour":"S"}]},{"verified":false,"w":1,"h":2,"icon":"https://web.poecdn.com/gen/image/WzksMTQseyJmIjoiMkRJdGVtcy9GbGFza3MvZXZhc2lvbmZsYXNrMDEiLCJ3IjoxLCJoIjoyLCJzY2FsZSI6MSwibGV2ZWwiOjEsImZzIjp0cnVlfV0/1acca1132e/evasionflask01.png","league":"Mercenaries","id":"8b24b7a496682c8876c9b10e814d84b9feedacbcf475ec2dc5e45edbbf874e1b","name":"","typeLine":"Dabbler's Jade Flask of the Cheetah","baseType":"Jade Flask","rarity":"Magic","ilvl":85,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Lasts {0} Seconds","values":[["5",1]],"displayMode":3},{"name":"Consumes {0} of {1} Charges on use","values":[["30",0],["60",0]],"displayMode":3},{"name":"Currently has {0} Charges","values":[["60",0]],"displayMode":3}],"requirements":[{"name":"Level","values":[["68",0]],"displayMode":0,"type":62}],"explicitMods":["30% reduced Duration","25% increased effect","12% increased Movement Speed during Effect"],"descrText":"Right click to drink. Can only hold charges while in belt. Refills as you kill monsters.","frameType":1,"x":1,"y":0,"inventoryId":"Flask","enchantMods":["70% increased effect","Gains no Charges during Effect"],"utilityMods":["+1500 to Evasion Rating"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvUmluZ3MvQ2lyY2xlb2ZEYXJrUml0dWFscyIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/15e83a745c/CircleofDarkRituals.png","league":"Mercenaries","id":"9fc77c3419d38204f94593ea90cae5ff2976bbaa2e2d2f543f3d7e4c9cf33e28","name":"Coiling Whisper","typeLine":"Amethyst Ring","baseType":"Amethyst Ring","rarity":"Unique","ilvl":85,"identified":true,"requirements":[{"name":"Level","values":[["32",0]],"displayMode":0,"type":62}],"explicitMods":["37% reduced Area of Effect of Hex Skills","Targets are Unaffected by your Hexes","When 90% of your Hex's Duration Expires on an Enemy, Eat 1 Soul per Enemy Power"],"implicitMods":["+18% to Chaos Resistance"],"flavourText":["I never knew fear until she was ripped away.\r","My promises were hollow ever after."],"frameType":3,"x":0,"y":0,"inventoryId":"Ring2","corrupted":true},{"verified":false,"w":1,"h":3,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvV2VhcG9ucy9PbmVIYW5kV2VhcG9ucy9XYW5kcy9Wb2lkQmF0dGVyeSIsInciOjEsImgiOjMsInNjYWxlIjoxfV0/71a0fdc8db/VoidBattery.png","league":"Mercenaries","id":"988990a63d19165819e1d6cf4c50ac55840de9ff020e327ac05d937a7aa42bdd","name":"Void Battery","typeLine":"Prophecy Wand","baseType":"Prophecy Wand","rarity":"Unique","ilvl":85,"identified":true,"properties":[{"name":"Wand","values":[],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Physical Damage","values":[["34-62",1]],"displayMode":0,"type":9},{"name":"Critical Strike Chance","values":[["10.00%",0]],"displayMode":0,"type":12},{"name":"Attacks per Second","values":[["1.40",0]],"displayMode":0,"type":13}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62,"suffix":"(gem)"},{"name":"Dex","values":[["98",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["245",0]],"displayMode":1,"type":65}],"explicitMods":["80% reduced Spell Damage","19% increased Cast Speed","53% increased Global Critical Strike Chance","+43 to maximum Mana","+1 to Maximum Power Charges","25% increased Spell Damage per Power Charge"],"implicitMods":["36% increased Spell Damage"],"flavourText":["\"The trick is to give nothingness,\r","and to receive everything in return.\"\r","- Inquisitor Maligaro"],"frameType":3,"x":0,"y":0,"inventoryId":"Weapon","sockets":[{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"I","sColour":"B"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9XaXRoZXJpbmdTdGVwR2VtIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/9f7784c2fa/WitheringStepGem.png","support":false,"league":"Mercenaries","id":"01e19116fa87abb021db43d83c7bc95cba5d72a4a8a7c03ccdabc206d2387223","name":"","typeLine":"Withering Step","baseType":"Withering Step","ilvl":0,"identified":true,"properties":[{"name":"Travel, AoE, Chaos, Movement, Blink, Spell, Duration","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["23 Mana",0]],"displayMode":0},{"name":"Cooldown Time","values":[["3.00 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["98",0]],"displayMode":1,"type":64},{"name":"Int","values":[["68",0]],"displayMode":1,"type":65}],"explicitMods":["Withered lasts 3 seconds","+0.6 metres to radius","Cannot be Cast or Triggered while Elusive\nGrants Elusive","This Skill's Cooldown does not recover during its effect","38% increased Effect of Elusive from this Skill","Inflicts 8 Withered Debuffs the first time each Enemy enters the Area","Buff grants Phasing"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Grants Elusive and a buff that grants Phasing. While you have this buff, monsters that enter an area around you will be Withered. Using a skill or losing the Elusive buff ends this skill's effects. Shares a cooldown with other Blink skills. Cannot be used while already Elusive.","frameType":4,"socket":0,"colour":"D"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L2VuaGFuY2UiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/9f8df30377/enhance.png","support":true,"league":"Mercenaries","id":"4bbe8121443a03f8d3d3f4f01ae8a9020fefe66814f3039625a8d5b173d7f924","name":"","typeLine":"Enhance Support","baseType":"Enhance Support","ilvl":0,"identified":true,"properties":[{"name":"Exceptional, Support","values":[],"displayMode":0},{"name":"Level","values":[["3 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["120%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["45",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["73",0]],"displayMode":1,"type":64}],"explicitMods":["This Gem gains 100% increased Experience","+16% to Quality of Supported Skill Gems"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill gem. Once this gem reaches level 2 or above, will raise the quality of supported gems. Cannot support skills that don't come from gems.","frameType":4,"socket":1,"colour":"D"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9BdXRvQ2FzdEluc3RhbnRTa2lsbHMiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/ec5d94a83e/AutoCastInstantSkills.png","support":false,"league":"Mercenaries","id":"2579ad6d7406cb4e6ad80c04907c779bb180d09ac2e8e0727884a77b35e97f59","name":"","typeLine":"Automation Support","baseType":"Automation","ilvl":0,"identified":true,"properties":[{"name":"Trigger, Spell","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cooldown Time","values":[["0.60 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["68",0]],"displayMode":1,"type":64},{"name":"Int","values":[["98",0]],"displayMode":1,"type":65}],"explicitMods":["Each Supported Spell will Trigger when its Cooldown is over"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"While this skill is active, supported spells will be repeatedly triggered.","frameType":4,"socket":2,"colour":"I","hybrid":{"baseTypeName":"Automation","properties":[{"name":"Cost \u0026 Reservation Multiplier","values":[["150%",0]],"displayMode":0}],"explicitMods":["Supported Spells are Triggered when their Cooldowns are over"],"secDescrText":"Supports spell skills that are instant and have no reservation. Cannot support Vaal skills or skills used by totems, traps or mines. Cannot modify the skills of minions."}}]},{"verified":false,"w":1,"h":2,"icon":"https://web.poecdn.com/gen/image/WzksMTQseyJmIjoiMkRJdGVtcy9GbGFza3Mvc2FwcGhpcmUiLCJ3IjoxLCJoIjoyLCJzY2FsZSI6MSwibGV2ZWwiOjEsImZzIjp0cnVlfV0/e14b38eac2/sapphire.png","league":"Mercenaries","id":"ad2edf05172aff337b2a17ae20ac3696a67e15d6c87c636a2737c7e06d083368","name":"","typeLine":"Dabbler's Sapphire Flask of the Gazelle","baseType":"Sapphire Flask","rarity":"Magic","ilvl":85,"identified":true,"properties":[{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6},{"name":"Lasts {0} Seconds","values":[["6.60",1]],"displayMode":3},{"name":"Consumes {0} of {1} Charges on use","values":[["20",0],["50",0]],"displayMode":3},{"name":"Currently has {0} Charges","values":[["50",0]],"displayMode":3}],"requirements":[{"name":"Level","values":[["40",0]],"displayMode":0,"type":62}],"explicitMods":["31% reduced Duration","25% increased effect","45% increased Evasion Rating during Effect"],"descrText":"Right click to drink. Can only hold charges while in belt. Refills as you kill monsters.","frameType":1,"x":3,"y":0,"inventoryId":"Flask","enchantMods":["70% increased effect","Gains no Charges during Effect"],"utilityMods":["+5% to maximum Cold Resistance","+40% to Cold Resistance"]},{"verified":false,"w":2,"h":3,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9Cb2R5QXJtb3Vycy9Cb2R5U3RyRGV4SW50MUMiLCJ3IjoyLCJoIjozLCJzY2FsZSI6MSwic2VhcmluZyI6dHJ1ZSwidGFuZ2xlZCI6dHJ1ZX1d/0374235011/BodyStrDexInt1C.png","league":"Mercenaries","id":"e7cbb175c52f1264aa8869cab1b03a19031b716e1a834e907e076dc8d61e5e2e","name":"Cataclysm Veil","typeLine":"Twilight Regalia","baseType":"Twilight Regalia","rarity":"Rare","ilvl":86,"identified":true,"properties":[{"name":"Quality","values":[["+26%",1]],"displayMode":0,"type":6},{"name":"Energy Shield","values":[["1136",1]],"displayMode":0,"type":18}],"requirements":[{"name":"Level","values":[["84",0]],"displayMode":0,"type":62},{"name":"Str","values":[["111",0]],"displayMode":1,"type":63,"suffix":"(gem)"},{"name":"Dex","values":[["67",0]],"displayMode":1,"type":64,"suffix":"(gem)"},{"name":"Int","values":[["293",0]],"displayMode":1,"type":65}],"explicitMods":["+97 to maximum Energy Shield","126% increased Energy Shield","8% increased Stun and Block Recovery"],"implicitMods":["7% Chance to Block Attack Damage","+24% to Critical Strike Multiplier for Spell Damage"],"frameType":2,"x":0,"y":0,"inventoryId":"BodyArmour","craftedMods":["Can have up to 3 Crafted Modifiers","+25 to Dexterity and Intelligence","6% increased Attributes"],"sockets":[{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"D","sColour":"G"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"I","sColour":"B"},{"group":0,"attr":"S","sColour":"R"}],"socketedItems":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9SYWluT2ZCbGFkZXMiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MSwiZ3QiOnRydWV9XQ/92b0a3ac60/RainOfBlades.png","support":false,"league":"Mercenaries","id":"9a5976c378d1ea6470aaf859d5f6309d1e86cfc9a6cef035f364cc19d00a7248","name":"","typeLine":"Bladefall of Trarthus","baseType":"Bladefall of Trarthus","ilvl":0,"identified":true,"properties":[{"name":"Spell, AoE, Physical, Arcane, Duration","values":[],"displayMode":0},{"name":"Level","values":[["1",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["5% Mana per second",0]],"displayMode":0},{"name":"Cooldown Time","values":[["0.30 sec",0]],"displayMode":0},{"name":"Cast Time","values":[["Instant",0]],"displayMode":0},{"name":"Critical Strike Chance","values":[["6.00%",0]],"displayMode":0},{"name":"Effectiveness of Added Damage","values":[["120%",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["28",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["67",0]],"displayMode":1,"type":64}],"explicitMods":["Deals 26 to 39 Physical Damage","Base duration is 6.00 seconds","A Volley of blades falls every 0.7 seconds","2% increased Volley frequency per 100 maximum Mana","Base Volley radius is 2.5 metres","Base Blade radius is 1 metre","5 Blades fall per Volley, which will then Linger in the ground","Maximum 40 Lingering Blades can be left in the ground at a time"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Once activated, continuously spends mana to cause volleys of ethereal weapons rain from the sky around you, dealing damage to enemies they impact. Each Blade will target a separate enemy in the volley area if possible. Each enemy can only be hit once by each volley, even if multiple blades land near them. This skill cannot be triggered or used by Totems, Traps, or Mines.","frameType":4,"socket":0,"colour":"D","additionalProperties":[{"name":"Experience","values":[["199345/199345",0]],"displayMode":2,"type":20,"progress":1}],"nextLevelRequirements":[{"name":"Level","values":[["31",0]],"displayMode":0},{"name":"Dex","values":[["73",0]],"displayMode":1}]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9UZW1wb3JhbENoYWlucyIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/5d0aef0dab/TemporalChains.png","support":false,"league":"Mercenaries","id":"394384808ceec56fa69cd0eb7151c92249accedf647f67602fe53fe663e472ce","name":"","typeLine":"Temporal Chains","baseType":"Temporal Chains","ilvl":0,"identified":true,"properties":[{"name":"Spell, AoE, Duration, Curse, Hex","values":[],"displayMode":0},{"name":"Level","values":[["1",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["16 Mana",0]],"displayMode":0},{"name":"Cast Time","values":[["0.50 sec",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["24",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["37",0]],"displayMode":1,"type":64},{"name":"Int","values":[["25",0]],"displayMode":1,"type":65}],"explicitMods":["Base duration is 5.00 seconds","50% less Effect of Curse against Players","Cursed Normal and Magic Enemies have 15% less Action Speed","Other effects on Cursed enemies expire 25% slower","Cursed Rare and Unique Enemies have 9% less Action Speed"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Curses all enemies in an area, lowering their action speed and making other effects on them expire more slowly.","frameType":4,"socket":1,"colour":"D","additionalProperties":[{"name":"Experience","values":[["118383/118383",0]],"displayMode":2,"type":20,"progress":1}],"nextLevelRequirements":[{"name":"Level","values":[["27",0]],"displayMode":0},{"name":"Dex","values":[["41",0]],"displayMode":1},{"name":"Int","values":[["28",0]],"displayMode":1}]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L1N1cHBvcnRSYXBpZERlY2F5R2VtIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/bed2b2a224/SupportRapidDecayGem.png","support":true,"league":"Mercenaries","id":"f8096fcf4921fb3771058e294ca924d64e3e00c55f256e05c121548679f60736","name":"","typeLine":"Swift Affliction Support","baseType":"Swift Affliction Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Duration","values":[],"displayMode":0},{"name":"Level","values":[["1",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["140%",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["31",0]],"displayMode":0,"type":62},{"name":"Dex","values":[["52",0]],"displayMode":1,"type":64}],"explicitMods":["Supported Skills deal 25% more Damage over Time","25% less Duration of Supported Skills and Damaging Ailments they inflict"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill that has a duration, or can hit enemies to inflict ailments on them.","frameType":4,"socket":2,"colour":"D","additionalProperties":[{"name":"Experience","values":[["285815/285815",0]],"displayMode":2,"type":20,"progress":1}],"nextLevelRequirements":[{"name":"Level","values":[["34",0]],"displayMode":0},{"name":"Dex","values":[["57",0]],"displayMode":1}]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L0N1cnNlT25IaXQiLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/da0ae156c5/CurseOnHit.png","support":true,"league":"Mercenaries","id":"a018487ec4cc9e56949d42f81c0a63329e9907b295361240795c69d19747d7e6","name":"","typeLine":"Hextouch Support","baseType":"Hextouch Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Hex, Trigger","values":[],"displayMode":0},{"name":"Level","values":[["1",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["130%",0]],"displayMode":0}],"requirements":[{"name":"Level","values":[["38",0]],"displayMode":0,"type":62},{"name":"Int","values":[["63",0]],"displayMode":1,"type":65}],"explicitMods":["Supported Skills apply supported Curses on Hit","You cannot Cast Supported Curse Spells","35% less Effect of Supported Curses","Supported Skills have 50% reduced Curse Duration"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Must support both a skill that hits enemies, and a hex curse skill to work. The hex will be applied when enemies are hit by the other skill. Cannot support totems, traps, or mines. Minions cannot apply hexes this way.","frameType":4,"socket":3,"colour":"I","additionalProperties":[{"name":"Experience","values":[["388734/388734",0]],"displayMode":2,"type":20,"progress":1}],"nextLevelRequirements":[{"name":"Level","values":[["40",0]],"displayMode":0},{"name":"Int","values":[["66",0]],"displayMode":1}]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzMwLDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9MaWdodG5pbmdXYXJwIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/ca350bc087/LightningWarp.png","support":false,"league":"Mercenaries","id":"eeb3c4c4398e20729ff0b19dbcadcb9e7e6b1f49cdcccf8e5b9c6437c535f05b","name":"","typeLine":"Lightning Warp","baseType":"Lightning Warp","ilvl":0,"identified":true,"properties":[{"name":"Spell, AoE, Duration, Movement, Lightning, Travel","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost","values":[["26 Mana",0]],"displayMode":0},{"name":"Cast Time","values":[["0.70 sec",0]],"displayMode":0},{"name":"Critical Strike Chance","values":[["5.00%",0]],"displayMode":0},{"name":"Effectiveness of Added Damage","values":[["90%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Int","values":[["155",0]],"displayMode":1,"type":65}],"explicitMods":["Deals 51 to 965 Lightning Damage","20% increased Cast Speed","+0.4 metres to radius","Can queue up to 50 uses","49% reduced Duration"],"descrText":"Place into an item socket of the right colour to gain this skill. Right click to remove from a socket.","secDescrText":"Waits for a duration before teleporting to a targeted destination, with the duration based on the distance and your movement speed. When the teleport occurs, lightning damage is dealt to the area around both where the player was and where they teleported to. Casting again will queue up multiple teleportations to occur in sequence.","frameType":4,"socket":4,"colour":"I"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvR2Vtcy9TdXBwb3J0L1JlZHVjZUR1cmF0aW9uIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/ab88044f5f/ReduceDuration.png","support":true,"league":"Mercenaries","id":"29b8bbd677f731a758397c27b6eaa542e6ebcf7a456e3849cd3ad9a35a015d8a","name":"","typeLine":"Less Duration Support","baseType":"Less Duration Support","ilvl":0,"identified":true,"properties":[{"name":"Support, Duration","values":[],"displayMode":0},{"name":"Level","values":[["20 (Max)",0]],"displayMode":0,"type":5},{"name":"Cost \u0026 Reservation Multiplier","values":[["130%",0]],"displayMode":0},{"name":"Quality","values":[["+20%",1]],"displayMode":0,"type":6}],"requirements":[{"name":"Level","values":[["70",0]],"displayMode":0,"type":62},{"name":"Str","values":[["111",0]],"displayMode":1,"type":63}],"explicitMods":["Supported Skills deal 19% more Damage","Supported Skills have 59% less Skill Effect Duration"],"descrText":"This is a Support Gem. It does not grant a bonus to your character, but to skills in sockets connected to it. Place into an item socket connected to a socket containing the Skill Gem you wish to augment. Right click to remove from a socket.","secDescrText":"Supports any skill that has a duration.","frameType":4,"socket":5,"colour":"S"}],"searing":true,"tangled":true,"split":true}],"character":{"name":"JetTwoHolidayy","realm":"pc","class":"Occultist","league":"Mercenaries","level":98}} | |||
There was a problem hiding this comment.
This looks like a large, build-specific JSON blob being added to the repo. If it’s only for local debugging of HeadlessWrapper.lua, it’s better kept out of version control (add to .gitignore) or moved to a small, curated test fixture under spec/TestBuilds/tests with a clear purpose to avoid repo bloat and accidental inclusion of personal/exported data.
| @@ -0,0 +1 @@ | |||
| {"character":3,"ascendancy":1,"alternate_ascendancy":0,"hashes":[1593,4367,4397,5296,5743,5935,6728,6770,7388,7444,7960,9261,9567,11420,11455,11730,12246,12536,12783,12888,13232,15064,15117,15631,16123,16954,18182,18769,19501,20528,20832,20987,21033,21974,21984,22577,22618,23659,25411,25535,25831,26196,26270,27096,27656,27733,29199,30370,31875,31931,31984,32176,32241,32417,32932,33310,33435,33864,34171,34173,35958,36452,36542,36634,36678,36858,37127,37492,37569,37999,39841,42760,43988,44184,45558,46340,46842,46897,46904,47197,48124,49605,50029,51219,51804,52502,52742,53456,55230,56158,56295,57264,58210,58218,60259,60398,60440,60472,61419,61653,61834,62214,62504,62970,63398,63447,64210,64426],"hashes_ex":[1,3,5,7,9,12,13,14,16,30,32,33,34,36,37,198,200,202,204,206],"mastery_effects":{"16123":2987,"25535":45307,"27733":23471,"32241":47642,"45558":30612,"47197":61097,"55230":62252},"skill_overrides":{"15064":{"activeEffectImage":"Art/2DArt/UIImages/InGame/AncestralTrial/PassiveTreeTattoos/NgamahuTribePassiveBG.png","icon":"Art/2DArt/SkillIcons/passives/FireResistNode.png","isTattoo":true,"name":"Tattoo of the Ngamahu Firewalker","stats":["+6% to Fire Resistance"]},"31931":{"activeEffectImage":"Art/2DArt/UIImages/InGame/AncestralTrial/PassiveTreeTattoos/NgamahuTribePassiveBG.png","icon":"Art/2DArt/SkillIcons/passives/FireResistNode.png","isTattoo":true,"name":"Tattoo of the Ngamahu Firewalker","stats":["+6% to Fire Resistance"]},"32241":{"activeEffectImage":"Art/2DArt/UIImages/InGame/Village/RuneCraftingPassiveBG.png","activeIcon":"Art/2DArt/SkillIcons/passives/AtlasTrees/RuneGraftingIcon1.png","icon":"Art/2DArt/SkillIcons/passives/AtlasTrees/RuneGraftingIcon1.png","inactiveIcon":"Art/2DArt/SkillIcons/passives/AtlasTrees/RuneGraftingIcon1.png","isMastery":true,"name":"Runegraft of the Fortress","reminderText":["(Attributes are Strength, Dexterity, and Intelligence)","(Armour, Evasion Rating and Energy Shield are the standard Defences)"],"stats":["10% reduced Attributes","40% increased Global Defences"]},"34171":{"activeEffectImage":"Art/2DArt/UIImages/InGame/AncestralTrial/PassiveTreeTattoos/NgamahuTribePassiveBG.png","icon":"Art/2DArt/SkillIcons/passives/FireResistNode.png","isTattoo":true,"name":"Tattoo of the Ngamahu Firewalker","stats":["+6% to Fire Resistance"]},"60472":{"activeEffectImage":"Art/2DArt/UIImages/InGame/AncestralTrial/PassiveTreeTattoos/NgamahuTribePassiveBG.png","icon":"Art/2DArt/SkillIcons/passives/FireResistNode.png","isTattoo":true,"name":"Tattoo of the Ngamahu Firewalker","stats":["+6% to Fire Resistance"]}},"items":[{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL05ld0dlbUJhc2UzIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/db35e60885/NewGemBase3.png","league":"Mercenaries","id":"c96f429159b886b7d1f4ab95983263036d706b2eb83866b7e390cb565636646f","name":"Brood Wound","typeLine":"Large Cluster Jewel","baseType":"Large Cluster Jewel","rarity":"Rare","ilvl":83,"identified":true,"explicitMods":["Added Small Passive Skills also grant: +3 to Dexterity","1 Added Passive Skill is Touch of Cruelty","1 Added Passive Skill is Unholy Grace","1 Added Passive Skill is Unwaveringly Evil"],"descrText":"Place into an allocated Large Jewel Socket on the Passive Skill Tree. Added passives do not interact with jewel radiuses. Right click to remove from the Socket.","frameType":2,"x":20,"y":0,"inventoryId":"PassiveJewels","enchantMods":["Adds 8 Passive Skills","2 Added Passive Skills are Jewel Sockets","Added Small Passive Skills grant: 12% increased Chaos Damage"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL3VuaXF1ZTE5IiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/72dbd8bd3d/unique19.png","league":"Mercenaries","id":"6be5e8a64248647059a9560a36fbe291cbccd7928a256dfef90c7175af87204e","name":"The Balance of Terror","typeLine":"Cobalt Jewel","baseType":"Cobalt Jewel","rarity":"Unique","ilvl":85,"identified":true,"properties":[{"name":"Limited to","values":[["1",0]],"displayMode":0}],"explicitMods":["+13% to all Elemental Resistances","Inflict Withered for 2 seconds on Hit if you've cast Despair in the past 10 seconds","You are Unaffected by Ignite if you've cast Flammability in the past 10 seconds"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","flavourText":["Fellshrine stood as a holy bastion opposite the\r","Chamber of Sins, and all that it represented.\r","For one to rise, the other must fall."],"frameType":3,"x":53,"y":0,"inventoryId":"PassiveJewels"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL2Jhc2ljaW50IiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/510013aec2/basicint.png","league":"Mercenaries","id":"d8aaaa50a7db22affd190fa19d50e538817581231d5f5318f07979d2c9658b8a","name":"Maelström Star","typeLine":"Cobalt Jewel","baseType":"Cobalt Jewel","rarity":"Rare","ilvl":84,"identified":true,"explicitMods":["+18% to Critical Strike Multiplier with Lightning Skills","7% increased maximum Energy Shield","+9% to all Elemental Resistances","+12% to Fire and Cold Resistances"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","frameType":2,"x":1,"y":0,"inventoryId":"PassiveJewels"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL05ld0dlbUJhc2UzIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/db35e60885/NewGemBase3.png","league":"Mercenaries","id":"b17e83ffdb3570bc40ff9f4522314c8df349123df514b020dcd983b37aba236e","name":"Apocalypse Vessel","typeLine":"Large Cluster Jewel","baseType":"Large Cluster Jewel","rarity":"Rare","ilvl":70,"identified":true,"explicitMods":["Added Small Passive Skills also grant: +2% to all Elemental Resistances","Added Small Passive Skills also grant: +7 to Maximum Energy Shield","1 Added Passive Skill is Unholy Grace","1 Added Passive Skill is Unwaveringly Evil"],"descrText":"Place into an allocated Large Jewel Socket on the Passive Skill Tree. Added passives do not interact with jewel radiuses. Right click to remove from the Socket.","frameType":2,"x":11,"y":0,"inventoryId":"PassiveJewels","requirements":[{"name":"Level","values":[["54",0]],"displayMode":0,"type":62}],"enchantMods":["Adds 8 Passive Skills","2 Added Passive Skills are Jewel Sockets","Added Small Passive Skills grant: 12% increased Chaos Damage"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL2Jhc2ljaW50IiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/510013aec2/basicint.png","league":"Mercenaries","id":"8e863369034b4684ec0b7ca2ac00a06ba6732705e05b727d57e2f0c8a65c28fc","name":"Gale Cut","typeLine":"Cobalt Jewel","baseType":"Cobalt Jewel","rarity":"Rare","ilvl":83,"identified":true,"explicitMods":["16% increased Spell Damage while holding a Shield","+10% to Global Critical Strike Multiplier","6% increased maximum Energy Shield","20% increased Burning Damage"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","frameType":2,"x":51,"y":0,"inventoryId":"PassiveJewels","corrupted":true,"implicitMods":["24% reduced Effect of Chill on you"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL05ld0dlbUJhc2UxIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/0eb1a9d981/NewGemBase1.png","league":"Mercenaries","id":"1afdd36def77a899ed1beb0466a2fcf7632c8b04bad2f664f6ccef9a5d2819ab","name":"Rapture Glisten","typeLine":"Small Cluster Jewel","baseType":"Small Cluster Jewel","rarity":"Rare","ilvl":84,"identified":true,"explicitMods":["Added Small Passive Skills also grant: +4% to Chaos Resistance","Added Small Passive Skills also grant: +3% to Fire Resistance","Added Small Passive Skills also grant: +13 to Maximum Energy Shield","1 Added Passive Skill is Enduring Composure"],"descrText":"Place into an allocated Small, Medium or Large Jewel Socket on the Passive Skill Tree. Added passives do not interact with jewel radiuses. Right click to remove from the Socket.","frameType":2,"x":26,"y":0,"inventoryId":"PassiveJewels","requirements":[{"name":"Level","values":[["62",0]],"displayMode":0,"type":62}],"enchantMods":["Adds 2 Passive Skills","Added Small Passive Skills grant: 15% increased Armour"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL2Jhc2ljaW50IiwidyI6MSwiaCI6MSwic2NhbGUiOjEsImZyYWN0dXJlZCI6dHJ1ZX1d/b470123709/basicint.png","league":"Mercenaries","id":"90d16fcc00d6504b446ad8e93f4b64b1bb326f30b3479a9937d5cac8f0b3c7bd","name":"Carrion Cut","typeLine":"Cobalt Jewel","baseType":"Cobalt Jewel","rarity":"Rare","ilvl":85,"identified":true,"explicitMods":["9% increased Damage","14% increased Spell Damage while holding a Shield","+13% to Critical Strike Multiplier for Spell Damage"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","frameType":2,"x":24,"y":0,"inventoryId":"PassiveJewels","fractured":true,"fracturedMods":["6% increased maximum Energy Shield"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL05ld0dlbUJhc2UyIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/78f6bf8356/NewGemBase2.png","league":"Mercenaries","id":"eb3593d3462bfcdb712e6cad06e7de91336e8234e52fe9b9437ccc70a037e92f","name":"Loath Heart","typeLine":"Medium Cluster Jewel","baseType":"Medium Cluster Jewel","rarity":"Rare","ilvl":84,"identified":true,"explicitMods":["Added Small Passive Skills also grant: +3 to All Attributes","Added Small Passive Skills also grant: 1% increased Area of Effect","1 Added Passive Skill is Magnifier","1 Added Passive Skill is Vast Power"],"descrText":"Place into an allocated Medium or Large Jewel Socket on the Passive Skill Tree. Added passives do not interact with jewel radiuses. Right click to remove from the Socket.","frameType":2,"x":21,"y":0,"inventoryId":"PassiveJewels","requirements":[{"name":"Level","values":[["54",0]],"displayMode":0,"type":62}],"enchantMods":["Adds 5 Passive Skills","1 Added Passive Skill is a Jewel Socket","Added Small Passive Skills grant: 10% increased Area Damage"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL05ld0dlbUJhc2UyIiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/78f6bf8356/NewGemBase2.png","league":"Mercenaries","id":"6234cb449c377fea88689c7e65ec57e6fc1ca12026ed0698bfc42a2f33981589","name":"Fulgent Glimmer","typeLine":"Medium Cluster Jewel","baseType":"Medium Cluster Jewel","rarity":"Rare","ilvl":84,"identified":true,"explicitMods":["Added Small Passive Skills also grant: +3 to All Attributes","Added Small Passive Skills also grant: 1% increased Area of Effect","1 Added Passive Skill is Magnifier","1 Added Passive Skill is Vast Power"],"descrText":"Place into an allocated Medium or Large Jewel Socket on the Passive Skill Tree. Added passives do not interact with jewel radiuses. Right click to remove from the Socket.","frameType":2,"x":23,"y":0,"inventoryId":"PassiveJewels","requirements":[{"name":"Level","values":[["54",0]],"displayMode":0,"type":62}],"enchantMods":["Adds 5 Passive Skills","1 Added Passive Skill is a Jewel Socket","Added Small Passive Skills grant: 10% increased Area Damage"]},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL1RlbXBsYXJDaXZpbGl6YXRpb24iLCJ3IjoxLCJoIjoxLCJzY2FsZSI6MX1d/09ecf8ac86/TemplarCivilization.png","league":"Mercenaries","id":"5617f008eb8bd44133933e6462e606ae17500ffb138e36a7bc11583540f97d63","name":"Militant Faith","typeLine":"Timeless Jewel","baseType":"Timeless Jewel","rarity":"Unique","ilvl":84,"identified":true,"properties":[{"name":"Limited to","values":[["1 Historic",0]],"displayMode":0},{"name":"Radius","values":[["Large",0]],"displayMode":0,"type":24}],"explicitMods":["Carved to glorify 9507 new faithful converted by High Templar Dominus\nPassives in radius are Conquered by the Templars","+2% to all Elemental Resistances per 10 Devotion","3% increased Defences from Equipped Shield per 10 Devotion","Historic"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","flavourText":["They believed themselves the utmost faithful, but that conviction became oppression."],"frameType":3,"x":14,"y":0,"inventoryId":"PassiveJewels"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL2Jhc2ljaW50IiwidyI6MSwiaCI6MSwic2NhbGUiOjF9XQ/510013aec2/basicint.png","league":"Mercenaries","id":"d5a41ee1fa4e0511c8a3d448c4f9ed360ef718814cf0d371adbea77a84bf0402","name":"Entropy Ruin","typeLine":"Cobalt Jewel","baseType":"Cobalt Jewel","rarity":"Rare","ilvl":79,"identified":true,"explicitMods":["16% increased Spell Damage while holding a Shield","+15% to Critical Strike Multiplier with Cold Skills","+8% to all Elemental Resistances","+11% to Fire and Cold Resistances"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","frameType":2,"x":5,"y":0,"inventoryId":"PassiveJewels"},{"verified":false,"w":1,"h":1,"icon":"https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvSmV3ZWxzL1RoZVJlZERyZWFtVXBncmFkZSIsInciOjEsImgiOjEsInNjYWxlIjoxfV0/69a20aa6e0/TheRedDreamUpgrade.png","league":"Mercenaries","id":"c13b180731f1347bb395de222fe6c0af2ea22ffc29210d464462c4a1c66ca96f","name":"The Red Nightmare","typeLine":"Crimson Jewel","baseType":"Crimson Jewel","rarity":"Unique","ilvl":85,"identified":true,"properties":[{"name":"Limited to","values":[["1",0]],"displayMode":0},{"name":"Radius","values":[["Large",0]],"displayMode":0,"type":24}],"explicitMods":["Gain 6% of Fire Damage as Extra Chaos Damage","Passives granting Fire Resistance or all Elemental Resistances in Radius\nalso grant Chance to Block Attack Damage at 50% of its value"],"descrText":"Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket.","flavourText":["We coagulate; a crimson shell\r","that suffocates the unworthy."],"frameType":3,"x":18,"y":0,"inventoryId":"PassiveJewels"}],"jewel_data":{"1":{"type":"JewelInt"},"11":{"type":"JewelPassiveTreeExpansionLarge","subgraph":{"groups":{"expansion_11":{"proxy":"43989","nodes":["0","1","10","1000","11","3","5","7","9"],"x":-4708.05,"y":-8281.17,"orbits":[3]}},"nodes":{"0":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+7 to maximum Energy Shield","+2% to all Elemental Resistances"],"group":"expansion_11","orbit":3,"orbitIndex":0,"out":["1"],"in":["11"]},"1":{"skill":"9408","name":"Medium Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_11","orbit":3,"orbitIndex":1,"out":["3"],"in":["0"],"isJewelSocket":true,"expansionJewel":{"size":1,"index":2,"proxy":"13201","parent":"7960"}},"10":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+7 to maximum Energy Shield","+2% to all Elemental Resistances"],"group":"expansion_11","orbit":3,"orbitIndex":13,"out":["11"],"in":["9"]},"1000":{"skill":"12117","name":"Chaos Damage Mastery","icon":"Art/2DArt/SkillIcons/passives/AltMasteryChaos.png","stats":[],"group":"expansion_11","orbit":0,"orbitIndex":0,"out":[],"in":[],"isMastery":true},"11":{"skill":"38592","name":"Unwaveringly Evil","icon":"Art/2DArt/SkillIcons/passives/IncreasedChaosDamage.png","stats":["30% increased Chaos Damage","Chaos Skills ignore interruption from Stuns"],"group":"expansion_11","orbit":3,"orbitIndex":15,"out":["0"],"in":["10"],"isNotable":true},"3":{"skill":"2264","name":"Unholy Grace","icon":"Art/2DArt/SkillIcons/passives/IncreasedChaosDamage.png","stats":["30% increased Chaos Damage","10% increased Attack and Cast Speed"],"group":"expansion_11","orbit":3,"orbitIndex":4,"out":["5"],"in":["1"],"isNotable":true},"5":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+7 to maximum Energy Shield","+2% to all Elemental Resistances"],"group":"expansion_11","orbit":3,"orbitIndex":7,"out":["7","3"],"in":["7960"]},"7":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+7 to maximum Energy Shield","+2% to all Elemental Resistances"],"group":"expansion_11","orbit":3,"orbitIndex":9,"out":["9"],"in":["5"]},"9":{"skill":"29712","name":"Medium Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_11","orbit":3,"orbitIndex":12,"out":["10"],"in":["7"],"isJewelSocket":true,"expansionJewel":{"size":1,"index":0,"proxy":"55706","parent":"7960"}}}}},"14":{"type":"JewelTimeless","radius":1800,"radiusVisual":"Templar"},"18":{"type":"JewelStr","radius":1800},"20":{"type":"JewelPassiveTreeExpansionLarge","subgraph":{"groups":{"expansion_20":{"proxy":"18756","nodes":["1195","195","196","197","198","200","202","204","206"],"x":4887.73,"y":-8158.76,"orbits":[3]}},"nodes":{"1195":{"skill":"12117","name":"Chaos Damage Mastery","icon":"Art/2DArt/SkillIcons/passives/AltMasteryChaos.png","stats":[],"group":"expansion_20","orbit":0,"orbitIndex":0,"out":[],"in":[],"isMastery":true},"195":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+3 to Dexterity"],"group":"expansion_20","orbit":3,"orbitIndex":0,"out":["196"],"in":["206"]},"196":{"skill":"38592","name":"Unwaveringly Evil","icon":"Art/2DArt/SkillIcons/passives/IncreasedChaosDamage.png","stats":["30% increased Chaos Damage","Chaos Skills ignore interruption from Stuns"],"group":"expansion_20","orbit":3,"orbitIndex":1,"out":["197"],"in":["195"],"isNotable":true},"197":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+3 to Dexterity"],"group":"expansion_20","orbit":3,"orbitIndex":3,"out":["198"],"in":["196"]},"198":{"skill":"13170","name":"Medium Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_20","orbit":3,"orbitIndex":4,"out":["200"],"in":["197"],"isJewelSocket":true,"expansionJewel":{"size":1,"index":2,"proxy":"24452","parent":"21984"}},"200":{"skill":"2264","name":"Unholy Grace","icon":"Art/2DArt/SkillIcons/passives/IncreasedChaosDamage.png","stats":["30% increased Chaos Damage","10% increased Attack and Cast Speed"],"group":"expansion_20","orbit":3,"orbitIndex":7,"out":["202"],"in":["198"],"isNotable":true},"202":{"skill":"46248","name":"Chaos Damage","icon":"Art/2DArt/SkillIcons/passives/ChaosDamagenode.png","stats":["12% increased Chaos Damage","+3 to Dexterity"],"group":"expansion_20","orbit":3,"orbitIndex":9,"out":["204","200"],"in":["21984"]},"204":{"skill":"49273","name":"Touch of Cruelty","icon":"Art/2DArt/SkillIcons/passives/IncreasedChaosDamage.png","stats":["Chaos Spells have 10% chance to Hinder Enemies on Hit","Enemies Hindered by you take 10% increased Chaos Damage"],"group":"expansion_20","orbit":3,"orbitIndex":12,"out":["206"],"in":["202"],"isNotable":true,"reminderText":["(Hinder reduces movement speed by 30% for 4 seconds)"]},"206":{"skill":"64583","name":"Medium Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_20","orbit":3,"orbitIndex":15,"out":["195"],"in":["204"],"isJewelSocket":true,"expansionJewel":{"size":1,"index":0,"proxy":"58194","parent":"21984"}}}}},"21":{"type":"JewelPassiveTreeExpansionMedium","subgraph":{"groups":{"expansion_21":{"proxy":"55706","nodes":["1012","12","13","14","16","17"],"x":-5519.05,"y":-8281.17,"orbits":[2]}},"nodes":{"1012":{"skill":"63454","name":"Area Damage Mastery","icon":"Art/2DArt/SkillIcons/passives/AltAreaDamageMastery.png","stats":[],"group":"expansion_21","orbit":0,"orbitIndex":0,"out":[],"in":[],"isMastery":true},"12":{"skill":"63969","name":"Vast Power","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNotable.png","stats":["20% increased Area Damage","3% increased Area of Effect per Power Charge, up to a maximum of 50%"],"group":"expansion_21","orbit":2,"orbitIndex":1,"out":["13"],"in":["17"],"isNotable":true},"13":{"skill":"44483","name":"Area Damage","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNode.png","stats":["+3 to all Attributes","1% increased Area of Effect","10% increased Area Damage"],"group":"expansion_21","orbit":2,"orbitIndex":4,"out":["14","12"],"in":["29712"]},"14":{"skill":"60617","name":"Magnifier","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNotable.png","stats":["10% increased Area of Effect","+10% to Critical Strike Multiplier"],"group":"expansion_21","orbit":2,"orbitIndex":7,"out":["16"],"in":["13"],"isNotable":true},"16":{"skill":"12613","name":"Small Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_21","orbit":2,"orbitIndex":12,"out":["17"],"in":["14"],"isJewelSocket":true,"expansionJewel":{"size":0,"index":0,"proxy":"40114","parent":"29712"}},"17":{"skill":"44483","name":"Area Damage","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNode.png","stats":["+3 to all Attributes","1% increased Area of Effect","10% increased Area Damage"],"group":"expansion_21","orbit":2,"orbitIndex":15,"out":["12"],"in":["16"]}}}},"23":{"type":"JewelPassiveTreeExpansionMedium","subgraph":{"groups":{"expansion_23":{"proxy":"13201","nodes":["1030","30","31","32","33","34"],"x":-4302.55,"y":-8983.51,"orbits":[2]}},"nodes":{"1030":{"skill":"63454","name":"Area Damage Mastery","icon":"Art/2DArt/SkillIcons/passives/AltAreaDamageMastery.png","stats":[],"group":"expansion_23","orbit":0,"orbitIndex":0,"out":[],"in":[],"isMastery":true},"30":{"skill":"2311","name":"Small Jewel Socket","icon":"Art/2DArt/SkillIcons/passives/MasteryBlank.png","stats":[],"group":"expansion_23","orbit":2,"orbitIndex":1,"out":["31"],"in":["34"],"isJewelSocket":true,"expansionJewel":{"size":0,"index":0,"proxy":"7956","parent":"9408"}},"31":{"skill":"44483","name":"Area Damage","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNode.png","stats":["+3 to all Attributes","1% increased Area of Effect","10% increased Area Damage"],"group":"expansion_23","orbit":2,"orbitIndex":4,"out":["32"],"in":["30"]},"32":{"skill":"63969","name":"Vast Power","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNotable.png","stats":["20% increased Area Damage","3% increased Area of Effect per Power Charge, up to a maximum of 50%"],"group":"expansion_23","orbit":2,"orbitIndex":7,"out":["33"],"in":["31"],"isNotable":true},"33":{"skill":"44483","name":"Area Damage","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNode.png","stats":["+3 to all Attributes","1% increased Area of Effect","10% increased Area Damage"],"group":"expansion_23","orbit":2,"orbitIndex":9,"out":["34","32"],"in":["9408"]},"34":{"skill":"60617","name":"Magnifier","icon":"Art/2DArt/SkillIcons/passives/AreaDmgNotable.png","stats":["10% increased Area of Effect","+10% to Critical Strike Multiplier"],"group":"expansion_23","orbit":2,"orbitIndex":12,"out":["30"],"in":["33"],"isNotable":true}}}},"24":{"type":"JewelInt"},"26":{"type":"JewelPassiveTreeExpansionSmall","subgraph":{"groups":{"expansion_26":{"proxy":"7956","nodes":["36","37"],"x":-4064.55,"y":-9477.75,"orbits":[1]}},"nodes":{"36":{"skill":"57572","name":"Enduring Composure","icon":"Art/2DArt/SkillIcons/passives/ArmourNotable.png","stats":["30% increased Armour","Gain 1 Endurance Charge every second if you've been Hit Recently"],"group":"expansion_26","orbit":1,"orbitIndex":1,"out":[],"in":["37"],"isNotable":true,"reminderText":["(Recently refers to the past 4 seconds)"]},"37":{"skill":"3879","name":"Armour","icon":"Art/2DArt/SkillIcons/passives/ArmourNode.png","stats":["15% increased Armour","+13 to maximum Energy Shield","+3% to Fire Resistance","+4% to Chaos Resistance"],"group":"expansion_26","orbit":1,"orbitIndex":3,"out":["36"],"in":["2311"]}}}},"5":{"type":"JewelInt"},"51":{"type":"JewelInt"},"53":{"type":"JewelInt"}}} | |||
There was a problem hiding this comment.
This looks like a large, build-specific JSON blob being added to the repo. If it’s only for local debugging of HeadlessWrapper.lua, it’s better kept out of version control (add to .gitignore) or moved to a small, curated test fixture under spec/TestBuilds/tests with a clear purpose to avoid repo bloat and accidental inclusion of personal/exported data.
| local sortedKeys = {} | ||
| for key in pairs(node.attrib) do | ||
| t_insert(sortedKeys, key) | ||
| end | ||
| table.sort(sortedKeys) | ||
| for _, key in ipairs(sortedKeys) do | ||
| local val = node.attrib[key] |
There was a problem hiding this comment.
This change alters XML serialization ordering (attributes now sorted). Given xml.ComposeXML is a core utility, it would be good to add a small busted test covering deterministic attribute ordering (and that invalid attrib keys still return an error message rather than throwing), to prevent regressions.
| -- Read the JSON files | ||
| local itemsFile = io.open(itemsJSONPath, "r") | ||
| local passivesFile = io.open(passivesJSONPath, "r") | ||
|
|
||
| if itemsFile and passivesFile then | ||
| local itemsJSON = itemsFile:read("*all") |
There was a problem hiding this comment.
If only one of the two JSON files opens successfully, the other handle is left open because the code only closes files inside the if itemsFile and passivesFile branch. Consider closing any handle that did open before taking the error path (or open/read each file in its own pcall/helper).
| function Deflate(data) | ||
| -- TODO: Might need this | ||
| return "" | ||
| local zlib = require("zlib") | ||
| return zlib.deflate()(data, "finish") | ||
| end | ||
| function Inflate(data) | ||
| -- TODO: And this | ||
| return "" | ||
| local zlib = require("zlib") | ||
| return zlib.inflate()(data, "finish") | ||
| end |
There was a problem hiding this comment.
HeadlessWrapper’s Deflate/Inflate now hard-require the Lua module zlib. This repo already depends on lzip for DEFLATE (e.g. src/UpdateCheck.lua), but does not appear to ship a zlib Lua binding; on environments where zlib isn’t installed this will crash at runtime (and headless mode is used in CI). Consider switching to the existing lzip binding (or pcall(require, ...) fallback) and ideally requiring the module once rather than on every call.
| -- Check if JSON files were provided as command line arguments using original args | ||
| local itemsJSONPath, passivesJSONPath | ||
|
|
||
| -- Check original arguments for JSON files | ||
| if originalArgs[1] and originalArgs[2] then | ||
| itemsJSONPath = originalArgs[1] | ||
| passivesJSONPath = originalArgs[2] | ||
| -- print("Found JSON files in arguments - loading items and passives data...") | ||
|
|
||
| -- Read the JSON files | ||
| local itemsFile = io.open(itemsJSONPath, "r") | ||
| local passivesFile = io.open(passivesJSONPath, "r") | ||
|
|
||
| if itemsFile and passivesFile then | ||
| local itemsJSON = itemsFile:read("*all") | ||
| local passivesJSON = passivesFile:read("*all") | ||
| itemsFile:close() | ||
| passivesFile:close() | ||
|
|
||
| -- print("Calling loadBuildFromJSON...") | ||
| local success, error_msg = pcall(function() | ||
| loadBuildFromJSON(itemsJSON, passivesJSON) | ||
| end) |
There was a problem hiding this comment.
This file now executes a fairly large JSON-loading/export routine at module top-level when two CLI args are present. That introduces non-trivial side effects in HeadlessWrapper.lua (which is used by CI and potentially as a library) and includes a lot of commented-out debug logging. Consider moving this functionality into a dedicated script/module (or guarding it behind an explicit flag) to keep the wrapper focused on providing the headless environment and helper functions.
| saver:Save(node) | ||
| t_insert(dbXML, node) | ||
| -- Call on all savers to save their data in their respective sections (fixed order for deterministic output) | ||
| local saverOrder = {"Config", "Notes", "Party", "Tree", "TreeView", "Items", "Skills", "Calcs", "Import"} |
There was a problem hiding this comment.
saverOrder duplicates the keys already defined in self.savers during Init. This creates a sync risk: adding/removing a saver requires updates in two places or the section may stop being saved. Consider defining a single ordered list once (used to build self.savers and to iterate here), or deriving the order from self.savers with a stable predefined list constant.
| local saverOrder = {"Config", "Notes", "Party", "Tree", "TreeView", "Items", "Skills", "Calcs", "Import"} | |
| local saverOrder = {} | |
| for key in pairs(self.savers) do | |
| t_insert(saverOrder, key) | |
| end | |
| t_sort(saverOrder) |
Fixes # .
Description of the problem being solved:
Steps taken to verify a working solution:
Link to a build that showcases this PR:
Before screenshot:
After screenshot: