Fix Kinetic Fusillade not scaling Ailment damage per projectile - #9966
Merged
LocalIdentity merged 2 commits intoJul 23, 2026
Merged
Conversation
…amage calculations
No need for a test
LocalIdentity
approved these changes
Jul 23, 2026
LocalIdentity
left a comment
Contributor
There was a problem hiding this comment.
Simplify to remove the hit modflag
DrakenKor
pushed a commit
to DrakenKor/PathOfBuilding
that referenced
this pull request
Jul 27, 2026
…OfBuildingCommunity#9966) * Include projectile sequence damage mod in Kinetic Fusillade ailment damage calculations * Simple fix No need for a test --------- Co-authored-by: LocalIdentity <localidentity2@gmail.com>
mauriceco2424
added a commit
to mauriceco2424/PathOfBuilding
that referenced
this pull request
Aug 3, 2026
Our fork was stuck on v2.65.0, so treeVersionList ended at 3_28 and PoB rejected every current-league build: TreeTab:Load early-returns before setting activeSpec, SyncLoadouts crashes on the nil, and the error handler runs main:Shutdown() -- which nils build.savers, so the process then exports a <Build>-only corpse with no error anywhere. Every ladder build poisoned the shared PoB process from the day 3.29 launched (50/50 failed on 07-31). Three conflicts, all at known divergence points: - ImportTab: took upstream. It moved the league read out of ImportPassiveTreeAndJewels into the GUI-only download callbacks, so the crash our headless guard existed to prevent no longer has a source there, and nothing in our stack consumes lastLeague. - PassiveSpec: kept our theorycraft class/ascendancy fallback, adapted to the new signature. - HeadlessWrapper: took upstream for the demo helper -- it sits after the POB_API_STDIO block's `dofile(Server.lua); return`, so it is unreachable in API mode. Our real implementation is the one inside that block. Two upstream signature changes broke us silently and had to be fixed by hand; neither throws, they just compute the wrong thing: - ImportFromNodeList gained a leading className parameter. Six call sites in our own BuildOps.lua still passed the old 7-arg form, which shifts every argument by one -- classId landing in className. - ImportItemsAndSkills/ImportPassiveTreeAndJewels now take one decoded charData table instead of raw JSON, and ProcessJSON (which did the decoding) was deleted. The headless loadBuildFromJSON now decodes with dkjson and assembles the new shape, pinning charData.league because the new code calls charData.league:match() unguarded. Verified: a build rewritten to treeVersion="3_29" loads with every section present and correct DPS, while a bogus 3_99 control still fails loudly. All 10 beta builds load; EHP/Life/Mana byte-identical to a pre-merge baseline; four DPS deltas each traceable to a named upstream PR (-36% on Kinetic Fusillade is PathOfBuildingCommunity#9966, titled for that exact skill).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of the problem being solved:
Kinetic Fusillade's "more Damage per previous Projectile fired in the sequence" modifier was restricted to hit damage in PoB. As a result, ailments such as Poison did not receive the skill's sequential damage bonus, causing ailment damage to be underestimated when calculating multiple hovering projectiles.
"Projectiles deal (3-8)% more Damage per previous Projectile fired in sequence" actually applies to ailments, because of the specific unique wording. I learned about this discrepancy from Jungroan in this clip, in which he notes that GGG did confirm to him that it does in fact apply to ailments, so I went and tested it and confirmed that it does. You can see my results below.
The skill-specific modifier has been updated to apply to both hits and ailments. Generic projectile damage modifiers remain hit-only for ailments, as expected.
Damage Calculation:
For 12 hovering projectiles with 7% (tested on a Level 1 Kinetic Fusillade, 20 quality) more damage per previous projectile, the projectiles receive
0%, 7%, 14%, ...more damageThe average sequential bonus is:
7% × (0 + 1 + ... + 11) / 12 = 7% × 66 / 12 = 38.5% more damageSteps taken to verify a working solution:
Link to a build that showcases this PR:
Video showcase of the testing data:
https://www.youtube.com/watch?v=IJOjxk24MKA
Spreadsheet of the data in the video:
https://docs.google.com/spreadsheets/d/1S7ADqxWhJivgt2NY-bEzJaHwEiLmn_C5cM5f7yWxOzA/edit?usp=sharing
Build used in video and testing data:
https://pobb.in/5x5cY5f4S-1N
I used Plague Bearer to calculate the percentage increase and poison damage values. Abberath (Act 6) was used as the dummy.
Before screenshot:
After screenshot:
Also to note: I believe the sequential modifier calculation on Kinetic Fusillade is also wrong, so the "Accumulated Projectiles" option in the screenshot is from another feature branch to hopefully fix that. In either case, the percentage increase here mathematically agrees with the intended damage calculation.