@@ -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 = {
0 commit comments