Add breakdowns to the build side bar on mouseover - #10196
Conversation
|
The underlines do make it look a tad busy. Would making the calc specific numbers/terms bolder work here? Other option could be to keep the underline just for the keywords? |
We came to sort of a conclusion on Discord (if you're not there as a contributor, ask local) that it's probably best to keep the underlining for a short period and then we can remove it completely once users are more familiar with it |
|
Ah, gotcha. No worries. @LocalIdentity can I get an invite to the discord if possible? |
|
@cupkax send me a friend req or message on discord (Localidentity) and I’ll inv you |
Separates Crit Chance from Effective Crit Chance breakdowns. Uses the existing main-hand or off-hand modifier information for attack critical strike breakdowns. Shows combined main-hand and off-hand calculations for dual-wield attack rate, critical strike chance, and hit chance. Uses off-hand breakdowns for shield attacks such as Spectral Shield Throw. Prevents sidebar stats from appearing interactive when they do not have a visible breakdown.
54e34bf
into
PathOfBuildingCommunity:dev
| breakdown.PreEffectiveCritChance = handBreakdown.PreEffectiveCritChance | ||
| breakdown.CritChance = handBreakdown.CritChance | ||
| end | ||
| local breakdownSource = skillFlags.weapon1Attack and "MainHand.CritChance" or "OffHand.CritChance" |
There was a problem hiding this comment.
For bothWeaponAttack, this always redirects the aggregate crit breakdown to the main-hand CalcSections cell because weapon1Attack is true. The popup shows the correct combined numeric lines, but a focused Cleave reproduction finds cfg=weapon1 and no cfg=weapon2, so off-hand-specific crit modifiers are omitted. Could the aggregate mapping retain distinct main- and off-hand modifier sections? The label-based deduplication in GetSidebarBreakdown will also need to keep the two same-labelled weapon sections separate.
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.
| { stat = "TotemPlacementTime", label = "Totem Placement Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, condFunc = function(v, o) return not o.TriggerTime end }, | ||
| { stat = "PreEffectiveCritChance", label = "Crit Chance", fmt = ".2f%%", flag = "hit", breakdown = "PreEffectiveCritChance" }, | ||
| { stat = "CritChance", label = "Effective Crit Chance", fmt = ".2f%%", flag = "hit", condFunc = function(v, o) return v ~= o.PreEffectiveCritChance end, breakdown = "CritChance" }, | ||
| { stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v, o) return (o.CritChance or 0) > 0 end, breakdown = "CritMultiplier" }, |
There was a problem hiding this comment.
Attack crit-multiplier breakdowns live under MainHand.CritMultiplier / OffHand.CritMultiplier, but this sidebar row requests root CritMultiplier. The attack calculation averages the root output value but, unlike the two crit-chance stats, never exposes a root breakdown alias, so GetStatBreakdownKey returns nil and Crit Multiplier is not interactive for attack skills. Could the attack path expose the matching single-hand or aggregate breakdown before advertising this mapping?
AI-assisted review disclosure: This finding was identified during a review using OpenAI Codex and confirmed with a focused reproduction.



Description of the problem being solved:
This adds the calc tab breakdowns to the build side bar. This is sort of inspired by poe.ninja.
The breakdowns seem to work quite well, but I think this looks quite busy, and I'll welcome opinions on whether or not this needs visual changes or not.Feedback received. I toned down the underlining a bit. Optimally I think we should remove this later, but it's good to have now to teach users that this actually exists. TPlant also mentioned a small diamond icon. It doesn't seem like something PoB or PoE has used before, but that could work too.I also don't have perfect knowledge on what all the calcs stuff means. For example I have no clue what omniscience is, or why the off-hand breakdowns would be relevant.
The breakdowns are indexed based on their names from
CalcSections, and in most cases theBuildDisplayStatsstat names are used to look up the breakdown. This is not always possible and thus I added abreakdown string?field to the display stats to force a breakdown if e.g. the name is different. There's also amodNames string[]?field for defining mod lists if, for example, the breakdown doesn't have any mod lists in the cell (e.g. Life). These exceptions have to be manually fixed.One problem with this approach is that if multiple cells have the same breakdown, we might get a bad match, like what happens with armour/ev/es. For these it's better to just ignore the breakdown and to add modnames manually.
I have fixed most stat displays, and made sure that minions work. One issue was that the main env doesn't contain breakdowns. This was fixed by generating them for the main env, and I'm not sure how bad that is. I'd assume the breakdowns were restricted to "CALCS" for a reason.
Pinning is supported (not the popup but like left clicking a cell).
Steps taken to verify a working solution:
Link to a build that showcases this PR:
Minions: https://poe.ninja/poe1/pob/96cb6
Totems: https://poe.ninja/poe1/pob/96cb7
Mamba: https://poe.ninja/poe1/pob/96cb9
Worb: https://poe.ninja/poe1/pob/96cba
Before screenshot:
After screenshot:
Path.space.of.space.Building_2026-08-11_19-12-42.mp4