Skip to content

Add a Radius Jewel Finder - #10057

Draft
mcagnion wants to merge 51 commits into
PathOfBuildingCommunity:devfrom
mcagnion:feature/radius-jewel-finder-pr
Draft

Add a Radius Jewel Finder#10057
mcagnion wants to merge 51 commits into
PathOfBuildingCommunity:devfrom
mcagnion:feature/radius-jewel-finder-pr

Conversation

@mcagnion

@mcagnion mcagnion commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Description of the problem being solved:

Finding a good socket for a radius jewel currently means manually comparing each socket, its passive radius, and the effect on the build.

This adds Find Radius Jewel to the Tree tab. Select a jewel family—or All jewels—and PoB ranks the supported jewel and socket combinations against the chosen stat. Results can be previewed and applied directly to the build.

Use the panel to select the jewel family and comparison stat, then run the calculation. The result list shows the gain, percentage gain and gain per passive point; selecting a row shows the affected socket, passives and any Foulborn mutation.

The finder can restrict searches to free sockets, safely replace ordinary occupied jewels, or consider all occupied sockets. Replacement details identify the existing jewel, while position-sensitive jewels are excluded from Safe occupied mode. Full replacement evaluation also handles cluster-tree and Timeless Jewel state safely.

The finder covers the radius jewels it can evaluate generically, including applicable Foulborn variants. Timeless Jewels continue to use their dedicated finder; conversion jewels such as Cold Steel and Fireborn are outside this tool's scope. Foulborn Might of the Meek is not included until its radius is modeled.

Steps taken to verify a working solution:

  • Ran the complete automated test suite and focused system coverage for jewel data, variants, result ranking, Foulborn transformations, occupancy modes, replacement safety and popup interactions.
  • Manually tested Full DPS ranking using the All jewels view.
  • Verified normal and Foulborn results show the expected mutation, socket and replacement details.

Screenshots

after-occupied-socket-replacement

Technical notes for reviewers

  • RadiusJewelData owns the supported jewel catalogue and variant construction. RadiusJewelCompute owns socket evaluation, replacement handling and disconnected-passive planning. Popup workflows are separated from construction, while result, detail and tooltip controls are dedicated class modules.
  • Comparison calculations preserve the live build by evaluating candidates against copied passive-tree state and restoring socket, item and allocation state after each operation. Position-sensitive, Cluster and Timeless-style replacements rebuild only the tree structures that can affect the result.
  • Fast evaluation shares calculations between structurally equivalent sockets, while simulated planning enriches only the candidates that need full path details. Result rows retain compact scalar snapshots for comparison tooltips instead of build-state object graphs.

@mcagnion
mcagnion force-pushed the feature/radius-jewel-finder-pr branch 5 times, most recently from 55ff588 to 3411fbe Compare August 7, 2026 18:27
Add the Tree tab Radius Jewel Finder UI, data catalog, computation helpers, and manifest entries.
Cover socket discovery, variant handling, ranking, apply safety, occupied sockets, and state restoration for the Radius Jewel Finder.
Default variant-aware jewel types to All variants, and constrain compute/find paths when a specific variant is selected.
Adapt the finder to the current per-mod Foulborn data model, preserve selected variants through Find and Compute, and cover the regression paths. Excludes Foulborn Might of the Meek until its radius is modelled.
Ensure All occupied scores a replacement after removing the cluster's allocated passives.
Refresh generated hashes after resolving manifest conflicts against origin/dev.
@mcagnion
mcagnion force-pushed the feature/radius-jewel-finder-pr branch from 3411fbe to d33c7aa Compare August 15, 2026 15:55
Reuse ItemsTab's main-tree comparison predicate in Radius Jewel computations while keeping Cluster Jewel rebuilds explicit.
Keep the finder focused on popup orchestration while loading result and detail controls through their class-named modules.
Use the established sortValue field across compute and finder rows, and call the existing best-per-socket method directly.
Remove test-only Finder API surface, centralize the full Massive radius boundary, and keep the Finder header tied to the data catalogue owner.
Preserve each control's tooltip placement order while centralizing viewport and overlap handling, and reuse one node-label builder across Finder and Compute.
Separate variant preparation, socket grouping, representative evaluation, result fan-out, and plan-detail expansion while preserving cache and progress invariants.
Separate popup setup and Find, Compute, and Apply orchestration so Open remains a small composition boundary.
Separate popup, data, and compute coverage while sharing fixture helpers without changing the 93-test Finder set.
Drop nested requirement source objects from tooltip snapshots because stat comparison tooltips consume only scalar values. Cover both stored snapshots with a regression test.
Keep the data module API limited to active consumers and normalize popup wiring indentation for review.
@mcagnion
mcagnion marked this pull request as ready for review August 16, 2026 12:15
@mcagnion
mcagnion marked this pull request as draft August 16, 2026 12:26
Use unique-item identity for grouped-family limits and source Thread and Massive radii from canonical item and tree data.

Addresses PR 10057 L1 remediation.
Invalidate cached and visible results when the build revision or a result-affecting criterion changes, and prevent stale Apply actions.

Addresses PR 10057 L3 remediation.
Model each result as an explicit placement plan so Find and Compute agree on Equip, Move, Replace, and Equipped.

Add a non-equipping path and preserve exact item/socket state through Items undo without applying passive recommendations. Addresses PR 10057 remediation L2.
Remove the two-pass top-five enrichment that associated sorted results through stale indices. Treat ring selection as a real result criterion, including Any ring, explicit filtering, preview, cache identity, restoration, and canonical labels.
Carry each representative group identity through fan-out and rebuild full plan details in the group's own budget and replacement context. Stop reusing or copying plans across groups that happen to choose the same variant.
Limit the temporary socket distance mutation to protected calculator calls so cooperative cancellation never abandons modified live tree state. Restore the original value before returning or propagating calculator errors.
Individual passive gains are not an upper bound for combinations with non-additive interactions. Always run the final combined calculation before ranking Thread of Hope and Impossible Escape variants.
Replace the class-mutating compute mixin with a dedicated per-finder object. Keep calculation state and helpers behind that boundary so production callers and tests use the same explicit owner.
Use named request tables for every radius jewel calculation contract and route disconnected-passive methods through one Fast/Simulated selector. Preserve cache, progress, and result behavior while making each call site's intent explicit.
Give each jewel type one Find and Compute strategy instead of repeating name and flag dispatch across the popup. Centralize shared request construction and node collection while preserving variant limits, filters, progress, cache behavior, and All jewels results.
Move cached result restoration, view preference, row context, and applicability checks behind one focused owner. Keep selection-dependent key construction in the popup so criteria and result storage no longer share one nested implementation.
Move selection, placement controls, confirmation, and action tooltips behind a focused popup owner. Keep result details and the validated action planning and execution contract unchanged.
Move preview, detail rendering, and selection updates behind a focused popup owner while preserving the validated result and action contracts.
Explain criterion changes without hiding the previous result view. Keep stale actions disabled and restore matching cached results when criteria return.
Keep Find visible but disabled for ordinary All variants selections while
preserving the existing multi-variant behavior for Impossible Escape and
Thread of Hope.

Add coverage for messages, tooltips, grouped variants, and restored
selections.

Addresses PR 10057 D8.
Filter Find candidates by displayed Points while keeping Score independent. Preserve zero-cost occupied sockets and isolate cached results by Max points.

Addresses PR 10057 D9.
Replace the preview split with a full-height, fact-first Details pane
while preserving Results geometry and action behavior. Cache stable hover
tooltips and avoid repeating variant and passive-count summaries.

Implements decision D10 for PR 10057.
Replace parallel jewel preview and result-column branches with explicit
schemas. Remove optional cross-interaction result caches while preserving
visible stale rows, refresh warnings, and Apply correctness guards.
Bring in the Chain Hook, PvP hover, and Sirus damage fixes without
touching the radius jewel feature files.
Separate guarded item-plan construction and execution from popup orchestration while preserving existing action and Undo behavior.
Name Impossible Escape effect independence precisely and remove redundant row aliases in favor of the shared action plan.
Make jewel descriptors the single preview catalog and strategies the single owner of finder capabilities. Preserve preview and result behavior while removing duplicate flags and metadata.
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