Skip to content

Commit eb3472c

Browse files
LocalIdentityLocalIdentity
andauthored
Fix Molten Strike of the Zenith Total Weighted Ball Average calc (#9655)
The value for the extra damage and additonal projectiles on the 5th strike was hardcoded so when GGG changed the value to 600% the calc was still using 800% Now has the calc on the gem itself and pulls those stats directly from the gem so there are no more hardcoded values Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent cad86b9 commit eb3472c

File tree

2 files changed

+168
-66
lines changed

2 files changed

+168
-66
lines changed

src/Data/Skills/act_str.lua

Lines changed: 84 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7687,38 +7687,16 @@ skills["MoltenStrike"] = {
76877687
t_insert(breakdown.OverlapChance, s_format("^8=^7 %.2f^8%%", output.OverlapChance))
76887688
end
76897689

7690-
local numProjectiles = skillModList:Sum("BASE", skillCfg, "ProjectileCount")
7690+
local numProjectiles = output.ProjectileCount
76917691
local dpsMult = 1
7692-
if skillPart == 3 or skillPart == 5 or skillPart == 6 then
7692+
if skillPart == 3 then
76937693
dpsMult = overlapChance * numProjectiles
7694-
7695-
if skillPart ~= 6 then
7696-
if breakdown then
7697-
breakdown.SkillDPSMultiplier = {}
7698-
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7699-
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
7700-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
7701-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
7702-
end
7703-
else
7704-
-- zenith: make an effective dpsMult for the weighted average of normal and 5th attack balls
7705-
local gemQuality = activeSkill.activeEffect.quality
7706-
local fifthAttackMulti = 1 + 8 + 0.1 * gemQuality
7707-
local fifthAttackOverallMulti = fifthAttackMulti * overlapChance * (numProjectiles + 5)
7708-
dpsMult = 0.8 * dpsMult + 0.2 * fifthAttackOverallMulti
7709-
7710-
if breakdown then
7711-
breakdown.SkillDPSMultiplier = {}
7712-
t_insert(breakdown.SkillDPSMultiplier, "Weighted average DPS multiplier for balls")
7713-
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * balls dps) + (0.2 * 5th attack balls dps)")
7714-
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * normal ball hit * overlap chance * number of projectiles) " ..
7715-
"+ (0.2 * ball hit * 5th attack multiplier * overlap chance * (number of projectiles + 5))")
7716-
t_insert(breakdown.SkillDPSMultiplier, "^8= ball hit * overlap chance * (0.8 * number of projectiles " ..
7717-
"+ 0.2 * 5th attack multiplier * (number of projectiles + 5))")
7718-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7%.3f ^8* (0.8 * ^7%d ^8+ 0.2 * ^7%.1f ^8* ^7%d^8)",
7719-
overlapChance, numProjectiles, fifthAttackMulti, numProjectiles + 5))
7720-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7 %.3f", dpsMult))
7721-
end
7694+
if breakdown then
7695+
breakdown.SkillDPSMultiplier = {}
7696+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7697+
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
7698+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
7699+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
77227700
end
77237701
end
77247702
if dpsMult ~= 1 then
@@ -7856,16 +7834,89 @@ skills["MoltenStrikeAltX"] = {
78567834
area = true,
78577835
},
78587836
},
7859-
preDamageFunc = skills.MoltenStrike.preDamageFunc,
7837+
preDamageFunc = function(activeSkill, output, breakdown)
7838+
local skillCfg = activeSkill.skillCfg
7839+
local skillData = activeSkill.skillData
7840+
local skillPart = activeSkill.skillPart
7841+
local skillModList = activeSkill.skillModList
7842+
local t_insert = table.insert
7843+
local s_format = string.format
7844+
7845+
-- melee part doesn't need to calc balls
7846+
if skillPart == 1 then
7847+
return
7848+
end
7849+
7850+
local enemyRadius = skillModList:Override(skillCfg, "EnemyRadius") or skillModList:Sum("BASE", skillCfg, "EnemyRadius")
7851+
local ballRadius = output.AreaOfEffectRadius
7852+
local innerRadius = output.AreaOfEffectRadiusSecondary
7853+
local outerRadius = output.AreaOfEffectRadiusTertiary
7854+
7855+
-- logic adapted from MoldyDwarf's calculator
7856+
local hitRange = enemyRadius + ballRadius - innerRadius
7857+
local landingRange = outerRadius - innerRadius
7858+
local overlapChance = math.min(1, hitRange / landingRange)
7859+
output.OverlapChance = overlapChance * 100
7860+
7861+
if breakdown then
7862+
breakdown.OverlapChance = { }
7863+
t_insert(breakdown.OverlapChance, "Chance for individual balls to land on the enemy:")
7864+
t_insert(breakdown.OverlapChance, "^8= (area where a ball can land on enemy) / (total area)")
7865+
t_insert(breakdown.OverlapChance, "^8= (enemy radius + ball radius - min travel) / (max travel - min travel)")
7866+
t_insert(breakdown.OverlapChance, s_format("^8= (^7%d^8 + ^7%d^8 - ^7%d) / (^7%d^8 - ^7%d)",
7867+
enemyRadius, ballRadius, innerRadius, outerRadius, innerRadius))
7868+
t_insert(breakdown.OverlapChance, s_format("^8=^7 %.2f^8%%", output.OverlapChance))
7869+
end
7870+
7871+
local numProjectiles = output.ProjectileCount
7872+
local dpsMult = 1
7873+
if skillPart == 3 or skillPart == 5 or skillPart == 6 then
7874+
dpsMult = overlapChance * numProjectiles
7875+
7876+
if skillPart ~= 6 then
7877+
if breakdown then
7878+
breakdown.SkillDPSMultiplier = {}
7879+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7880+
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
7881+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
7882+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
7883+
end
7884+
else
7885+
-- zenith: make an effective dpsMult for the weighted average of normal and 5th attack balls
7886+
local fifthAttackMulti = 1 + skillData.FifthStrikeDamage / 100
7887+
local fifthAttackOverallMulti = fifthAttackMulti * overlapChance * (numProjectiles + skillData.FifthStrikeProjectiles)
7888+
dpsMult = 0.8 * dpsMult + 0.2 * fifthAttackOverallMulti
7889+
7890+
if breakdown then
7891+
breakdown.SkillDPSMultiplier = {}
7892+
t_insert(breakdown.SkillDPSMultiplier, "Weighted average DPS multiplier for balls")
7893+
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * balls dps) + (0.2 * 5th attack balls dps)")
7894+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= (0.8 * normal ball hit * overlap chance * number of projectiles) " ..
7895+
"+ (0.2 * ball hit * 5th attack multiplier * overlap chance * (number of projectiles + %d))", skillData.FifthStrikeProjectiles))
7896+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * overlap chance * (0.8 * number of projectiles " ..
7897+
"+ 0.2 * 5th attack multiplier * (number of projectiles + %d))", skillData.FifthStrikeProjectiles))
7898+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7%.3f ^8* (0.8 * ^7%d ^8+ 0.2 * ^7%.1f ^8* ^7%d^8)",
7899+
overlapChance, numProjectiles, fifthAttackMulti, numProjectiles + skillData.FifthStrikeProjectiles))
7900+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7 %.3f", dpsMult))
7901+
end
7902+
end
7903+
end
7904+
if dpsMult ~= 1 then
7905+
skillData.dpsMultiplier = (skillData.dpsMultiplier or 1) * dpsMult
7906+
output.SkillDPSMultiplier = (output.SkillDPSMultiplier or 1) * dpsMult
7907+
end
7908+
end,
78607909
statMap = {
78617910
["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
78627911
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
78637912
},
78647913
["molten_strike_every_5th_attack_projectiles_damage_+%_final"] = {
7865-
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 4, 5 } })
7914+
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 4, 5 } }),
7915+
skill("FifthStrikeDamage", nil),
78667916
},
78677917
["molten_strike_every_5th_attack_fire_X_additional_projectiles"] = {
7868-
mod("ProjectileCount", "BASE", nil, 0, 0, { type = "SkillPart", skillPartList = { 4, 5 } })
7918+
mod("ProjectileCount", "BASE", nil, 0, 0, { type = "SkillPart", skillPartList = { 4, 5 } }),
7919+
skill("FifthStrikeProjectiles", nil),
78697920
},
78707921
},
78717922
baseFlags = {

src/Export/Skills/act_str.txt

Lines changed: 84 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,38 +1386,16 @@ local skills, mod, flag, skill = ...
13861386
t_insert(breakdown.OverlapChance, s_format("^8=^7 %.2f^8%%", output.OverlapChance))
13871387
end
13881388

1389-
local numProjectiles = skillModList:Sum("BASE", skillCfg, "ProjectileCount")
1389+
local numProjectiles = output.ProjectileCount
13901390
local dpsMult = 1
1391-
if skillPart == 3 or skillPart == 5 or skillPart == 6 then
1391+
if skillPart == 3 then
13921392
dpsMult = overlapChance * numProjectiles
1393-
1394-
if skillPart ~= 6 then
1395-
if breakdown then
1396-
breakdown.SkillDPSMultiplier = {}
1397-
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
1398-
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
1399-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
1400-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
1401-
end
1402-
else
1403-
-- zenith: make an effective dpsMult for the weighted average of normal and 5th attack balls
1404-
local gemQuality = activeSkill.activeEffect.quality
1405-
local fifthAttackMulti = 1 + 8 + 0.1 * gemQuality
1406-
local fifthAttackOverallMulti = fifthAttackMulti * overlapChance * (numProjectiles + 5)
1407-
dpsMult = 0.8 * dpsMult + 0.2 * fifthAttackOverallMulti
1408-
1409-
if breakdown then
1410-
breakdown.SkillDPSMultiplier = {}
1411-
t_insert(breakdown.SkillDPSMultiplier, "Weighted average DPS multiplier for balls")
1412-
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * balls dps) + (0.2 * 5th attack balls dps)")
1413-
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * normal ball hit * overlap chance * number of projectiles) " ..
1414-
"+ (0.2 * ball hit * 5th attack multiplier * overlap chance * (number of projectiles + 5))")
1415-
t_insert(breakdown.SkillDPSMultiplier, "^8= ball hit * overlap chance * (0.8 * number of projectiles " ..
1416-
"+ 0.2 * 5th attack multiplier * (number of projectiles + 5))")
1417-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7%.3f ^8* (0.8 * ^7%d ^8+ 0.2 * ^7%.1f ^8* ^7%d^8)",
1418-
overlapChance, numProjectiles, fifthAttackMulti, numProjectiles + 5))
1419-
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7 %.3f", dpsMult))
1420-
end
1393+
if breakdown then
1394+
breakdown.SkillDPSMultiplier = {}
1395+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
1396+
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
1397+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
1398+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
14211399
end
14221400
end
14231401
if dpsMult ~= 1 then
@@ -1480,16 +1458,89 @@ local skills, mod, flag, skill = ...
14801458
area = true,
14811459
},
14821460
},
1483-
preDamageFunc = skills.MoltenStrike.preDamageFunc,
1461+
preDamageFunc = function(activeSkill, output, breakdown)
1462+
local skillCfg = activeSkill.skillCfg
1463+
local skillData = activeSkill.skillData
1464+
local skillPart = activeSkill.skillPart
1465+
local skillModList = activeSkill.skillModList
1466+
local t_insert = table.insert
1467+
local s_format = string.format
1468+
1469+
-- melee part doesn't need to calc balls
1470+
if skillPart == 1 then
1471+
return
1472+
end
1473+
1474+
local enemyRadius = skillModList:Override(skillCfg, "EnemyRadius") or skillModList:Sum("BASE", skillCfg, "EnemyRadius")
1475+
local ballRadius = output.AreaOfEffectRadius
1476+
local innerRadius = output.AreaOfEffectRadiusSecondary
1477+
local outerRadius = output.AreaOfEffectRadiusTertiary
1478+
1479+
-- logic adapted from MoldyDwarf's calculator
1480+
local hitRange = enemyRadius + ballRadius - innerRadius
1481+
local landingRange = outerRadius - innerRadius
1482+
local overlapChance = math.min(1, hitRange / landingRange)
1483+
output.OverlapChance = overlapChance * 100
1484+
1485+
if breakdown then
1486+
breakdown.OverlapChance = { }
1487+
t_insert(breakdown.OverlapChance, "Chance for individual balls to land on the enemy:")
1488+
t_insert(breakdown.OverlapChance, "^8= (area where a ball can land on enemy) / (total area)")
1489+
t_insert(breakdown.OverlapChance, "^8= (enemy radius + ball radius - min travel) / (max travel - min travel)")
1490+
t_insert(breakdown.OverlapChance, s_format("^8= (^7%d^8 + ^7%d^8 - ^7%d) / (^7%d^8 - ^7%d)",
1491+
enemyRadius, ballRadius, innerRadius, outerRadius, innerRadius))
1492+
t_insert(breakdown.OverlapChance, s_format("^8=^7 %.2f^8%%", output.OverlapChance))
1493+
end
1494+
1495+
local numProjectiles = output.ProjectileCount
1496+
local dpsMult = 1
1497+
if skillPart == 3 or skillPart == 5 or skillPart == 6 then
1498+
dpsMult = overlapChance * numProjectiles
1499+
1500+
if skillPart ~= 6 then
1501+
if breakdown then
1502+
breakdown.SkillDPSMultiplier = {}
1503+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
1504+
t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
1505+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
1506+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
1507+
end
1508+
else
1509+
-- zenith: make an effective dpsMult for the weighted average of normal and 5th attack balls
1510+
local fifthAttackMulti = 1 + skillData.FifthStrikeDamage / 100
1511+
local fifthAttackOverallMulti = fifthAttackMulti * overlapChance * (numProjectiles + skillData.FifthStrikeProjectiles)
1512+
dpsMult = 0.8 * dpsMult + 0.2 * fifthAttackOverallMulti
1513+
1514+
if breakdown then
1515+
breakdown.SkillDPSMultiplier = {}
1516+
t_insert(breakdown.SkillDPSMultiplier, "Weighted average DPS multiplier for balls")
1517+
t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * balls dps) + (0.2 * 5th attack balls dps)")
1518+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= (0.8 * normal ball hit * overlap chance * number of projectiles) " ..
1519+
"+ (0.2 * ball hit * 5th attack multiplier * overlap chance * (number of projectiles + %d))", skillData.FifthStrikeProjectiles))
1520+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * overlap chance * (0.8 * number of projectiles " ..
1521+
"+ 0.2 * 5th attack multiplier * (number of projectiles + %d))", skillData.FifthStrikeProjectiles))
1522+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7%.3f ^8* (0.8 * ^7%d ^8+ 0.2 * ^7%.1f ^8* ^7%d^8)",
1523+
overlapChance, numProjectiles, fifthAttackMulti, numProjectiles + skillData.FifthStrikeProjectiles))
1524+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7 %.3f", dpsMult))
1525+
end
1526+
end
1527+
end
1528+
if dpsMult ~= 1 then
1529+
skillData.dpsMultiplier = (skillData.dpsMultiplier or 1) * dpsMult
1530+
output.SkillDPSMultiplier = (output.SkillDPSMultiplier or 1) * dpsMult
1531+
end
1532+
end,
14841533
statMap = {
14851534
["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
14861535
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
14871536
},
14881537
["molten_strike_every_5th_attack_projectiles_damage_+%_final"] = {
1489-
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 4, 5 } })
1538+
mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 4, 5 } }),
1539+
skill("FifthStrikeDamage", nil),
14901540
},
14911541
["molten_strike_every_5th_attack_fire_X_additional_projectiles"] = {
1492-
mod("ProjectileCount", "BASE", nil, 0, 0, { type = "SkillPart", skillPartList = { 4, 5 } })
1542+
mod("ProjectileCount", "BASE", nil, 0, 0, { type = "SkillPart", skillPartList = { 4, 5 } }),
1543+
skill("FifthStrikeProjectiles", nil),
14931544
},
14941545
},
14951546
#baseMod skill("projectileSpeedAppliesToMSAreaOfEffect", true)

0 commit comments

Comments
 (0)