Skip to content

Add Essence of Desolation with ring slot support#9515

Open
EtherealCarnivore wants to merge 1 commit intoPathOfBuildingCommunity:devfrom
EtherealCarnivore:essence-of-desolation
Open

Add Essence of Desolation with ring slot support#9515
EtherealCarnivore wants to merge 1 commit intoPathOfBuildingCommunity:devfrom
EtherealCarnivore:essence-of-desolation

Conversation

@EtherealCarnivore
Copy link

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.

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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant