Originally Posted by
Geodew
Of course, it benefits Revival if you pair it with Revival, but Revival crits can easily overheal, so not sure how useful that is. Further, if all you need is to save 1-3 people at 5%, which happens sometimes, it doesn't really matter much whether it crits or not because it saves their life regardless. Revival's maybe a weird side-case, but should at least be taken into account.
Forgive my disagreeing to you that critical strike causes more overhealing. However, I cannot say you are wrong, for I haven't tested them.
I could give you two functions to test which take account of multistrike and critical strike. I use these two functions to predict uplift and revival healing in my addons. They work well. The first is pvp version, the second is pve version. In pve, there might cause two multistrike, so it's very complex. But the PVP version is simple, you can read it to help you learn how it might be in pve. These two functions calculate the mathematical expectation healing. I hadn't solved this math problem for a long time until 2 weeks ago.
Code:
-- ms = GetMultistrike()/100,crit = GetCritChance()/100, hd is someone's max_health-his_health, raw_healing is an instant raw spell healing(without ms and crit).
local function mscr_pvp(ms,crit,hd,raw_healing)
local nocr = 1 - crit
local noms = 1 - ms
local temp = 0
local chance = 0
local efct = 0
if hd<raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = nocr*noms
chance = chance + temp
efct = efct + temp
if hd<1.3*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = ms*nocr*nocr
chance = chance + temp
efct = efct + 1.3*temp
if hd<1.45*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*ms*nocr
chance = chance + temp
efct = efct + 1.45*temp
if hd<1.5*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*noms
chance = chance + temp
efct = efct + 1.5*temp
if hd<1.8*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*ms*nocr
chance = chance + temp
efct = efct + 1.8*temp
if hd<1.95*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*crit*ms
efct = efct + 1.95*temp
return efct * raw_healing
end
local function mscr_pve(ms,crit,hd,raw_healing)
local nocr = 1 - crit
local noms = 1 - ms
local temp = 0
local chance = 0
local efct = 0
if hd<raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = nocr*noms*noms
chance = chance + temp
efct = efct + temp
if hd<1.3*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = 2*ms*nocr*nocr*noms
chance = chance + temp
efct = efct + 1.3*temp
if hd<1.6*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = ms*ms*nocr*nocr*nocr+2*crit*ms*nocr*noms
chance = chance + temp
efct = efct + 1.6*temp
if hd<1.9*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = 2*crit*ms*ms*nocr*nocr
chance = chance + temp
efct = efct + 1.9*temp
if hd<2*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*noms*noms
chance = chance + temp
efct = efct + 2*temp
if hd<2.2*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*crit*ms*ms*nocr
chance = chance + temp
efct = efct + 2.2*temp
if hd<2.3*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = 2*crit*ms*nocr*noms
chance = chance + temp
efct = efct + 2.3*temp
if hd<2.6*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*ms*ms*nocr*nocr+2*crit*crit*ms*noms
chance = chance + temp
efct = efct + 2.6*temp
if hd<2.9*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = 2*crit*crit*ms*ms*nocr
chance = chance + temp
efct = efct + 2.9*temp
if hd<3.2*raw_healing then
return efct * raw_healing+(1-chance) * hd
end
temp = crit*crit*crit*ms*ms
efct = efct + 3.2*temp
return efct * raw_healing
end