Цитата Сообщение от Jester Посмотреть сообщение
Опять ты сущности плодишь..

Вопросов то всего два: почему ШБ повышает кап (хотя по описанию не должен) и должны ли идти модификаторы мультипликативно или же аддитивно. Ты помнится утверждал что все глифы аддитивно идут..
Буду плодить "сущности". Сразу отвечу на первый вопрос: потому что дополнительный показатель блокирования от умения Блок щитом диминишингу не подвергается (парадокс, но получается что если Блок щитом увеличит показатель на значение больше капа, например на 4к, то все 4 к прибавятся в урон Мощного удара щитом в полном объеме).

Итак, у нас два кода расчета урона Мощного удара щитом.

DrDamage

self.Calculation["Shield Slam"] = function( calculation, ActiveAuras, Talents )
local dr = 24.5 * calculation.playerLevel --1960 at level 80
local cap = 39.5 * calculation.playerLevel --3160 at level 80
local bv = calculation.blockValue
local bonus = 0
if ActiveAuras["Shield Block"] then
local mult = self.MetaGem_BlockBonus + (Talents["Shield Mastery"] or 0) + (ActiveAuras["Glyph of Blocking"] and 0.1 or 0)
bonus = bv / (2 + mult)
bv = bonus * (1 + mult)
--TODO: Improve this?
if Talents["Shield Mastery"] and bv > dr then
bonus = bonus * (1 + math_min(0.13,(bv - dr) * 0.055))
end
end
if bv > dr then
--At level 80 true bonus is 2072 with 3160 blockvalue. 112 effective block value from 1200 block value.
bv = math_min(cap, bv)
bv = dr + (bv - dr) * (112/1200)
end
calculation.minDam = calculation.minDam + bv + bonus
calculation.maxDam = calculation.maxDam + bv + bonus
calculation.coeff = (bv + bonus) / calculation.blockValue
calculation.coeffv = calculation.blockValue
if self:GetSetAmount("T7 - Prot") >= 2 then
calculation.dmgM_Add = calculation.dmgM_Add + 0.1
end
if self:GetSetAmount( "T10 - Prot" ) >= 2 then
calculation.dmgM_Add = calculation.dmgM_Add + 0.2
end
end
[свернуть]


http://evanskikassaddons.googlecode.com/svn/trunk/addons/DrDamage/Data/Warrior.lua

self.Calculation["Shield Slam"] = function( calculation, ActiveAuras, Talents )
local dr = 24.5 * calculation.playerLevel --1960 at level 80
local cap = 39.5 * calculation.playerLevel --3160 at level 80
local bv = calculation.blockValue
local bonus = 0
if ActiveAuras["Shield Block"] then
local mult = (Talents["Shield Mastery"] or 0) + (self:HasGlyph(58375) and 0.1 or 0) + self.MetaGem_BlockBonus
local bonus = bv / (2 + mult)
bv = bonus * (1 + mult)
end
--TODO: Fix this to 3.3.2 values, for now assuming linear diminishing returns
if bv > dr then
--At level 80 true bonus is 2072 with 3160 blockvalue
bv = math_min(cap, bv)
local c = (bv - dr)/(cap - dr) * (2072/3160)
bv = dr + (bv - dr) * (1 - c)
end
calculation.minDam = calculation.minDam + bv + bonus
calculation.maxDam = calculation.maxDam + bv + bonus
if self:GetSetAmount("T7 - Prot") >= 2 then
calculation.dmgM_Add = calculation.dmgM_Add + 0.1
end
if self:GetSetAmount( "T10 - Prot" ) >= 2 then
calculation.dmgM_Add = calculation.dmgM_Add + 0.2
end
end
[свернуть]


Оба кода почти идентичны. Однако в первом коде есть странная часть

if Talents["Shield Mastery"] and bv > dr then
bonus = bonus * (1 + math_min(0.13,(bv - dr) * 0.055))
end

Как и Zhekich'а наверное, меня интересует откуда она вообще взялась. Это первое наблюдение.

Теперь пройдемся по тому, что дают нам оба кода.

Умение Блок щитом увеличивает базовый показатель блокирования на 100% (т.е. до применения таланта, символа, метакамня) - другими словами, талант, символ и умение аддитивны, и этот дополнительный показатель блокирования не подвергается диминишингу при переводе в урон Мощного удара щитом (т.е. сохраняется коэф. перевода 1). Вместе с тем диминишингу подвергается дополнительный показатель блокирования от таланта, символа или метакамня. На это указывают вот какие строки обоих кодов:

if ActiveAuras["Shield Block"] then
local mult = (Talents["Shield Mastery"] or 0) + (self:HasGlyph(58375) and 0.1 or 0) + self.MetaGem_BlockBonus
local bonus = bv / (2 + mult)
bv = bonus * (1 + mult)
end

В данном алгоритме bonus как раз и есть дополнительный показатель блокирования, полученный от умения Блок щитом. Допустим у нас 3160 базового показателя блокирования. Если наше предположение верно, то итоговый показатель блокирования при наличии таланта, символа и активном умении будет равен 3160*(1+0,3+0,1+1) = 7584. Это значение будет входящим в алгоритм bv.

local mult = 0,3+0,1+0 = 0,4
local bonus = 7584/(2+0,4) = 3160
bv = 3160*(1+0,4)

В дальнейшем этот бонус не подвергается никаким операциям (кроме той, на которую я указал в самом начале) и прибавляется в полном объеме к урону Мощного удара щитом.

calculation.minDam = calculation.minDam + bv + bonus
calculation.maxDam = calculation.maxDam + bv + bonus

А вот оставшаяся часть общего показателя блокирования, в которую входит базовое его значение и полученное от таланта, символа или метакамня - это у нас bv = bonus * (1 + mult), уже подвергается диминишингу. Который в коде как раз и не диминишинг

Всем известно, что диминишинг - это спадающая эффективность прироста показателя. Т..е. каждая следующая его единица дает все меньший прирост итогового показателя. Однако достоверно неизвестно, какова изначальная формула димишинга перевода показателя блокирования в урон Мощного удара щитом, поэтому игроками проводились попытки на основе имеющихся данных построить уравнение регресси (т.е. предположить, какова эта функция на самом деле). В данном случае, для обоих кодов данная функция была предположена как линейная, на что кстати намекает --TODO: Fix this to 3.3.2 values, for now assuming linear diminishing returns в коде. Вот часть кода, которая и содержит эту функцию.

if bv > dr then
--At level 80 true bonus is 2072 with 3160 blockvalue
bv = math_min(cap, bv)
local c = (bv - dr)/(cap - dr) * (2072/3160)
bv = dr + (bv - dr) * (1 - c)
end

Здесь игрокам были известны две определяющие точки функции (показатель блокирования; дополнительный урон Мощного удара щитом): (1960;1960) и (3160;2072). Как заметил Zhekich, функция составлена неточно, поскольку из ее выпадает точка (3160;2072). Скорее всего авторы кода ошиблись в построении этой функции. Как и в следующем - для линейной функции димишинга не существует, каждая единица ее аргумента дает постоянный прирост значения функции.

А вот еще один источник информации.

http://www.tankspot.com/showthread.p...lam-DR-Formula

Автор этой темы верен в одном - если есть диминишинг, значит функция должа быть кривой, а не линейной. Его предположение относительно нее

X * (Block-1960) - Y * (Block-1960)^2

З.Ы. Я могу и ошибатся в аддитивности умения Блок щитом при расчете показателя блокирования. Вполне возможно, что он все таки действительно увеличивает уже имеющися показатель блокирования в два раза (т.е. мультипликативен), но та чать урона Мощного удара щитом, которую он добавляет, согласно обоим кодам будет равна все таки именно базовому показателю блокирования и у нее нет ни диминишнга, ни капа.