@@ -492,18 +492,46 @@ function CalcsTabClass:PowerBuilder()
492492 if coroutine.running () then
493493 coroutine.yield ()
494494 end
495+
496+ local function buildMasteryEffectNode (node , effect )
497+ local effectNode = {
498+ id = node .id ,
499+ type = node .type ,
500+ name = node .name ,
501+ sd = { },
502+ }
503+ for i , sd in ipairs (effect .sd or { }) do
504+ effectNode .sd [i ] = sd
505+ end
506+ self .build .spec .tree :ProcessStats (effectNode )
507+ return effectNode
508+ end
495509
496510 local start = GetTime ()
497511 local nodeIndex = 0
498512 local total = 0
499513
500514 for nodeId , node in pairs (self .build .spec .nodes ) do
501515 wipeTable (node .power )
516+ if node .type == " Mastery" then
517+ node .power .masteryEffects = { }
518+ end
502519 if node .modKey ~= " " and not self .mainEnv .grantedPassives [nodeId ] then
503- distanceMap [node .pathDist or 1000 ] = distanceMap [node .pathDist or 1000 ] or { }
504- distanceMap [node .pathDist or 1000 ][nodeId ] = node
505- if not (self .nodePowerMaxDepth and self .nodePowerMaxDepth < node .pathDist ) then
506- total = total + 1
520+ if node .type == " Mastery" and node .allMasteryOptions then
521+ if not (self .nodePowerMaxDepth and self .nodePowerMaxDepth < node .pathDist ) then
522+ for _ , masteryEffect in ipairs (node .masteryEffects or { }) do
523+ local assignedNodeId = isValueInTable (self .build .spec .masterySelections , masteryEffect .effect )
524+ if not assignedNodeId or assignedNodeId == node .id then
525+ total = total + 1
526+ end
527+ end
528+ end
529+ else
530+ distanceMap [node .pathDist or 1000 ] = distanceMap [node .pathDist or 1000 ] or { }
531+ distanceMap [node .pathDist or 1000 ][nodeId ] = node
532+ if not (self .nodePowerMaxDepth and self .nodePowerMaxDepth < node .pathDist ) then
533+ total = total + 1
534+ end
507535 end
508536 end
509537 end
@@ -572,6 +600,17 @@ function CalcsTabClass:PowerBuilder()
572600 end
573601 end
574602 end
603+ if node .type == " Mastery" then
604+ local selectedEffectId = self .build .spec .masterySelections [node .id ]
605+ if selectedEffectId then
606+ node .power .masteryEffects [selectedEffectId ] = {
607+ singleStat = node .power .singleStat ,
608+ pathPower = node .power .pathPower ,
609+ offence = node .power .offence ,
610+ defence = node .power .defence ,
611+ }
612+ end
613+ end
575614 nodeIndex = nodeIndex + 1
576615 if coroutine.running () and GetTime () - start > 100 then
577616 if self .build .powerBuilderProgressCallback then
@@ -583,6 +622,69 @@ function CalcsTabClass:PowerBuilder()
583622 end
584623 end
585624
625+ for nodeId , node in pairs (self .build .spec .nodes ) do
626+ if node .type == " Mastery" and node .allMasteryOptions and node .modKey ~= " " and not self .mainEnv .grantedPassives [nodeId ] then
627+ if not (self .nodePowerMaxDepth and self .nodePowerMaxDepth < node .pathDist ) then
628+ for _ , masteryEffect in ipairs (node .masteryEffects or { }) do
629+ local assignedNodeId = isValueInTable (self .build .spec .masterySelections , masteryEffect .effect )
630+ if not assignedNodeId or assignedNodeId == node .id then
631+ local effect = self .build .spec .tree .masteryEffects [masteryEffect .effect ]
632+ if effect then
633+ local effectNode = buildMasteryEffectNode (node , effect )
634+ if effectNode .modKey ~= " " then
635+ if not cache [effectNode .modKey ] then
636+ cache [effectNode .modKey ] = calcFunc ({ addNodes = { [effectNode ] = true } }, useFullDPS )
637+ end
638+ local output = cache [effectNode .modKey ]
639+ node .power .masteryEffects [effect .id ] = { }
640+ if self .powerStat and self .powerStat .stat and not self .powerStat .ignoreForNodes then
641+ node .power .masteryEffects [effect .id ].singleStat = self :CalculatePowerStat (self .powerStat , output , calcBase )
642+ node .power .masteryEffects [effect .id ].pathPower = node .power .masteryEffects [effect .id ].singleStat
643+ if node .path and not node .ascendancyName then
644+ newPowerMax .singleStat = m_max (newPowerMax .singleStat , node .power .masteryEffects [effect .id ].singleStat )
645+ local pathNodes = {
646+ [effectNode ] = true
647+ }
648+ for _ , pathNode in pairs (node .path ) do
649+ if pathNode ~= node then
650+ pathNodes [pathNode ] = true
651+ end
652+ end
653+ if node .pathDist > 1 then
654+ node .power .masteryEffects [effect .id ].pathPower = self :CalculatePowerStat (self .powerStat , calcFunc ({ addNodes = pathNodes }, useFullDPS ), calcBase )
655+ end
656+ end
657+ node .power .singleStat = m_max (node .power .singleStat or 0 , node .power .masteryEffects [effect .id ].singleStat )
658+ node .power .pathPower = m_max (node .power .pathPower or 0 , node .power .masteryEffects [effect .id ].pathPower )
659+ elseif not self .powerStat or not self .powerStat .ignoreForNodes then
660+ node .power .masteryEffects [effect .id ].offence , node .power .masteryEffects [effect .id ].defence = self :CalculateCombinedOffDefStat (output , calcBase )
661+ node .power .masteryEffects [effect .id ].singleStat = node .power .masteryEffects [effect .id ].offence
662+ if node .path and not node .ascendancyName then
663+ newPowerMax .offence = m_max (newPowerMax .offence , node .power .masteryEffects [effect .id ].offence )
664+ newPowerMax .defence = m_max (newPowerMax .defence , node .power .masteryEffects [effect .id ].defence )
665+ newPowerMax .offencePerPoint = m_max (newPowerMax .offencePerPoint , node .power .masteryEffects [effect .id ].offence / node .pathDist )
666+ newPowerMax .defencePerPoint = m_max (newPowerMax .defencePerPoint , node .power .masteryEffects [effect .id ].defence / node .pathDist )
667+ end
668+ node .power .offence = m_max (node .power .offence or 0 , node .power .masteryEffects [effect .id ].offence )
669+ node .power .defence = m_max (node .power .defence or 0 , node .power .masteryEffects [effect .id ].defence )
670+ node .power .singleStat = m_max (node .power .singleStat or 0 , node .power .masteryEffects [effect .id ].singleStat )
671+ end
672+ end
673+ nodeIndex = nodeIndex + 1
674+ if coroutine.running () and GetTime () - start > 100 then
675+ if self .build .powerBuilderProgressCallback then
676+ self .build .powerBuilderProgressCallback (m_floor (nodeIndex / total * 100 ))
677+ end
678+ coroutine.yield ()
679+ start = GetTime ()
680+ end
681+ end
682+ end
683+ end
684+ end
685+ end
686+ end
687+
586688 -- Calculate the impact of every cluster notable
587689 -- used for the power report screen
588690 for nodeName , node in pairs (self .build .spec .tree .clusterNodeMap ) do
0 commit comments