@@ -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