Рекламушка :)

Баги, Близзы, ДПС. К вопросу расчетов урона оружия.

Сразу оговорюсь: данная статья не является развлекательно-легким чтивом, которое можно ненапряжно пролистать в обеденный перерыв за чашкой кофе. Предлагаемый вашему вниманию материал является серьезным исследованием автора, который, в том числе, использовал в своей работе бесчисленные расчеты, замечания, намеки, озарения, умозаключения многих и многих посетителей самых различных Д3-форумов, им всем - спасибо! Однако ничего похожего на получившийся в результате труд по объему, структурированности и анализу фактов ему лично не встречалось. Для полного освоения материала вам, совершенно несомненно, потребуется все ваше внимание, и, если вы хотите проверять расчеты автора (что настоятельно рекомендуется), что еще ручка, листок бумаги и элементарный калькулятор. Да, и конечно, еще требуется ваш интерес к так называемому "теор-крафту" и желание понять "чего ж там эти синие наворотили". Если вам нравится просто взрывать монстров не забивая себе голову всякой "околонаучной чушью", то, боюсь, статья покажется вам несколько нудноватой. :)

Какой "профит" вас ожидает, если вы потратите известные усилия и время на освоение предлагаемого материала? Ну, уж за что автор спокоен совершенно, так это именно за "профит" - судите сами.

  1. Вы узнаете, как же, Азмодан их всех забодай, рассчитывается ДПС на любом оружии, будь то оружие с физическим бонусом, бонусом элементальным, процентным бонусом к урону, комбинацией этих бонусов, а равно без бонусов вовсе.
  2. Вы узнаете откуда берутся исходные данные для таких расчетов. И как их, эти самые "входные данные", посмотреть наиболее удобным способом.
  3. Вы узнаете, что взяв четыре целых числа и такое же количество арифметических действий, при условии наличия у вас фантазии в требуемом объеме (у сотрудников всеми уважаемой фирмы с этим, на наше "счастье", проблем никаких), вполне можно создать систему исчислений, легко выносящую мозг среднестатистическому игроку со среднестатистическим же высшим образованием.
  4. Вы узнаете, что те цифры которые вы наблюдаете во всплывающем окошке при завешивании курсора мыши над оружием (карточка предмета) подчас подразумевают совершенно не то, что вы думаете глядя на них. Как говорится, есть факты, но есть и их интерпретация. И далеко не так однозначно что из двух важнее.
  5. Вас интересовало что же это за баг, который есть в "черном" оружии и который не будет исправляться в обозримом будущем? Вы получите совершенно исчерпывающий ответ на этот вопрос, а так же будете полностью подготовлены к возможным последствиям для ваших конкретных пушек, буде Близз-Компания поменяет свою точку зрения и отношение к багу. А ведь ЭТИ - могут!
  6. У автора в работе находится вторая статья о Маркиз-рубинах (кстати, знаете ли вы, что новые топ-камни в единственном числе правильно звать Маркиза, а не Маркиз? Потому что соответствующая огранка алмаза - Маркиза - имеет именно женский, а не мужской род. Не обижайте девочек. :)) ) и их влиянии на ДПС оружия. А в связи с планируемым апом вообще всех рубинов тематика той статьи будет интересна в приложении и к ним так же. Так вот та вторая статья будет полностью опираться на эту, "базовую", поскольку все расчёты поясняются и демонстрируются именно здесь. Так что во избежание чтения сразу двух довольно сложных статей в будущем, лучше изучать и воспринимать их по отдельности и последовательно.

Надеюсь, автору удалось заронить искру интереса в пытливый ум читателя, и мы - начинаем.

Урон (DPS) от любого оружия в D3 высчитывается всего-то из ВОСЬМИ исходных чисел, вот они.

base_min. Минимальный урон оружия, а точнее "болванки" этого оружия. Например, посмотрев на общую характеристику широко известного топора "Презрение" можно подумать, что этот параметр для него = 917. Однако не нужно так думать, поскольку, как известно этот уважаемый всеми варварами (да и не только ими) топор, сделан из "Главореза" и вот его минимальный урон (507) является значением обсуждаемого параметра и для "Главореза", и для всех его "производных". Аналогично, для "Отголосока ярости" неправильно считать этот параметр=370, потому что он равен 160, в чем легко убедиться посмотрев характеристики "болванки" для этой легендарной булавы - "Остроконечный молот". Для совсем не наблюдательных товарищей поясню, что "болванкой" абсолютно любого оружия является обычная (белая, в цветах игры) пушка относящаяся к тому же классу вооружения (булава, меч, двуручный меч и т.д.) и имеющая тот же самый iLVL что и оружие DPS которого мы нацелились вычислить. Игра устроена таким образом, что оба пункта будет выполнять ровно одно оружие из обширного арсенала игры и именно оно и будет "болванкой".

base_delta. Разница (дельта) между base_min и base_max (понятно, что вычитать следует из большего меньшее, отрицательные числа нам не нужны, у нас и так все не просто). Снова, как вы правильно понимаете, нужно смотреть "болванку". Однако, в отличии от предыдущего пункта, тут есть "грабли" в виде диапазона (а не конкретного числа) для base_max в характеристиках болванки. Да, вот так: для минимального урона значение указывается точно, а в максимальный урон "болванки" свою лепту вносит рандом. На том же "Остроконечном молоте" минимум (предыдущий параметр) всегда будет 160, а вот максимум (вычитанием из которого образуется параметр текущий) будет колебаться в диапазоне 296–306. Разумеется, каждый опознанный предмет имеет строго определенное значение base_max, и, следовательно, совершенно точное значение для base_delta. Но как его узнать? Ну - можно пойти от обратного: DPS у нас перед глазами (большие белые цифры на картинке оружия), минимум берем из "болванки" и, методом "обратного инжиниринга", по формулам ниже, вычисляем base_delta. Но есть способ лучше и точнее, поскольку даже якобы "точному" base_min взятому из описания "болванки" на сайте battle.net можно доверять не всегда (см. ниже). Так вот если интересующее вас оружие "засветилось" в "Профиле персонажа" (a.k.a. "армори") и не важно чей это профиль - ваш или соседа-сопартийца, то требуемые для расчета ДПС "входные" цифры (причем все сразу, и абсолютно точные, ибо именно так "видит" данную пушку игра) можно просто "посмотреть глазами", и ниже я расскажу - как. Итак, пока запоминаем:

bonus_min/bonus_min_color. Предыдущих двух параметров, как вы понимаете, не может не быть даже на примитивнейшей из пушек 3-го iLVL-а. А вот обсуждаемый параметр является строго опциональным. Однако, если ваш персонаж достиг уровня сложности "Пекло" то на его пушке он есть с вероятностью 99.99%, а если вы приступили к прокачке Парагона, то вероятность присутствия данного параметра на пушке равна 1. Вас же не интересуют одноручки с DPS 300 и двуручки с DPS 700? Значит, ваша пушка обладает этим параметром. Поэтому считаем, что этот параметр есть у нас у всех гарантировано. НО! Предстать он может в двух "инкарнациях":

Т.е. если подпись к бонусу НЕ уточняет от какой стихии "приходит" к нам этот бонус - то у нас т.н. "черный" дамаг-бонус. Если же стихия указана, то это будет НЕ-"черный" / "цветной" / "элементальный" / "стихийный" и т.д (кто как хочет, тот так и называет) бонус к урону. "Черной" пушкой принято называть такую которая содержит только "черный" бонус. Если же она содержит и "черный", и "цветной" бонусы, а уж тем более если только последний, то ее называют "цветной" пушкой. На самом деле "черный дамаг"="физический дамаг", в чем мы убедимся в самом ближайшем будущем, так что если "физику" считать стихией, то все бонусы без исключений - стихийные и элементальные. Для краткости и понятности автор данных строк будет обозначать физический/черный бонус к урону как именно "черный", а любой иной как "цветной".

Мнемоническое правило 1: "цветной" бонус-урон всегда уточняется на самой пушке припиской какая стихия его наносит (на Бул-Катосе выше вражине влетает минимум 159 дополнительного дамага не абы чего, а именно стихии Света). "Черный" урон никогда не уточняется никакими приписками.

Мнемоническое правило 2: "черный" урон записывается "в столбик", в 2 строки: сначала минимальный бонус (его-то, кстати, мы и обсуждаем в настоящий момент, не забыли еще?), строкой ниже - максимальный. Если на данной пушке сролился лишь один из двух (только минимальный "черный" или только максимальный "черный"), то одна из строк просто пропускается. Что само собой подразумевает, значение 0 для не-сролившегося бонуса. "Цветной" урон записывается вдвое компактнее и через тире, слева - минимум (снова - его-то и обсуждаем), справа - максимум.

И - да, заметьте себе, что в наших рассуждениях об отображении бонус-урона на карточке предмета из последнего абзаца, минимум - это минимум во всех смыслах, а вот максимум… это еще "тот" максимум, что вовсе и не максимум. Точнее - не всегда максимум. В общем - продолжайте чтение, вас ждут большие открытия. ПОКА для простоты считаем что у нас перед глазами именно минимум бонуса и именно максимум его же.

Законный вопрос, а стоит ли так уж "упарываться" в методы разделения и различения одного вида бонус-урона от другого? Большая ли разница? На что автор вам ответит со всей серьезностью: разница колоссальная. Поэтому - соберите все свое внимание и очень тщательно отделяйте один вид бонуса от другого при чтении данной статьи. И вдвойне тщательней при подборе для своего персонажа нового оружия. И да, учтите, что еще бывают пушки с сочетанием "черного" и "цветного" уронов одновременно. Хотя как уже было отмечено правильно называть их все-таки "цветными" пушками (поскольку основной вклад в их итоговый ДПС вносит именно "цвет"), расчет точного итогового ДПС для них является комбинацией расчетов для "чисто черных" и "чисто цветных" пушек. Их мы рассмотрим в свое время, и отдельно...

bonus_delta/bonus_delta_color. Тут все просто, если вы освоили предыдущие пару параграфов и если прочитав параграф текущий вы не впадете в коматозное состояние: ниже от bonus_min/правее от bonus_min_color будет ИЛИ bonus_delta (нужный и обсуждаемый в текущую минуту параметр), ИЛИ bonus_max_color (не нужный и не обсуждаемый, но позволяющий выйти на требуемое). Разбираем последовательно, сначала "черный" "типа максимальный" бонус.

Он записывается строкой "+XX к максимальному урону" (см. "Презрение" выше) и может восприниматься (и воспринимается) как просто "добавить XX к макс. урону", в то время как это именно дельта, добавляемая к предыдущему параметру. Ниже по тексту вы увидите, как эта неочевидность реализована в формулах расчета, а пока просто запомните: в "черных" пушках вы всегда (в общем случае) видите минимальный бонус и дельту к нему, а не минимальный и максимальный бонусы.

А теперь - бонус "цветной". Второе к нему значение записывается через тире от bonus_min_color и, после предыдущих объяснений, может восприниматься как дельта к последнему, в то время как это именно максимум бонуса (bonus_max_color).

Поскольку для расчета DPS нам требуется исключительно дельта, и никогда НЕ максимум, то в случае "черного" бонуса мы просто берем требуемое из строки "+XX к максимальному урону", а в случае "цветного" бонуса из того что справа от тире, вычитаем то что слева и уже полученной разницей пользуемся:

А вы думали локация "Ад разработчиков" просто для фана запилена? Нееет, тут тонкий психологический расчет, поскольку игроку иногда ОЧЕНЬ хочется взять и уе... ммм... врезать кому-нибудь. Утешает одно. Совсем скоро автор расскажет вам способ, которым вы гарантировано будете получать сразу дельту и только ее, и не важно что там на карточке оружия нарисовано. И последнее: тип дельты ("черная"/"цветная") всегда совпадает с типом минимального бонуса (предыдущий параметр) дельтой которого она, собственно, и является.

dmg%. Гораздо проще:

Понятно, что параметр полностью опциональный, его может просто не быть на вашей пушке (и тогда в расчетах он принимается равным 0) и она все-равно будет весьма серьезным и грозным оружием. Но если он есть, то его вклад в итоговый DPS переоценить просто невозможно...

APS (Attacks Per Second). Мега-элементарно:

Разумеется, так что бы на пушке не было никакого APS - не бывает.

Вот и все, данные восемь чисел:

  1. base_min
  2. base_delta
  3. bonus_min
  4. bonus_min_color
  5. bonus_delta
  6. bonus_delta_color
  7. dmg%
  8. APS

просчитают вам ДПС любого оружия. Если на данной пушке любое из них пропущено, то считайте его равным 0 и пользуйтесь все теми же формулами к обсуждению которых мы вскоре приступим. "Ядром" же расчетов и вовсе являются первые 6 (или даже 4, если отбросить "цветные" вариации бонусов) параметров, поскольку все начинается с базового урона и его дельты и бонус-урона и его дельты. Несложно? Ну - это как посмотреть...

Теперь - откуда брать эти исходные 8 цифр, если мы хотим проверить, что нам насчитала игра в качестве итогового DPS нашего оружия. Опять же - "а чо, ее проверять надо??". А вы как думали! Не то что бы мы с вами могли что-то поделать с "неправильным" расчетом игры (а неправильность есть! признано "синими", лично), но "кто предупрежден - тот вооружен". Поэтому - как же посчитать DPS вручную?

Как было показано в начале статьи, в принципе, все требуемые исходные значения берутся прямо с картинки оружия плюс небольшое сканирование по базе "болванок" на сайте Battle.NET. Но есть способ лучше! Поскольку интересует вас, надо думать, прежде всего оружие находящееся в руках ваших персонажей, а эти последние со всем что на них надето/взято в их руки надежно упаковано в "армори" - можно пойти "высоко-технологичным" путем. Возьмем, для примера, автора данных строк. Его основной (и единственный) персонаж в мире D3 (скромный варвар Mammoth 100-го уровня парагона) расположился в "армори" по вот этой ссылке: http://eu.battle.net/d3/en/profile/Einarr-2888/hero/18732179. В руках у него, как это легко наблюдать, легендарный "Скорн" a.k.a. "Презрение". Подводим к нему указатель мыши но НЕ щелкаем! Что появляется в нижней (статусной) строчке нашего браузера? Появляется там ссылка на страницу данной вещи на сайте Battle.NET, а именно: http://eu.battle.net/d3/en/item/skorn или http://eu.battle.net/d3/ru/item/skorn (если вы смотрите профиль автора в русскоязычном "армори"). Отбрасываем из ссылки все, что левее символов "d3" в тексте ссылки, получаем "усечённую" ссылку: d3/en/item/skorn или d3/ru/item/skorn соответственно. Дальше - открываем исходный (HTML) код страницы "армори" показывающей варвара Mammoth. Абсолютно все браузеры умеют это делать из контекстного меню вызываемого правой кнопкой мыши в любой точке страницы, нужный нам пункт меню будет зваться "View Source", "Просмотр кода страницы" или типа того. В общем - получили изрядный кусок обычного текста напичканного HTML-тегами. Сразу же учиняем в нем поиск усечённой (но не полной!) ссылки на оружие. Эту усеченную ссылку мы можем обнаружить в коде больше одного раза - это совершенно не важно, поскольку все они оформляются однотипно:

<a class="slot-link" href="/d3/ru/item/skorn" data-d3tooltip="item/ClwIh5D5jAUSBwgEFdltpAwddvIOUh2GAmPqHdILi94d_SftZR1Vum3gHee-mnEwCTiXAkAAUBJglwJqIQoMCAAQ1PKQl4GAgMAdEhEIABIHCAQVHpaumDAJOABAARiyt6PKAVACWAA">

Видите в показанном тэге <a> атрибут data-d3tooltip и его внушающее уважение любому не-IT-шнику значение в двойных кавычках? Вот это последнее нам и надо! Формируем "финальную ссылку": к статической части http://us.battle.net/api/d3/data/ "прицепляем" справа (без пробелов) ВСЕ что находится в тех самых двойных кавычках. Т.е. в нашем примере получаем:

http://us.battle.net/api/d3/data/item/ClwIh5D5jAUSBwgEFdltpAwddvIOUh2GAmPqHdILi94d_SftZR1Vum3gHee-mnEwCTiXAkAAUBJglwJqIQoMCAAQ1PKQl4GAgMAdEhEIABIHCAQVHpaumDAJOABAARiyt6PKAVACWAA

Ну и открываем показанную финальную ссылку как обычную страницу в браузере. Вуа-как говорят французы-ля, мы поимели XML/Json data для выбранного оружия. Если вы, опять же, не айтишник, не напрягайтесь вопросами "а что есть XML/Json" - важно то, что мы поимели все что нужно для расчета ДПС, и нас далее не волнуют ни картинки конкретных пушек, ни их "болванки". Потому что на указанной странице имеются:

  1. Damage_Weapon_Min#Physical=base_min. Но тут - два важных замечания. Во-первых, в подобной конструкции (относится ли она к урону "болванки", или к урону "бонусному") после решетки (#) идет уточнение типа дамага, т.е. то самое его разделение на "черный" и "цветной". Как вы уже правильно догадались Physical ="черный", любое иное - "цветной". Во-вторых, не путайте показанный параметр с minDamage, так же представленным на той же странице. Damage_Weapon_Min - "входящее" значение для расчетов, minDamage - "исходящее", его результат. Собственно, используя первое мы пытаемся подтвердить/опровергнуть правильность расчета второго.
  2. Damage_Weapon_Delta#Physical=base_delta.
  3. Damage_Weapon_Bonus_Min#Physical=bonus_min.
  4. Damage_Weapon_Bonus_Delta#Physical=bonus_delta.
  5. Damage_Weapon_Percent_Bonus#Physical=dmg%.
  6. Attacks_Per_Second_Item=APS.

Если бы на "Презрении" автора был бы еще "цветной" бонус-урон от, допустим, огня (жаль, что его нет, кстати :) ), то на той же странице были бы представлены например такие строки и их значения:

7. Damage_Weapon_Min#Fire=bonus_min_color=101.

8. Damage_Weapon_Delta#Fire=bonus_delta_color=217.

Увы, двух последних строк нет, а значит для данного топора "цветной" бонус-минимум и его дельта оба равны 0 и мы можем просто опустить их из ближайших расчетов, дабы не ошарашивать читателя так уж сразу, а делать это постепенно. :) Вот такой крайне удобный (с точки зрения автора) способ добывания "сырых" данных. Остается пожалеть, что этот способ не "прокатывает" для вещей в сундуке/на аукционе. :( Вещь непременно должна появиться в армори.

Итак, конкретно на "Презрении" автора упомянутые выше 6 параметров выролились в такие значения:

  1. Damage_Weapon_Min#Physical=base_min=507.
  2. Damage_Weapon_Delta#Physical=base_delta=106.
  3. Damage_Weapon_Bonus_Min#Physical=bonus_min=282.
  4. Damage_Weapon_Bonus_Delta#Physical=bonus_delta=308.
  5. Damage_Weapon_Percent_Bonus#Physical=dmg%=0.5=50% (но в формулы ниже следует подставлять именно 0.5 как значение данного параметра).
  6. attacksPerSecond=APS=1.0.

Показанные значения указываются на XML/Json-странице в фигурных скобках, после атрибутов "min" и "max", причем значения в обоих всегда совпадают и можно пользоваться любым. Для чего потребовалось такое избыточное дублирование автор затрудняется сказать… Видимо в планах было сооружение нечто вообще фееричного, с привлечением таких расчетов что бы мало уж совершенно никому не показалось. По счастью, Близз-ребята вовремя удержались от непоправимого, справедливо рассудив "а и так неплохо получилось". Да уж, "неплохо". И даже настолько здорово, что описание алгоритма элементарного (как может показаться) расчета выливается страниц в 10 текста. А если б нам еще минимальные/максимальные значения "внутри" каждого из 8-ми входных параметров, то и вовсе чудесно было б. Так что если кому-то кажется, что "наворотили тут… без бутылки не разберешься", скажите спасибо, что требуется всего бутылка, а не ящик. :)) Ладно, продолжим…

Обратите внимание, что последние 6 цифр полностью подтверждены и картинкой самого Презрения автора

и "болванкой" из которой он был изготовлен, хотя, повторю, имея на руках "финальную" ссылку на XML/Json нам не требуется ни первого, ни второго. Автор с сожалением отметил, что ему досталась минимальная "базовая дельта", ибо

base_max=base_min(507)+base_delta(106)=613

это левая граница максимального урона "болванки". Если бы выролилась правая граница того же самого (629), то и "базовая дельта" была бы на 16 единиц больше. Но - увы, работаем с тем что есть. :(

Так же, и еще раз, отмечаю, что цифра 308 воспринимается по картинке как однозначно максимальный бонус, парный бонусу минимальному (282), в то время как в реальности это дельта добавляемая к последнему числу, и спустя минуту вы увидите как это происходит. Ну и наконец, формула расчета:

DPS ("большие белые" цифры)=(Min_damage+Max_damage)/2 * APS

Min_damage и Max_damage, в свою очередь, представляют "малые белые" цифры и располагаются непосредственно ниже цифр "больших", записанные через тире. При этом Min_damage рассчитывается элементарно:

Min_damage = (base_min+bonus_min) * (1+%dmg) = (507+282)*1.5 = 1183.5 ~= 1184, что и подтверждается картинкой.

С Max_damage похитрее дело будет. Сначала нужно рассчитать вспомогательный параметр Max_P, алгоритм расчёта которого зависит от выполнения неравенства

bonus_min > base_delta

Если указанное неравенство СОБЛЮДЕНО (истина, true), то

Max_P=bonus_min+1

а если НЕ соблюдено (ложь, false), то

Max_P=base_delta

И уж после этого:

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)

В нашем примере bonus_min(282) > base_delta(106) и неравенство СОБЛЮДЕНО , а значит

Max_P=bonus_min+1=283

А значит

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(507+308+283)*1.5=1647

Снова подчеркиваю, 308 добавилось к 282 (ну, точнее, к 282+1), а значит сыграло роль его дельты, как о том недвусмысленно намекает название этого параметра в XML/Json - Damage_Weapon_Bonus_Delta. Ну и финишный бросок:

DPS=(Min_damage+Max_damage)/2 * APS=(1183.5+1647)/2*1.0=1415.25~=1415.3

Все три финальных числа блестяще подтверждены картинкой авторского Презрения, а значит вычисления были "верны". Почему последнее слово в кавычках? Читайте далее...

Временно оставим пушки "черные" и переместимся к пушкам "цветным", то бишь с элементальным уроном. Посчитаем теперь их урон. Поскольку читатель, как надеется автор, к текущей точке повествования уже вполне освоился в не столь и сложном процессе добывания исходных данных для вычислений, будем лаконичны. Пушка вот она:

XML/Json данные полученные описанным выше способом говорят нам что для нее:

  1. Damage_Weapon_Min#Physical=base_min=150.
  2. Damage_Weapon_Delta#Physical=base_delta=127.
  3. Damage_Weapon_Min#Holy=bonus_min_color=159.
  4. Damage_Weapon_Delta#Holy=bonus_delta_color=328.
  5. Damage_Weapon_Percent_Bonus#Physical=dmg%=0.41.
  6. attacksPerSecond=APS=1.443 (вообще-то показывается значение 1.4429999470710755, но будем в расчетах использовать 1.443).

Все идеально согласуется с картинкой самой пушки, и ее "болванки" - на этот раз ее роль сыграл "Убийственный меч". Как положено, что бы игрок не скучал, в этот раз в карточке пушки показывается не дельта "цветного" бонус-урона (328), а его максимальное значение, 487=159+328. Так же интересней, верно?

Ну - пока все "отлично" (то есть, понятно, что косяки уже лезут отовсюду, но по сравнению с тем, как это МОГЛО БЫ быть...), считаем итоговый DPS:

Min_damage=(base_min+bonus_min)*(1+%dmg)=(150+159)*1.41=435.69~=436

Что за притча?? На картинке ж 371 в качестве минимального урона! А!! Заметили? А это все потому, что у нас бонус - "цветной", а "база" - "черная". Видите в последнем списке входных данных уточнения #Physical и #Holy? А помните, как во втором классе вас учительница наставляла никогда в жизни не складывать яблоки и апельсины? Так и тут. А поэтому формула еще усложняется:

MIN_DAMAGE = Min_damage + bonus_min_color,

где Min_damage - тоже самое что было в предыдущем примере, то есть базовый "черный" урон, а MIN_DAMAGE - минимальный дамаг пушки "с учетом всего". Ну что ж, считаем заново, учтя что "черный" bonus_min на данной пушке просто 0:

Min_damage=(base_min+bonus_min)*(1+%dmg)=150*1.41=211.5

MIN_DAMAGE=Min_damage+bonus_min_color=211.5+159=370.5~=371

Получилось? Не расслабляться, дальше - веселее. :) Вы уже правильно поняли:

MAX_DAMAGE=Max_damage+bonus_min_color+bonus_delta_color,

с теми же оговорками что выше. Считаем "черный" Max_damage. Для начала, неравенство bonus_min > base_delta (где bonus_min именно "черный" бонус!!) - выполняется ли? Ну, с учетом что bonus_min у нас просто 0 - сами-то как думаете? А поэтому промежуточный параметр Max_P просто равен base_delta, то бишь 127. Тогда:

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(150+0+127)*1.41=390.57

И помните, в этой формуле - ничего "цветного"! Потому и 0. Ну и наконец:

MAX_DAMAGE=Max_damage+bonus_min_color+bonus_delta_color=390.57+159+328=877.57~=878

И совсем уж "добьём" задачу:

DPS=(MIN_DAMAGE+MAX_DAMAGE)/2 * APS=(370.5+877.57)/2*1.443=900.4825~=900.5

Вэри-как говорится-вэлл. А что если нам теперь замахнуться даже не на Вильяма, понимаете ли, нашего Шекспира - нет, мы поднимем планку гораздо круче - а на расчет ДПС пушки имеющей комбинированный бонус, "черно"-"цветной"? Говорите что никогда такой не видели? Ну, они как те суслики: вы их не видите, а они - есть:

Ее "входные" данные:

  1. Damage_Weapon_Min#Physical=base_min=45.
  2. Damage_Weapon_Delta#Physical=base_delta=88.
  3. Damage_Weapon_Bonus_Min#Physical=bonus_min=30.
  4. Damage_Weapon_Min#Holy=bonus_min_color=254.
  5. Damage_Weapon_Delta#Holy=bonus_delta_color=362.
  6. Damage_Weapon_Percent_Bonus#Physical=dmg%=0.
  7. attacksPerSecond=APS=1.5.

Любопытно отметить, что данные полностью согласуются с картинкой самой пушки, а вот с ее "болванкой" ("Длинный кинжал") - накладочка вышла. Сайт показывает минимальную базу урона в 43 единицы, а XML/Json - 45. Ради интереса автор посмотрел этот же параметр у другого кинжала, уровня 63, получилось: сайт - 67, XML/Json - 69. Кто здесь "есть ху" - решайте сами, автору так мыслится, что в одном из патчей все кинжалы апнули "на волос", а заморачиваться сайтом, как положено, не стали. Мы, в любом случае, пользуемся входными данными от XML/Json. Итак - приступаем.

Min_damage=(base_min+bonus_min)*(1+%dmg)=(45+30)*1=75

MIN_DAMAGE=Min_damage+bonus_min_color=75+254=329

Пока OK, продолжаем. Опять же, bonus_min > base_delta? 30>88? Нет, конечно, и Max_P вновь просто равен base_delta, то бишь 88. И тогда:

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(45+0+88)*1=133

MAX_DAMAGE=Max_damage+bonus_min_color+bonus_delta_color=133+254+362=749

DPS=(MIN_DAMAGE+MAX_DAMAGE)/2 * APS=(329+749)/2*1.5=808.5

Давайте теперь понаблюдаем что изменится, если пушка будет иметь "цветной" дамаг и плюс к максимальному (а не минимальному, как на предыдущем кинжале) "черному" дамагу:

"Вход" для показанного топора:

  1. Damage_Weapon_Min#Physical=base_min=130.
  2. Damage_Weapon_Delta#Physical=base_delta=112.
  3. Damage_Weapon_Bonus_Delta#Physical=bonus_delta=30.
  4. Damage_Weapon_Min#Fire=bonus_min_color=268.
  5. Damage_Weapon_Delta#Fire=bonus_delta_color=354.
  6. Damage_Weapon_Percent_Bonus#Physical=dmg%=0.
  7. attacksPerSecond=APS=1.3 (опять же, показывается в данных 1.2999999523162842).

Поехали:

Min_damage=(base_min+bonus_min)*(1+%dmg)=(130+0)*1=130

MIN_DAMAGE=Min_damage+bonus_min_color=130+268=398

bonus_min > base_delta? 0>112? Max_P=base_delta=112

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(130+30+112)*1=272

MAX_DAMAGE=Max_damage+bonus_min_color+bonus_delta_color=272+268+354=894

DPS=(MIN_DAMAGE+MAX_DAMAGE)/2 * APS=(398+894)/2*1.3=839.8

Что отличает последние 3 расчета ("цветные" пушки) от расчета самого первого, с авторским "Презрением"? Коренных отличий два.

  1. Аффикс "+XX% к урону" (Damage_Weapon_Percent_Bonus#Physical в данных формата XML/Json) НЕ апает никакой "цветной" дамаг, что однозначно вытекает из приведенных выше формул. Т.е. правильное название аффикса "+XX% к физическому урону". Вот тогда - полный OK будет, но слова "физическому" нет, а значит возможны два объяснения:

    1. Слово уточняющее тип/вид урона поднимаемое данным аффиксом сократили, просто что бы сэкономить место на карточке и предоставить его под более насущные описания. Не исключено, но не выглядит очень достоверно. В защиту данного пункта можно привести аргумент, что "черный" бонус урон (тоже физический) не уточняется этим словом. Считается и так понятным что это именно физический бонус.
    2. Планировалось, что баффаться будет общий урон, но потом "что-то пошло не так". Гораздо более правдоподобное, на взгляд автора, объяснение.

Итого, тут у нас возможный, но не подтвержденный Близзами баг. Или, как минимум, упущение в текстовом описании аффиксов. Тут уж решайте сами. Но это еще что, у нас еще пункт 2 есть!

2. Аффикс "+XX ед. к максимальному урону" (Damage_Weapon_Bonus_Delta#Physical в данных формата XML/Json) однозначно считается не правильно или в чисто "черном" оружии, или в любом "цветном", не важно есть ли на последнем еще и "черный" бонус или нет. А, скорее всего, он просто считается неправильно в любых пушках. Вот этот баг однозначно признан Близзами:

"MinMaxDam Affix is calculating the damage bonus on weapon incorrectly"

Что бы разобраться где тут, собственно, собака порылась, давайте вспомним как вычисляются финальный минимальный и максимальные дамаги любой пушки. Начнем с первого:

Min_damage=(base_min+bonus_min)*(1+%dmg)

Т.е., переводя на "человеческий" - к базовому минимальному добавить бонус к минимальному и сумму апнуть на процент добавочного урона. Логично звучит? Вполне! А для "цветной" пушки предыдущее предложение нужно продолжить фразой "…и добавить минимальный урон цветного бонуса". Снова - логично? Вполне! А максимум дамага? Возьмем сначала одноручный топор, вычисления для которого мы делали последними. Тогда "черная" составляющая его максимального дамага, как легко видеть из формулы выше, считалась так:

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(base_min+bonus_delta+base_delta)*(1+%dmg)=(base_min+base_delta+bonus_delta)*(1+%dmg)

"Переводим": к базовому максимуму (base_min+base_delta) добавить бонусную физическую дельту (bonus_delta) и сумму апнуть на процент добавочного урона. Логично? Уже не очень. Почему к максимальной базе добавляется не максимальный же бонус (bonus_min+bonus_delta), а лишь последнее из слагаемых? Странно это… Но - ладно, пока продолжим. Если пушка цветная, то опять же, "довесок" к последнему "переводу": "…и к полученному результату добавить максимальный цветной бонус, bonus_min_color+bonus_delta_color". Снова все совершенно логично, его и надо добавлять. Это мы "перевели" Max_damage если он пошел по ветке FALSE в своем алгоритме вычисления. А если неравенство bonus_min > base_delta было просчитано в TRUE, как у Презрения автора? А вот тогда:

Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=(base_min+bonus_delta+bonus_min+1)*(1+%dmg)=(base_min+bonus_min+bonus_delta+1)*(1+%dmg).

"Переводим" на человеческий: к базовому минимальному (base_min) добавить максимальный бонус (bonus_min+bonus_delta) и единичку. И сумму апнуть на процент добавочного урона. Логично звучит? Да просто ахинея!! Это ничего, что на вычисление максимального дамага НИКАК не влияет максимальный же базовый урон (base_min+base_delta)? Вместо самоочевидной дельты впихнута в формулу какая-то произвольная единица…

В общем, при вычислении именно "черного" Max_damage что-то однозначно "неладно в Датском королевстве"… Причем вопросы есть как при вычислении по ветке TRUE, так и по ветке противоположной. Как можно было бы исправить ситуацию? Да очень просто, первое же приходящее в голову: прибавлять к максимальной (а не минимальной!) базе максимальный же бонус, т.е., для ветки TRUE:

не base_min+1+bonus_min+bonus_delta,

а base_min+base_delta+bonus_min+bonus_delta.

Что, как не сложно догадаться, апнет все "черные" пушки отнюдь не по детски. Например в Презрении автора вместо 1 будет плюсоваться 106(!!). А там ведь еще на полученную сумму процентное повышение пойдет... Не то что бы автору казалось что текущий ДПС таких пушек недопустимо мал, вовсе нет - нормально у них с ДПСом все. Просто автор, как IT-профессионал, за код без багов. И в данной ситуации вычистка бага сводится к замене искусственной единицы вполне логичным максимальным базовым уроном. Разумеется, точно такой же корректировке следует подвергнуть и алгоритм второй ветки (FALSE), т.е.:

не base_min+base_delta+bonus_delta,

а base_min+base_delta+bonus_min+bonus_delta.

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

Альтернативное исправление ситуации: вычислять ОБЕ ветки по одной из существующих формул. Вариант приведения всего к текущей формуле TRUE-ветки автор решительно отказывается рассматривать. Что бы в вычислении максимального урона не участвовал максимальный базовый урон - это бред и галлюцинации начинающего алкоголика, повторяю еще раз. Остается формула ветки FALSE. "Цветные" пушки, понятно, при таком исправлении ситуации вообще ничего не заметят. А вот на черных:

вместо base_min+1+bonus_min+bonus_delta,

станет base_min+base_delta+bonus_delta.

Пушки этого класса ("черные") качеством хотя бы "выше среднего" обычно имеют такое качество не в последнюю очередь за счет весомого минимального бонуса, и 1+bonus_min обычно существенно выше чем base_delta. Скажем у топора автора этих строк первое значение 283, а второе - 106. В общем это решение проблемы приведет к ощутимому понижению дамага на всех (или почти всех) "черных" пушках, причем чем выше последняя в списке "ТОП-ДПС Мира/Европы/Америки", тем чувствительней окажется такой "де-бафф". Автору альтернатива нравится гораздо меньше первого варианта, и дело даже не в понижении ДПСа его персонального топора, в конце-концов в точно такой же (а иногда и худшей) ситуации окажется большинство варваров (и не только их) - все честно. Просто автор не видит ни в одной из двух существующих формул ту, что была бы совершенно логична на "интуитивном" уровне. Самая логичная формула:

base_min+base_delta+bonus_min+bonus_delta,

т.е. Максимальный урон=максимальная база+максимальный бонус, все!

Впрочем, любое приведение расчета максимального урона пусть к плохой, но единой формуле - благо, по сравнению с тем что творится сейчас. Идея разделить алгоритм просчета макс. дамага на две ветки была бредом того самого юного алкоголика с самого начала. Что бы увидеть все "вывихи" этой идеи обратимся к супер-элементарному примеру:

На этот раз оружие столь примитивно, что нам не нужны никакие XML/Json, все данные для просчета Min_damage/Max_damage могут быть взяты прямо с картинки.

==Левая картинка==

base_min=8

base_delta=17-8=9

==Центральная картинка==

base_min=8

base_delta=17-8=9

bonus_min=8

bonus_delta=8

==Правая картинка==

base_min=8

base_delta=17-8=9

bonus_min=10

bonus_delta=10

Что до минимального урона, то проблем вообще никаких:

Min_damage=(base_min+bonus_min)*(1+%dmg), 8+0=8/8+8=16/8+10=18,

для каждой картинки соответственно. Но с Max_damage - начинается…

==Левая картинка==

bonus_min(0) > base_delta(9)? FALSE, и Max_P=base_delta=9, и Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=8+0+9=17

==Центральная картинка==

bonus_min(8) > base_delta(9)? FALSE, и Max_P=base_delta=9, и Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=8+8+9=25

==Правая картинка==

bonus_min(10) > base_delta(9)? TRUE, и Max_P=bonus_min+1=11, и Max_damage=(base_min+bonus_delta+Max_P)*(1+%dmg)=8+10+11=29

Расчеты-то, конечно, "верны"… Но посмотрите на все 3 картинки снова! Расчеты верны только в том смысле, что дают "правильные" цифры с т.з. игры, во всем остальном это не расчеты, а какое-то произвольное жонглирование цифрами. Почему, что бы случился "щелчок" нужно чтобы именно bonus_min стал именно больше, и именно base_delta?? Что за бред воспаленного сознания? Где логическая связь между двумя? Почему при "щелчке" дополнительным бонусом "выскакивает" именно единица? Ну - то есть как. В принципе понятно, что все эти наполненные странностями телодвижения направлены на то, что бы не допустить возникновения таких пушек, в карточках которых "малые белые" цифры урона будут иметь вид 220-198. Что, конечно же, будет сбивать играющего с толку. Но решать проблему-то надо [было давно] не странными телодвижениями и костылями, а логичными формулами, которые априори исключают появление таких несуразностей. В варианте решения предлагаемом автором данных строк такая "извращенная" пушка появиться просто не сможет чисто алгоритмически. Кстати, если применить его вариант расчетов к последнему примеру, то:

==Левая картинка/Центральная картинка/Правая картинка==

Max_damage=(base_min+base_delta+bonus_min+bonus_delta)*(1+%dmg)=8+9+0/8/10+0/8/10=17/33/37

Ну - не логично ли? Ну вот минимальный урон же обходится единой и понятной формулой - так какого? Побочный вопрос, что в этом случае гораздо резоннее указывать на карточке пушки в аффиксе "+к максимальному урону" не дельту бонуса (как сейчас), а прямо максимальный бонус (16 для центральной и 20 для правой картинок). Но, как говорится, нам бы с алгоритмами разрулить, для начала, юзер-интерфейс уж как-нибудь приложится. К сожалению (или счастью, не знаю уж...) Близзы приняли поистине соломоново решение: оставить код "как есть", т.е. с багом! В частности, в заявлении сказано:

мы не хотим исправлять баг, который ощутимо ослабит огромное количество существующего оружия

По этому странному (мягко говоря) заявлению автор имеет сделать два следующих замечания:

  1. Его личный IT-опыт говорит о том, что ЛЮБОЙ замеченный в коде баг (если он признан таковым, что имеет место быть в разбираемом случае) ОБЯЗАН быть исправлен. Не обязательно в тот же день, как он будет выявлен, но, понятно, настолько оперативно, насколько это возможно. Если нужен тестовый период на апробацию исправленного кода в тестовом окружении - это пожалуйста, но желание/не желание отдельных личностей и групп людей не должно никак влиять на поступательный процесс фиксации обнаруженного бага.
  2. И главное. Самое логичное исправление бага УСИЛИТ огромное количество существующего оружия, а собственно говоря - ни одна пушка не будет ослаблена. Почему сотрудники и разработчики Близз видят (хотят видеть?) только альтернативный путь, действительно наносящий серьезный ущерб "черному" оружию (и при этом не решая проблему нелогичных расчетов окончательно) является полнейшей загадкой.

Понравился материал? Расскажи о нем!

Чтобы получать "пати бонусы", выставлять рейтинги и комментировать, регистрируйтесь на Horadric.RU!

Комментарии

Аватар пользователя Zenusoid

Не читал, но просто + за труды. Клёво)

Аватар пользователя ReyMysterio

Плюс за старания, вчитываться не стал, мозг перегружен :D

Аватар пользователя Bronik

Автор взорвал мозг просто.
Как от простуды оклемаюсь, изучу)
Пока плюс авансом)

Аватар пользователя DimonamoN

Спасибо. Труд великий!

Аватар пользователя blz

отправь на офф

Аватар пользователя Ubivash

Должно быть интересно, прочитаю позже ;)

Аватар пользователя nastr

текст не осилил ибо я лентяйкин и халявщик. но за огромные труды жирный +!

Аватар пользователя Escalador

Автор молодец, однозначно плюс!

Аватар пользователя gambler

до конца не стал дочитывать, так как текст не удобен для понимания сходу и без листочка, да и по первой половине стало понятно, что суть всего блога в баге, который по сути никому жизнь не портит. Ответь только, ну или подумай над одним вопросом, который возможно ты осветил в конце блога: в диабло летом бафали пушки и возможно ли то, что баг этот как раз следствие этого улучшения? Т.е., я имею ввиду возможно ли, что то, что ты принимаешь за баг, это всего лишь хитрый способ бафнуть пушки без переписывания всех параметров итемов?

Аватар пользователя SamMan
gambler написал(а):
ну или подумай над одним вопросом, который возможно ты осветил в конце блога: в диабло летом бафали пушки и возможно ли то, что баг этот как раз следствие этого улучшения?

С удовольствием поразмышляю над такой возможностью, если у меня в руках будет фактологический материал. Т.е. мне нужны статы пушки до "летнего бафа" и ее же после. Тогда появляются цифры, а уж от них - идеи. Пока же это ну очень сферический конь... Что за летний баф? В чем заключался? Как и на чем отразился? Неизвестно...

Аватар пользователя Messier

да долго все читать и понять .Я по другому подошел к этому вопросу о пухах и купил их уже очень много и все классы и скажу свое мнение

копья вообще не кто не берет . в них все плохо

мощное оружие ну скоко его не брал и с хорошими статами ,но топор и булава с ментьшими статами все равно больше дпса дают + я играю обычным ударом рас удар с руной шир размах и
как тока я поставил булкакул ,но меня стали валить ,Из за него много пропускаешь ударов и это сразу заметно ,если сравнить с булавой или стопором

кинжал был у меня 840 бел урона 100 % крита + гнездо 70 % крита и критовал я до 580к криов и думал круто ,но поставил топор с 870 б урона и 87 % крита + гнездо 70 % крита и криты летят
до 450 к ,но результат тот же .Тобешь сам класс оружия лучше

меч также лучше не брать ,даже с супер статами

топор весьма не плох с 1000 б урноа и также надо смотреть ниже урон ,чтобы был 600-1000( 600-850 это лажа полная )

Аватар пользователя Messier

дальше про топор . 80-100 % крита гнездо

топ вещица Это отголосок ,вы посмотрите цены встроенный крит + гнездо и это очень хорошо апает дпс

ну и булава 1100 дпс 650-1100 200 силы гнездо будет весьма не плохой пухой или 1100 дпс 650-1100 сила 200 80 %-100 % крита гнездо .это лучшие пухи

и лучше брать стихии ,а ни мин и макс урон

Аватар пользователя ShinRa

бесполезный труд

Аватар пользователя streelok

+ тебе

Аватар пользователя SamMan

Не скажите! Вот Вы - зашли на страницу, скролили вниз до поля комментария, комментарий вводили...

Аватар пользователя Necros

Игрок никак не может использовать эту инфу на "прок". Следовательно она лишняя для игрока.

Аватар пользователя SamMan

...но не для игрока интересующегося теор-крафтом как таковым. Слово ТЕОРИЯ понимаете?
Целевая аудитория статьи обозначена в первом же абзаце статьи.

Аватар пользователя Drew

Ребята, буду признателен за помощь. Читал читал, но в силу гуманитарного склада ума нчиего толком не понял. Суть вопроса- хочу поменять свою нынешнюю пушку на что-то по-лучше. У моей куча статов и мне сложно прикинуть какую искать. Вот мой профиль http://eu.battle.net/d3/ru/profile/GoForGlory-2458/ Посоветуйте на что обращать внимание при поиске. Также буду благодарен автору статьи за разъяснения ДПС на примере моей пушки =)

Аватар пользователя SamMan

Я мог бы без проблем показать "неправильный" текущий расчет на примере любой пушки, но к вопросу "куда двигаться/на что менять" это не имеет абсолютно никакого отношения. Любая новая пушка (будь она и в 10-ро лучше текущей) будет считаться так же неправильно. При этом простое правило "чем выше/больше белые цифры ДПС тем лучше" соблюдается железно. Больший ДПС лучше, даже если он просчитан с ошибками. Статья лишь высвечивает эти ошибки предлагает путь/пути их исправления.

Аватар пользователя John239

Прочитал примерно половину, остальное просмотрел. В принципе было бы интересно когда игра только появилась, сейчас большая (не вся, именно большая) часть текста очевидна для большинства, я думаю. Интересен только пример в конце с мечем, никогда не понимал, как у них получается что-то вроде 17+10=29 :)
По тексту много воды, где-то в начале статьи точно можно 3 абзаца ужать до пары предложений, тем более что эти 3 абзаца говорят об очевидных вещах. Но за труд +, обработать как следует, убрать лишние пространные рассуждения, повторы, и будет что надо )

Аватар пользователя WoJlF

ой близы...ой намудрили

Аватар пользователя IGR

спасибо, было интересно. правда не все понял. насчет процента который указывается в оружии.
в моей мантикоре есть "36% к урону" это чтото дает что не указывается в дпс или это ничего не значит?
или вся тема к тому что близы напортачили с расчетом дпс?
и бонус к урону от яда тоже как-то нужно искать чтоб больше был в оружии? если он есть в мантикоре по умолчанию*

хотел узнать когда будет тема насчет рубинов?

Аватар пользователя SamMan

>>в моей мантикоре есть "36% к урону" это чтото дает что не указывается в дпс или это ничего не значит?

Дает, в "больших белых цифрах" все учтено.

>>к тому что близы напортачили с расчетом дпс?

Именно. Расчет должен быть более логичным и согласованным. И ДПС должен быть больше. Но не потому что мне/ему/тебе так хочется, а потому что логичный(правильный) расчет=больше ДПС. Текущий(нелогичный, неправильный) расчет=меньше ДПС.

>>хотел узнать когда будет тема насчет рубинов?

Будет непременно. )) Сроки полностью неизвестны - работаю над вопросом, разумеется, в свободное время коего не с избытком...

Аватар пользователя Whatson

Ничего выдающегося в труде нет.
Никаких оптимизационных задач не решалось, поэтому чисто библиографическое описание игры "как что рассчитывается". За это конечно спасибо, не более.

Аватар пользователя SamMan

Оптимизация очень проста: пушка с большим ДПС > пушки с меньшим ДПС. Если золота хватает - берите с большим.
Или вы про какую оптимизацию? Чего оптимизировать будем?

Аватар пользователя D1saster

если я правильно понял , то ДПС на пушках с "цветным" дамагом занижен,а с "черным" завышен за счет ето "мнимой" единицы? И влияет ли на что-нить(относительно мобов) стихийный дамаг?

Аватар пользователя SamMan
D1saster написал(а):
если я правильно понял , то ДПС на пушках с "цветным" дамагом занижен,а с "черным" завышен за счет ето "мнимой" единицы? И влияет ли на что-нить(относительно мобов) стихийный дамаг

Эта "незаслуженная" единица тоже, конечно, апает черные пушки по сравнению с цветными, но это семечки. А вот то, что "+XX% к урону" на пушке относится ТОЛЬКО к черному урону - вот тут кроется огромный разрыв в двух ДПСах двух почти одинаковых (если просто прочесть их характеристики) пушек. Баг ли это, или так и задумывалось - решайте сами. Близзы делают вид что "так и задумывалось", по тексту самого аффикса - не похоже, что бы "задумывалось", скорее "получилось".

D1saster написал(а):
И влияет ли на что-нить(относительно мобов) стихийный дамаг?

Ну как - он вносит свой посильный вклад в "большие белые цифры" на пушке. Не такой вклад какой должен был бы (опять же - это мое мнение, либо Близзам надо тщательнее текст аффиксов продумывать), но все же - вносит.

Аватар пользователя SaN35

Клево)
"Я бы на вашем месте за докторскую десертацию сел" (с)

Аватар пользователя SamMan

)) Сесть мы всегда успеем... ))