@@ -2901,6 +2901,7 @@ function calcs.offence(env, actor, activeSkill)
29012901
29022902 if critOverride == 100 then
29032903 output .PreEffectiveCritChance = 100
2904+ output .PreBifurcateCritChance = 100
29042905 output .CritChance = 100
29052906 else
29062907 local base = 0
@@ -2935,8 +2936,13 @@ function calcs.offence(env, actor, activeSkill)
29352936 output .CritChance = (1 - (1 - output .CritChance / 100 ) ^ (critRolls + 1 )) * 100
29362937 end
29372938 end
2939+ output .PreBifurcateCritChance = output .CritChance
2940+ local preBifurcateCritChance = output .CritChance
2941+ if env .mode_effective and skillModList :Flag (cfg , " BifurcateCrit" ) then
2942+ output .CritChance = (1 - (1 - output .CritChance / 100 ) ^ 2 ) * 100
2943+ end
29382944 local preHitCheckCritChance = output .CritChance
2939- local preSkillUseCritChance = output .CritChance
2945+ local preSkillUseCritChance = output .CritChance
29402946 if env .mode_effective then
29412947 if skillModList :Flag (skillCfg , " Every3UseCrit" ) then
29422948 output .CritChance = (2 * output .CritChance + 100 ) / 3
@@ -2966,7 +2972,7 @@ function calcs.offence(env, actor, activeSkill)
29662972 local overCap = preCapCritChance - 100
29672973 t_insert (breakdown .CritChance , s_format (" Crit is overcapped by %.2f%% (%d%% increased Critical Strike Chance)" , overCap , overCap / more / (baseCrit + base ) * 100 ))
29682974 end
2969- if env .mode_effective and ( critRolls ~= 0 or skillModList : Flag ( skillCfg , " Every3UseCrit " ) or skillModList : Flag ( skillCfg , " Every5UseCrit " )) then
2975+ if env .mode_effective then
29702976 if critRolls ~= 0 then
29712977 if skillModList :Flag (skillCfg , " Unexciting" ) then
29722978 t_insert (breakdown .CritChance , " Crit Chance is Unexciting:" )
@@ -2975,14 +2981,22 @@ function calcs.offence(env, actor, activeSkill)
29752981 t_insert (breakdown .CritChance , " Crit Chance is Lucky:" )
29762982 t_insert (breakdown .CritChance , s_format (" 1 - (1 - %.4f)^ %d" , preLuckyCritChance / 100 , critRolls + 1 ))
29772983 end
2984+ t_insert (breakdown .CritChance , s_format (" = %.2f%%" , preBifurcateCritChance ))
2985+ end
2986+ if skillModList :Flag (cfg , " BifurcateCrit" ) then
2987+ t_insert (breakdown .CritChance , " Critical Strike Bifurcates:" )
2988+ t_insert (breakdown .CritChance , s_format (" 1 - (1 - %.4f) x (1 - %.4f)" , preBifurcateCritChance / 100 , preBifurcateCritChance / 100 ))
2989+ t_insert (breakdown .CritChance , s_format (" = %.2f%%" , preSkillUseCritChance ))
29782990 end
29792991 if skillModList :Flag (skillCfg , " Every3UseCrit" ) then
29802992 t_insert (breakdown .CritChance , s_format (" + %.2f%% ^8(crit every 3rd use)" , (2 * preSkillUseCritChance + 100 ) / 3 - preSkillUseCritChance ))
29812993 end
29822994 if skillModList :Flag (skillCfg , " Every5UseCrit" ) then
29832995 t_insert (breakdown .CritChance , s_format (" + %.2f%% ^8(crit every 5th use)" , (4 * preSkillUseCritChance + 100 ) / 5 - preSkillUseCritChance ))
29842996 end
2985- t_insert (breakdown .CritChance , s_format (" = %.2f%%" , preHitCheckCritChance ))
2997+ if skillModList :Flag (skillCfg , " Every3UseCrit" ) or skillModList :Flag (skillCfg , " Every5UseCrit" ) then
2998+ t_insert (breakdown .CritChance , s_format (" = %.2f%%" , preHitCheckCritChance ))
2999+ end
29863000 end
29873001 if env .mode_effective and output .AccuracyHitChance < 100 then
29883002 t_insert (breakdown .CritChance , " Crit confirmation roll:" )
@@ -3014,6 +3028,42 @@ function calcs.offence(env, actor, activeSkill)
30143028 }
30153029 end
30163030 end
3031+ -- if crit bifurcates are enabled, roll for crit twice and add multiplier for each
3032+ local critOverride = skillModList :Override (cfg , " CritChance" )
3033+ if env .mode_effective and skillModList :Flag (cfg , " BifurcateCrit" ) and output .PreBifurcateCritChance and not (critOverride == 100 ) then
3034+ -- get crit chance and calculate odds of critting twice
3035+ local critChancePercentage = output .PreBifurcateCritChance
3036+ local bifurcateMultiChance = (critChancePercentage ^ 2 ) / 100
3037+ local effectiveCritChance = output .CritChance
3038+ local bifurcateUseChance = 1
3039+ -- Guaranteed crit uses do not roll crit chance and therefore cannot bifurcate
3040+ if skillModList :Flag (skillCfg , " Every3UseCrit" ) then
3041+ bifurcateUseChance = bifurcateUseChance * 2 / 3
3042+ end
3043+ if skillModList :Flag (skillCfg , " Every5UseCrit" ) then
3044+ bifurcateUseChance = bifurcateUseChance * 4 / 5
3045+ end
3046+ bifurcateMultiChance = bifurcateMultiChance * bifurcateUseChance
3047+ local conditionalBifurcateChance = effectiveCritChance > 0 and bifurcateMultiChance / effectiveCritChance or 0
3048+ output .CritBifurcates = 1 + conditionalBifurcateChance
3049+ local damageBonus = extraDamage
3050+ local bifurcatedBonus = conditionalBifurcateChance * extraDamage
3051+ if breakdown then
3052+ breakdown .CritBifurcates = {
3053+ s_format (" %.2f%% ^8(pre-bifurcate crit chance)" , critChancePercentage ),
3054+ s_format (" x %.2f%%" , critChancePercentage ),
3055+ }
3056+ if bifurcateUseChance < 1 then
3057+ t_insert (breakdown .CritBifurcates , s_format (" x %.2f%% ^8(uses that can bifurcate)" , bifurcateUseChance * 100 ))
3058+ end
3059+ t_insert (breakdown .CritBifurcates , s_format (" = %.2f%% ^8(chance both crit rolls succeed)" , bifurcateMultiChance ))
3060+ t_insert (breakdown .CritBifurcates , s_format (" / %.2f%% ^8(effective crit chance)" , effectiveCritChance ))
3061+ t_insert (breakdown .CritBifurcates , s_format (" = %.2f ^8(crit Bifurcates effect)" , 1 + conditionalBifurcateChance ))
3062+ end
3063+ extraDamage = damageBonus + bifurcatedBonus
3064+ -- mod doesn't affect output and is purely descriptive
3065+ skillModList :NewMod (" CritMultiplier" , " MORE" , floor (conditionalBifurcateChance * 100 , 2 ), " Bifurcated Crit Damage Bonus" , ModFlag .Hit )
3066+ end
30173067 output .CritMultiplier = 1 + m_max (0 , extraDamage )
30183068 end
30193069 local critChancePercentage = output .CritChance / 100
0 commit comments