Skip to content

Add Essence of Desolation mod support#9515

Merged
LocalIdentity merged 5 commits intoPathOfBuildingCommunity:devfrom
EtherealCarnivore:essence-of-desolation
Mar 9, 2026
Merged

Add Essence of Desolation mod support#9515
LocalIdentity merged 5 commits intoPathOfBuildingCommunity:devfrom
EtherealCarnivore:essence-of-desolation

Conversation

@EtherealCarnivore
Copy link
Contributor

Adds Essence of Desolation (3.28) with full mod definitions and calc support for most of its mods. Also adds ring slot awareness to the essence system - Desolation is the first essence with different mods for left vs right ring.

What changed

Data:

  • 12 new mod definitions in ModItem.lua (one per item type, two-hand gets a separate one)
  • Desolation entry in Essence.lua using "Ring 1" / "Ring 2" keys instead of "Ring"

UI:

  • Essence modifier popup in ItemsTab now checks for slot-specific ring keys. Desolation shows two entries for rings: "Essence of Desolation (Ring 1)" and "Essence of Desolation (Ring 2)". Other essences still just show "Ring" as before.

Calc support:

  • Double damage per ailment type (weapon): one DoubleDamageChance entry per ailment, stacks independently
  • Movement speed / attack+cast speed per nearby enemy (boots/gloves): uses NearbyEnemies multiplier with cap
  • Socketed gem level with single gem condition (helmet): new SingleGemSocketedIn{SlotName} condition in CalcSetup
  • Armour applies to ele damage taken (shield): conditional on BlockedRecently
  • Projectile chain in close range (quiver): modeled as +99 chains with AtCloseRange condition
  • Ailment duration for types not inflicted recently (amulet): per-ailment duration stats with negated Recently conditions
  • Unleash seals (left ring) / Shockwave cooldown uses (right ring): slot prefix handled by existing ModParser system
  • Magic flask effect with no adjacent flasks (belt): flask slot position tracking in CalcSetup, adjacency check in CalcPerform

Defence modifier detection (body armour mod):

  • Added "defence" patterns to itemTagSpecial in Data.lua (armour/evasion/ES/ward text patterns)
  • Extended FindModifierSubstring in Item.lua to also check GGPK modTags on mod lines, so mods tagged "defences" in the game data get caught even if the mod text doesn't literally say "armour" etc.
  • The actual condition logic uses the existing ItemCondition parser at ModParser line 1539 (allSlots = true, excludeSelf = true)

Known simplifications - open to suggestions on any of these

Ailment duration mod:

  • Freeze and Chill share FrozenEnemyRecently - if you've frozen recently, both freeze and chill duration won't get the bonus. In practice this is correct since freeze implies chill, but technically you could chill without freezing.
  • Scorch, Brittle, Sapped don't have individual "Recently" conditions wired up. Adding them would need new config checkboxes. Happy to add if people want them.

Projectile chain:

  • "Any number" is modeled as +99 chains. The tooltip will show a silly chain count but the actual calc result is correct since you'd never hit 99 targets. Open to a cleaner way to handle this if there's a precedent.

Defence modifier detection:

  • The text pattern approach (itemTagSpecial) catches most defence mods but could miss unusual wording. The modTags fallback from GGPK data covers those gaps for mods that have tags. Mods with no GGPK tags and weird text could slip through - haven't found any yet.

Flask adjacency:

  • Slot positions come from PoB's Flask 1-5 slot names, which match the in-game layout. If someone imports a character, the flask ordering should match.

If any of these simplifications are a problem or there's a better pattern to follow, let me know - happy to rework.

Testing

Full test suite passes (194/194, the 1 failure is the pre-existing trade query ordering issue). Manual testing needed for in-app behavior - crafting rings with Desolation, equipping in left/right slot, checking flask adjacency with different slot arrangements.

EtherealCarnivore and others added 5 commits March 2, 2026 22:02
3.28 essence with slot-specific ring mods (left ring: Unleash seals,
right ring: Shockwave cooldown). Adds mod definitions, parser patterns,
and calc wiring for most of its mods across all item types.

Extends FindModifierSubstring to check GGPK modTags for defence
modifier detection on the body armour mod.
Fix adjacent flask only checking active flasks
Remove the defences mod searching as it's not the proper way to handle it
Move all the mods in ModParser to their correct position and fix the parsing
Copy link
Contributor

@LocalIdentity LocalIdentity left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to fix quite a few issues with mod parsing, mod positions in files and also logic for the flask mod and the defences mod. I'm leaving the defences one out for now as it requires more work

@LocalIdentity LocalIdentity added the enhancement New feature, calculation, or mod label Mar 9, 2026
@LocalIdentity LocalIdentity changed the title Add Essence of Desolation with ring slot support Add Essence of Desolation mod support Mar 9, 2026
@LocalIdentity LocalIdentity merged commit 5646399 into PathOfBuildingCommunity:dev Mar 9, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, calculation, or mod

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants