Skip to content

Commit ac45d6e

Browse files
author
LocalIdentity
committed
Fix Molten Strike of the Zenith Total Weighted Ball Average calc
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
1 parent 03e5d40 commit ac45d6e

2 files changed

Lines changed: 168 additions & 66 deletions

File tree

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)