Smart Calculators SmartCalculators

Калькулятор урона и эффективности юнитов Wesnoth

Смоделируйте любую атаку в Battle for Wesnoth: точный шанс попадания, урон за удар, полное распределение исходов по ЗД и шанс убийства для обеих сторон, с учётом защиты от местности, времени суток, сопротивлений и особенностей оружия. И сразу — во что обмен обходится в золоте: золото за ЗД, урон за золото и отношение обмена золота на золото. Основная ветка 1.18, эра «Default».

Выберите двух юнитов, местность и время суток. Получите точный шанс попадания, урон за удар и шанс убийства для обеих сторон.

Атакующий
Частые пары
Пехотинец
Воин
Копьеносец
Ратник
Скелет
Солдат

Показано 80 из 193 совпадений — печатайте дальше, чтобы сузить список.

Дальняя атака заставляет обороняющегося отвечать на дистанции — или не отвечать вовсе.

Влияет только на то, насколько вероятен ответный удар. Ваша собственная местность никогда не меняет ваш шанс попадания.

/ 38

Полные ЗД

%

Защита в том виде, в каком её видит игрок: больше — труднее попасть. Для местности или модов вне четырнадцати вариантов выше.

Уменьшает вдвое урон этого юнита начиная с первого удара.

На сам обмен ударами не влияет; проявляется в примечании после боя.

/ 29

Нужны, чтобы понять, поднимет ли этот бой юнита на уровень.

Обороняющийся
Частые пары
Пехотинец
Воин
Копьеносец
Ратник
Скелет
Солдат

Показано 80 из 193 совпадений — печатайте дальше, чтобы сузить список.

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

Именно она определяет ваш шанс попадания.

/ 33

Полные ЗД

Большинство решений об атаке — это добить раненого юнита. Для целого поставьте максимум.

%

Защита в том виде, в каком её видит игрок: больше — труднее попасть. Для местности или модов вне четырнадцати вариантов выше.

Уменьшает вдвое урон этого юнита начиная с первого удара.

На сам обмен ударами не влияет; проявляется в примечании после боя.

/ 26

Нужны, чтобы понять, поднимет ли этот бой юнита на уровень.

Поле боя

Поле ведёт себя на одну ступень светлее, но никогда светлее полного дня.

Действующий бонус порядочных: -25 %

В сетевой игре требуемые ОП снижаются до 70 %. Этот юнит повышается при 29 ОП.

Шанс убийства

36,0 %

Ожидаемый урон 12,5 против 20 ЗД.

Шанс, что атакующий погибнет

Погибнуть невозможно

4 удара × 5 максимум = 20 урона против 38 ЗД.

Скопировать эту точную пару как ссылку.
Пехотинец атакует

Шанс попадания

60 %

Урон за удар

11

Удары

2

Ожидаемый урон

12,5

Ожидаемые ЗД после

29,2 / 38

ОП за убийство

8 ОП за каждый уровень убитого юнита или 4 за юнита нулевого уровня. Юнит, погибший в обмене ударами, не получает ничего.

8

ОП за выживание

1 ОП за каждый уровень выжившего противника, то есть против противника нулевого уровня — ничего.

1

Воин обороняется

Шанс попадания

60 %

Урон за удар

5

Удары

4

Ожидаемый урон

8,8

Ожидаемые ЗД после

7,5 / 33

ОП за убийство

8

ОП за выживание

1

Шанс, что никто не погибнет

64,0 %

Шанс, что атакующий не получит ничего

16,0 %

Отношение обмена золота

1,91

Каждое снятое ЗД стоит столько, сколько стоимость цели за одно ЗД; каждое потерянное — столько, сколько ваша. Выше 1,00 обмен приносит вам золото.

Выгодный
Порядок ударов: A D A D D D
Как считается урон Пехотинец
ШагЗначение
Базовый урон9 (меч, режущий)
Время сутокхаотичный в Первая стража → +25 %
СопротивлениеВоин получает 100 % → ×100
Совокупный множительbonus = 12 500 / 10 000
Округлениепри равенстве округляется к базовому урону → 4 999
Итоговый урон за удар11
Удары2
Шанс попадания60 % (Воин на местности «Равнина», защита 40 %)
Как считается урон Воин
ШагЗначение
Базовый урон5 (меч, режущий)
Время сутокнейтральный → без изменений
СопротивлениеПехотинец получает 100 % → ×100
Совокупный множительbonus = 10 000 / 10 000
Округлениепри равенстве округляется к базовому урону → 4 999
Итоговый урон за удар5
Удары4
Шанс попадания60 % (Пехотинец на местности «Равнина», защита 40 %)

Распределение исходов по ЗД

Среднее — это не исход. Здесь все результаты, на которых обмен ударами может закончиться, и вероятность каждого.

Распределение исходов по ЗД48,0 %Воин ожидаемо: 8 ЗДпогиб481216202428323638Остаток ЗДВероятность

Наведите на столбец, чтобы увидеть точную вероятность.

Распределение исходов по ЗД в виде таблицы.
Остаток ЗДВероятность для атакующегоВероятность для обороняющегося
погиб0,0 %36,0 %
10,0 %0,0 %
20,0 %0,0 %
30,0 %0,0 %
40,0 %0,0 %
50,0 %0,0 %
60,0 %0,0 %
70,0 %0,0 %
80,0 %0,0 %
90,0 %48,0 %
100,0 %0,0 %
110,0 %0,0 %
120,0 %0,0 %
130,0 %0,0 %
140,0 %0,0 %
150,0 %0,0 %
160,0 %0,0 %
170,0 %0,0 %
188,3 %0,0 %
190,0 %0,0 %
200,0 %16,0 %
210,0 %0,0 %
220,0 %0,0 %
2322,1 %0,0 %
240,0 %0,0 %
250,0 %0,0 %
260,0 %0,0 %
270,0 %0,0 %
2822,1 %0,0 %
290,0 %0,0 %
300,0 %0,0 %
310,0 %0,0 %
320,0 %0,0 %
3331,4 %0,0 %
340,0 %0,0 %
350,0 %0,0 %
360,0 %0,0 %
370,0 %0,0 %
3816,0 %0,0 %

МестностьЗащита ПехотинецЗащита ВоинВаш шанс попадания там
0 %0 %100 %
20 %20 %80 %
30 %30 %70 %
30 %30 %70 %
Сейчас
40 %40 %60 %
30 %30 %70 %
50 %60 %40 %
50 %50 %50 %
60 %60 %40 %
60 %60 %40 %
60 %60 %40 %
40 %30 %70 %
20 %30 %70 %
40 %50 %50 %

Тип уронаПехотинецВоин
режущий
Используется
0 % (получает 100 %)0 % (получает 100 %)
колющий0 % (получает 100 %)0 % (получает 100 %)
крушащий0 % (получает 100 %)0 % (получает 100 %)
огонь0 % (получает 100 %)0 % (получает 100 %)
холод0 % (получает 100 %)0 % (получает 100 %)
мистический0 % (получает 100 %)-10 % (получает 110 %)

Wesnoth 1.18.7 · основная ветка · эра «Default»

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

Калькулятор урона Wesnoth. Шанс попадания, шанс убийства и цена обмена в золоте.

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

Что даёт калькулятор урона Wesnoth и чего нет в окне атаки

У каждого юнита в Wesnoth есть цена, и игра никогда не тратит её за вас. Калькулятор урона Wesnoth разбирает одну атаку так, как это делает движок, и оценивает результат в золоте. Пехотинец Северян (Orcish Grunt) стоит 12 золота, эльфийский Воин Мятежников (Elvish Fighter) — 14, Скелет Нежити — 15, Всадник Лоялистов (Horseman) — 24; призыв любого ветерана обходится в 20. Содержание — одно золото за уровень юнита за ход: справочник UnitTypeWML определяет ключ `level` именно как размер содержания. Золото — единица счёта для каждого решения вне боя. В ту секунду, когда вы нажимаете «Атака», игра перестаёт считать в нём.
Этот калькулятор считать не перестаёт. Выберите атакующего и обороняющегося юнита, обе местности и время суток — и получите точный шанс попадания, урон за удар после всей цепочки множителей, полное распределение исходов по ЗД для обеих сторон, шанс убийства, шанс погибнуть, ОП, которые может заработать каждая сторона, и отношение обмена золота: ответ на вопрос, который игра целиком оставляет вам — стоил ли обмен ударами того, что он стоил. Набор данных — основная ветка Wesnoth 1.18.7, эра «Default»: 192 юнита, 349 атак, 7 фракций, вычитанные из файлов данных самой игры на зафиксированном теге, а не набранные руками.
Отношение строится в одну строку. Каждое ЗД, снятое с цели, стоит столько, сколько стоимость цели, делённая на её максимум ЗД; каждое потерянное — столько, сколько ваша, делённая на ваши. Выше 1,00 обмен уничтожает больше золота, чем стоит вам. Скелет, атакующий Пехотинца Северян на равнине на закате, наносит 12,6 ожидаемого урона и получает 6,0 в ответ — и поскольку одно ЗД Пехотинца стоит 0,316 золота, а одно ЗД Скелета 0,441, этот перекошенный на вид обмен урона выходит в 1,50, а не в 2,1, которые обещают чистые числа ЗД. Скелет дешёвый, Пехотинец дешевле. Золото меняет ответ — потому ответ и стоит считать в золоте.
Игровое окно атаки честно закрывает тот бой, в котором вы стоите: шанс попадания, урон и шанс, что каждая сторона погибнет. Оно не умеет оценить бой, в котором вы не стоите — юнита, которого вы не завербовали, поле, до которого этим ходом не дойти, время суток через три хода — и ни в одной строке не выражает это в золоте. Дальше по-русски картина редеет, и редеет предсказуемо.
Официальное русское руководство к 1.18 (`doc/manual/manual.ru.html`) числа даёт, но столбец теневых юнитов в его таблице «Время суток и ущерб» — это правило, которое движок перестал применять ещё до 1.14: в строках Утра, Дня, Первой и Второй стражи и Подземелья стоит −25 %, на Рассвете и Закате — прочерк, а проза добавляет, что «теневые бойцы наносят меньше урана [sic] и ночью, и днём». Тот же файл пишет в тексте, что «каждая деревня, которую вы контролируете, даёт вам две золотых монеты прибыли каждый ход», и ниже считает по формуле «2 + деревни − максимум(0, содержание − деревни)», где деревня приносит одну. Страница `AdvancedTactics/ru` на официальной вики — тридцать разделов подряд, от зон контроля до отступления, и ни одного процента и ни одной формулы. `Introduction_to_Factions/ru` про Мятежников говорит только, что они «хорошо сражаются в лесах, но вне их очень хрупки», а `How_to_play_Rebels/ru`, где как раз стоят проценты по каждому эльфу, отдаёт 404 — русской версии нет. Русская Википедия насчитывает двенадцать особенностей оружия и называет самым дорогим стандартным юнитом наездника грифона за 24 золота, хотя в 1.18.7 Наездник грифона (Gryphon Rider) стоит 23, а 24 — это цена Всадника Лоялистов. А «Игромания» описывает замедление как атаку, которая «снижает на единицу скорость передвижения противника и на столько же уменьшает наносимый им урон», — замедление делит и то, и другое надвое. Каждую из этих дыр страница закрывает числом, которое можно проверить.

Как Wesnoth разрешает одну атаку, шаг за шагом

Боевая система Wesnoth умещается в голове, и округляет она ровно один раз — в сторону базового урона. Именно там ошибаются повторные реализации.
Шанс попадания берётся с поля обороняющегося и больше ниоткуда. Ваша собственная местность никогда не меняет вашу точность — она меняет только то, насколько вероятна контратака. Файл WML хранит сырое значение как шанс быть задетым: UnitsWML говорит, что `terrain=defense` означает, что юнит будет задет в этой местности в defense процентах случаев. То, что показывает игра, и то, что показывает эта страница, — это `100 − значение`. Лесная строка эльфийского Воина в данных читается как `forest=40` и отображается как защита 60 %, то есть ваш шанс попадания там 40 %. Местность, в которую наземный юнит войти не может, разрешается в сырые 100, то есть 0 % защиты, и в таблице ниже это только Глубокая вода: строка означает «здесь нельзя стоять», а не «бесплатное попадание». Отмель и Болото — обычные проходимые поля, в стандартной паре 20 % и 30 %.
Три особенности перебивают местность. «Магия» фиксирует шанс попадания на 70 % в любую сторону: Маг попадает по эльфийскому Воину в лесу с 70 %, где одна местность дала бы 40 %. «Меткий» поднимает шанс атакующего минимум до 60 % и в обороне не работает: Меткий стрелок (Elvish Marksman) попадает по эльфийскому Воину в горах с 60 % вместо 40 %. «Отвод» у обороняющегося отнимает у атакующего 10 пунктов: эльфийский Воин против Сикария (Naga Sicarius) при защите 50 % попадает с 40 %, а тот же эльф против Наг-воителя (Naga Warrior) при защите 40 % — с 60 %. В эре «Default» носитель «отвода» ровно один: Сикарий Народа пустыни 3-го уровня, на изогнутом клинке.
Урон — один множитель, округляемый один раз. Движок собирает `100`, плюс модификатор времени суток, плюс бонус лидерства, умножает всё это на значение сопротивления цели и один раз вызывает `round_damage` с делителем 10000. Он не применяет части по очереди с округлением после каждой, и разница не косметическая: сопротивление, потом ночной бонус, потом лидерство, с округлением на каждом шаге, дают из тех же входов другие целые числа.
Время суток — процент на тип атакующего. Порядочный юнит наносит на бонус порядочных процентов больше, хаотичный — столько же меньше, нейтральный не затронут вовсе. Значения из `schedules.cfg`: Утро, Полдень и День — +25, Первая и Вторая стража — −25, Подземелье — −25, Глубокое подземелье — −30, а Рассвет, Закат и «Внутри» — без бонуса. Полдень не входит в стандартный цикл из шести фаз сетевой игры; он встречается в кампаниях и собственных расписаниях. Черта «Бесстрашный» зажимает модификатор на нуле, то есть снимает штраф и оставляет бонус. Освещённое поле ведёт себя на ступень светлее и никогда светлее полного дня.
Теневой — это бонус в сумерках, а не штраф с двух концов. `generic_combat_modifier` в `attack.cpp` даёт теневому юниту 25 минус модуль бонуса порядочных, а игровая справка `data/core/help.cfg` формулирует результат одной строкой: теневые юниты получают +25 % урона в сумерках. Значит теневой юнит идёт на +25 % на Рассвете, Закате и «Внутри», на 0 % в полный день и в полную ночь и на −5 % только в Глубоком подземелье. В числах: крушащая атака 5-2 у Конника Народа пустыни (Dune Rider) кладёт 6 за удар на Рассвете и Закате и 5 днём, ночью и в Глубоком подземелье. Страница `TimeWML` на официальной вики до сих пор описывает форму до 1.14 — «юниты с alignment=liminal наносят −(abs(lawful_bonus)) % урона», — которая дала бы 5 в сумерках и 4 ночью. Теневых юнитов в наборе десять, включая новобранцев 1-го уровня Конника и Егеря (Dune Rover).
Лидерство — это 25 × (уровень лидера − уровень юнита), и только в плюс. Макрос буквально считает `25 * (level - other.level)`, и применяется только самый высокий подходящий лидер — потому инструмент и спрашивает один уровень лидера, а не список. Юнит 1-го уровня рядом с лидером 3-го получает +50 %; тот же лидер юниту 3-го уровня не даёт ничего.
Сопротивление — это процент урона, который цель получает. Снова UnitsWML: атрибут сопротивления заставляет юнита получать resistance процентов урона, то есть сопротивляться остатку. 60 значит, что цель получает 60 % и сопротивляется 40 %; 120 значит, что получает на 20 % больше. Пехотинец Северян стоит на 100 по всем шести типам и не сопротивляется ничему. Скелет: режущий 60, колющий 40, холод 40, крушащий 120, огонь 120, мистический 120. Ратник Альянса Кналга (Dwarvish Fighter) — 80/80/80/90/90/90. Солдат Дрейков (Drake Fighter) — огонь 50 и холод 150. Как бы высоко ни поднялось сопротивление, движок никогда не опускает состоявшееся попадание ниже 1 урона; единственное исключение — оружие с базовым уроном 0, которое наносит 0.
Удары чередуются, а излишек кладётся в конец. Атакующий начинает, если только у обороняющегося нет «бьёт первым», а у атакующего есть. Дальше стороны чередуются столько раундов, сколько ударов у той из них, у кого их больше: атакующий с двумя ударами против обороняющегося с четырьмя даёт порядок `A D A D D D`, где A — атакующий, а D — обороняющийся. Два лишних удара обороняющегося встают в хвост, а не распределяются между чужими. «Рой» фиксирует число ударов по тем ЗД, с которыми бой начинается, пропорционально максимуму, и посреди боя больше его не меняет.
У ОП за убийство есть исключение для нулевого уровня, а у ОП за выживание — нет. `game_config.hpp` задаёт `kill_xp(level)` как `level ? kill_experience * level : kill_experience / 2`, а `combat_xp(level)` — как `combat_experience * level`, без нулевого случая. Значит убийство юнита нулевого уровня стоит 4 ОП, а просто выживание в бою против него — 0. Русское руководство приводит обе цифры верно: «8 очков опыта за каждый его уровень (4, если противник был нулевого уровня)» за убийство и «1 очко опыта за каждый уровень противника» за выживание — во втором предложении исключения нет. Юнит, погибший в обмене ударами, не получает ничего.
Доход — это деревни против уровней юнитов. Валовой доход — базовый доход плюс одно золото за деревню в кампании и два в обычной сетевой игре (`src/map_settings.cpp` возвращает 2 там и 1 во всём остальном, потому оба варианта и поставляются пресетами). Каждая деревня вдобавок бесплатно оплачивает содержание одного уровня юнита. Содержание — `max(0, платящие уровни юнитов − деревни × уровней на деревню)`, где платящие уровни — это уровни ваших юнитов минус верные: верный юнит не платит ничего при любом уровне, а поскольку панель спрашивает, сколько юнитов верны, а не какие именно, она вычитает их по среднему уровню армии.

Двенадцать мест, где русские источники — и напрашивающийся вывод — расходятся с игрой

  • Читать значение defense из WML как защиту. Файл данных хранит шанс быть задетым, а игра показывает `100 − значение`. `forest=40` у эльфийского Воина — это на экране защита 60 %, а не 40 %. Переверните полярность один раз, и любой вывод о местности после этого встанет с ног на голову.
  • Давать эльфийскому Воину 70 % в лесу. Семьдесят процентов принадлежат типу передвижения `woodland`, который несут эльфийский Стрелок (Elvish Archer) и Ведунья (Elvish Shaman). Воин и Гонец (Elvish Scout) переопределены вниз до 60 %, и официальная страница How to play Rebels держит это врозь аккуратно: 70 % она отдаёт Стрелку и Ведунье по именам, а про Воина и Гонца пишет только «good defense in forest», без числа. Русской версии этой страницы нет — `How_to_play_Rebels/ru` отдаёт 404, а `Introduction_to_Factions/ru` ограничивается тем, что Мятежники «хорошо сражаются в лесах». Путаница держится потому, что все четверо делят фракцию, расу и имя типа передвижения, а у Воина переопределена ровно одна строка — лесная. Мятежники стоят в лесу на 60–70 % в зависимости от юнита, никогда на ровных 70.
  • Считать, что имя «Лучник» указывает на юнита. Оно указывает на двух. В русской локализации игры Bowman у Лоялистов и Orcish Archer у Северян названы одним и тем же словом, и список переводов `RussianListOfUnits` на официальной вики отдаёт «лучник» обоим. Защита их не разводит: в лесу и Bowman, и Orcish Archer стоят на 50 %, а 70 % в лесу принадлежат третьему юниту — эльфийскому Стрелку (Elvish Archer) с типом передвижения `woodland`. Набрав короткое имя в поиске юнитов, вы получите шесть карточек: поиск идёт по подстроке, и к двум точным совпадениям добавляются Лучник с длинным луком, Скелет-лучник, Проклятый лучник и Конный лучник. В разговоре о числах имя нужно снабжать фракцией: «Лучник Лоялистов» или «Лучник Северян». Тот же приём нужен и остальным родовым именам: Воин — это эльф Мятежников, Ратник — гном Альянса Кналга, Пехотинец — орк Северян, Копейщик — гоблин Северян, а Копьеносец — человек Лоялистов.
  • Брать строку теневых из русского руководства. Таблица «Время суток и ущерб» в официальном руководстве к 1.18 ведёт теневых с −25 % и днём, и ночью, а на Рассвете и Закате ставит прочерк; проза добавляет, что теневые бойцы наносят меньше урона и ночью, и днём. Английская версия той же таблицы делает то же самое. Движок считает 25 минус модуль бонуса порядочных, а игровая справка называет +25 % урона в сумерках. Верно, значит, +25 % на Рассвете, Закате и «Внутри», 0 % днём и ночью и −5 % только в Глубоком подземелье. Кто взял строку из руководства, тот в каждой фазе ниже на 25 пунктов модификатора. Любопытно, что вики-страница `Introduction_to_Factions/ru` про Народ пустыни пишет правильно — «теневые (сильнее на восходе и закате)», — но числа не даёт.
  • Считать «каждая деревня даёт 2 золота» твёрдым правилом. Золото за деревню зависит от сценария: обычная сетевая игра платит 2, всё остальное — 1. Потому калькулятор и поставляет оба пресета вместо одного. Официальное русское руководство пишет в тексте «две золотых монеты прибыли каждый ход» и тут же считает по формуле «2 + деревни − максимум(0, содержание − деревни)», где деревня даёт одну; «Игромания» описывает третий вариант той же правды — «два золотых монетки „за так“ и по одной за каждую контролируемую деревню», то есть базовый доход 2 плюс 1 за деревню, ровно пресет кампании. Все три числа существуют, но не в одном сценарии.
  • «На деревню содержится один юнит». Деревня оплачивает содержание одного уровня, а не одного юнита. Юнит 2-го уровня стоит два золота за ход, и деревня покрывает из них одно. Русская Википедия формулирует это точно — «каждая контролируемая деревня при стандартных настройках даёт по две единицы золота в казну, а также один золотой для содержания бойцов», — а короткая версия про «одного юнита» рассыпается ровно тогда, когда в армии появляются ветераны.
  • Делить показанный урон надвое из-за замедления. Замедление заново округляет весь расчёт против делителя 20000, а не делит видимое целое число на два. Базовый урон 9, который показан как 11, замедленным становится 6, а не 5. Таблица расчёта печатает использованный делитель, так что всегда видно, какая ветка сработала. Хуже описания в руководстве только описание в «Игромании»: там замедление «снижает на единицу скорость передвижения противника и на столько же уменьшает наносимый им урон» — ошибка дважды, потому что делятся надвое и скорость, и урон.
  • Применять модификаторы по одному или сложить в бонус лишнее. Движок собирает `(100 + время суток + лидерство) × сопротивление` и округляет один раз. Ошибиться можно двумя способами: округлить после каждого шага или свернуть в этот бонус особенность оружия. «Наскок» и «удар в спину» умножают базовый урон — Всадник Лоялистов в наскоке в Первую стражу наносит 14 при правильном порядке и 13 при неправильном, из того же произведения, потому что слагаемое округления переворачивается, стоит бонусу дойти до делителя.
  • Ждать «меткого» у эльфийского Стрелка. У него его нет. «Меткий» приходит на 2-м уровне, к Меткому стрелку (Elvish Marksman). Стрелок 1-го уровня попадает с тем, что даёт местность, и именно поэтому ему тяжело против юнита в горах, а его продвинутой форме — нет. По-русски имя подсказку не даёт: «Стрелок» и «Меткий стрелок» отличаются одним словом, и это слово и есть особенность.
  • Принимать 0 % защиты за лёгкую цель или считать, что вода и болото читаются как 0 %. Строка с 0 % означает, что юнит на этом поле стоять не может: сырое значение равно 100, а строка оставлена для сравнения. В стандартной паре это только Глубокая вода. Отмель и Болото проходимы и читаются как 20 % и 30 %, а их строки кликабельны, как любые другие. Прочитать их как 0 % — значит превратить две настоящие оборонительные позиции в два выдуманных бесплатных попадания.
  • Считать, что весь список вербовки Нежити не подвержен яду и высасыванию. Не подвержены только юниты расы мертвецов. Темный адепт (Dark Adept) — человек, а Мышь-вампир (Vampire Bat) — нетопырь: оба получают яд и оба нормально кормят высасывание. Калькулятор помечает неподверженность по каждому юниту отдельно.
  • Верить, что самый дорогой стандартный новобранец — наездник грифона. Русская Википедия пишет: «Самые дешёвые стандартные юниты — это зомби (8 золотых), самые дорогие — наездники грифона (24 золотых)». Первая половина совпадает — Ходячий труп (Walking Corpse) Нежити стоит 8. Вторая половина в 1.18.7 не совпадает дважды: Наездник грифона (Gryphon Rider) Альянса Кналга стоит 23, а 24 — это цена Всадника Лоялистов, самого дорогого новобранца во всех семи списках. Ошибка бьёт по кошельку: 24 против 23 — это разница, из-за которой планируют не тот ход вербовки.

Защита от местности в стандартной паре — Пехотинец против эльфийского Воина

МестностьЗащита ПехотинцаЗащита ВоинаШанс попадания Пехотинца
Глубокая вода0 %0 %100 %
Отмель20 %20 %80 %
Береговой риф30 %30 %70 %
Болото30 %30 %70 %
Равнина40 %40 %60 %
Песок30 %30 %70 %
Лес50 %60 %40 %
Холмы50 %50 %50 %
Горы60 %60 %40 %
Деревня60 %60 %40 %
Замок60 %60 %40 %
Пещера40 %30 %70 %
Мерзлота20 %30 %70 %
Грибная роща40 %50 %50 %

Формула урона и как round_damage решает спорный случай

база=b×s,бонус=(100+t+)×rd=max ⁣(1, база×бонус+ρD),ρ=D2[бонусD]G=E[нанесённый урон]×ct/htE[полученный урон]×co/ho\begin{aligned} \text{база} &= \left\lfloor b \times s \right\rfloor, \qquad \text{бонус} = (100 + t + \ell)\times r \\[4pt] d &= \max\!\left(1,\ \left\lfloor \frac{\text{база} \times \text{бонус} + \rho}{D} \right\rfloor\right), \qquad \rho = \left\lfloor \tfrac{D}{2} \right\rfloor - \left[\,\text{бонус} \ge D\,\right] \\[4pt] G &= \frac{\mathbb{E}[\text{нанесённый урон}] \times c_{t}/h_{t}}{\mathbb{E}[\text{полученный урон}] \times c_{o}/h_{o}} \end{aligned}
  • bb = Базовый урон за удар из оружия, плюс 1, если сработала черта: «Сильный» в ближнем бою, «Ловкий» в дальнем. Мертвецы, механизмы и элементали черт не получают вовсе.
  • tt = Модификатор времени суток в процентных пунктах: бонус порядочных для порядочного юнита, он же со знаком минус для хаотичного, 0 для нейтрального и 25 минус модуль бонуса порядочных для теневого — то есть +25 в сумерках и −5 в Глубоком подземелье.
  • \ell = Бонус лидерства: 25, умноженные на разницу уровней с самым сильным соседним союзным лидером, и только когда разница положительна.
  • rr = Значение сопротивления цели — процент урона, который она ПОЛУЧАЕТ. 100 — норма, 60 — сопротивляется, 120 — уязвима.
  • ss = Множитель особенностей оружия: 2 для наскока, который удваивает урон обеих сторон, 2 для удара в спину, иначе 1. Он ложится на БАЗОВЫЙ урон и обрезается там, до того как собран бонус. Свёрнутый в бонус, он даёт то же произведение и другое целое число, потому что слагаемое округления переворачивается, стоит бонусу дойти до делителя.
  • DD = Делитель: обычно 10000, а для замедленного бьющего юнита 20000.
  • ρ\rho = Слагаемое округления. Это половина делителя минус 1, как только бонус доходит до делителя — именно оно и роняет спорный случай к базовому урону, а не от него.
  • GG = Отношение обмена золота. c и h — стоимость в золоте и максимум ЗД: для цели (t) и для своего юнита (o). Выше 1,00 обмен приносит вам золото.
Правило округления стоит прочитать дважды. `src/utils/math.hpp` носит собственный комментарий — округлять до ближайшего целого, но вверх или вниз в сторону `base_damage`, — и кода за этим четыре строки:
round_damage(b, бонус, D)={0b=0max ⁣(1, (bбонус+ρ)/D)b>0\text{round\_damage}(b,\ \text{бонус},\ D) = \begin{cases} 0 & b = 0 \\ \max\!\left(1,\ \left\lfloor (b \cdot \text{бонус} + \rho)/D \right\rfloor\right) & b > 0 \end{cases}
Четыре следствия, и все проверяемые. Базовый урон 9 при множителе 0,75 даёт 7, а при 1,25 — 11. Базовый урон 0 даёт 0: нижняя граница в 1 намеренно стоит после короткого замыкания на нуле, так что оружие с 0 урона не наносит ничего, а любое оружие с уроном 1 и выше нельзя опустить ниже 1 ни сопротивлением, ни ночью, ни замедлением. Базовый урон 1 при множителе 0,10 даёт 1, потому что эта граница держит. А замедление заново округляет против делителя 20000, вместо того чтобы делить надвое уже округлённое число: база 9 при бонусе 12500 и замедлении выходит в 6, тогда как деление незамедленных 11 надвое дало бы 5.
Где именно применяются наскок и удар в спину, важно по той же причине. Оба умножают базовый урон и обрезаются там; бонус несёт только время суток, лидерство и сопротивление. Всадник Лоялистов в наскоке — самый наглядный разбор: его копье 9-2 кладёт 18 за удар на Рассвете и 14 в Первую стражу, а меч эльфийского Воина отвечает 8-4 вместо своих обычных 5-4. И арифметика этого ответа требует двух шагов, а не одного: наскок сначала удваивает базу с 5 до 10, и только потом её режет режущее сопротивление Всадника в 80 % — `roundDamage(10, 100 × 80, 10000) = 8`. Кто скажет «8, потому что наскок удваивает», оставит читателя считать 10 и находить страницу неправой. А если свернуть это ×2 в бонус вместо базы, Первая стража даст 13: то же произведение, другое целое число, потому что слагаемое округления переворачивается, стоит бонусу дойти до делителя.
Распределение исходов по ЗД — это точная свёртка, а не симуляция. Движок в `attack_prediction.cpp` сам выбирает между боем в один удар, боем без смертей и общим путём, и его комментарий к общему пути говорит, что используются точные вероятностные вычисления; на Монте-Карло он откатывается только выше порога сложности, до которого более узкая область этого калькулятора не доходит. Каждая вероятность на странице воспроизводима до последней цифры — а это важно для аудитории, чья главная претензия к игре — кубики.

Разобранные примеры на собственных числах калькулятора

Стандартная пара — Пехотинец на раненого эльфийского Воина в Первую стражу

Пехотинец Северян с 38 из 38 ЗД на равнине атакует эльфийского Воина Мятежников с 20 из 33 ЗД на равнине, в Первую стражу. Пехотинец хаотичный, а Первая стража несёт бонус порядочных −25, так что его меч прибавляет 25 %: база 9 становится 11 за удар, дважды. Защита эльфа на равнине 40 %, поэтому шанс попадания 60 %, а ожидаемый урон 12,5 против 20 ЗД. В ответ меч эльфа 5-4 кладёт по 5 с шансом 60 % — Пехотинец тоже стоит на 40 % защиты, — и в сумме это 8,8 ожидаемого урона: свои четыре удара эльф раздаёт не все. Первый приходит всегда, а остальные три только в тех 64 % случаев, где он переживает оба удара Пехотинца.
Исход: шанс убийства 36,0 %, шанс, что атакующий погибнет, 0,0 %, шанс, что не погибнет никто, 64,0 %, шанс, что атакующий не получит ничего, 16,0 %. Ноль здесь не артефакт округления: четыре удара по 5 — это 20 урона против 38 ЗД, так что этот бой Пехотинца убить не может, как бы ни легли кубики. Порядок ударов `A D A D D D`: у эльфа четыре удара против двух у орка, и два лишних приходят в хвосте. По ОП — 8 за убийство и 1 за выживание, против порога повышения 29 по правилам сетевой игры. А отношение обмена золота равно 1,91: Пехотинец покупает ЗД эльфа за 14 золота своими ЗД за 12 золота, и покупает почти два к одному.

Переставить обороняющегося на одно поле в лес

Те же два юнита, то же время суток, обороняющийся в лесу вместо равнины. Лесная защита эльфийского Воина 60 %, поэтому шанс попадания Пехотинца падает с 60 % до 40 %, а шанс убийства — с 36,0 % до 16,0 %.
Одно поле местности больше чем вдвое срезает шанс убийства. Это весь аргумент про местность в одну строку, и это то число, за которым стоит потянуться, когда в следующий раз кто-нибудь скажет, что разница между равниной и лесом несущественна. Заметьте, что не изменилось: урон за удар остался 11, потому что местность урона не касается вовсе. Сдвинулась только точность.

Время суток в той же паре — когда бой перестаёт быть возможным

Пехотинец хаотичный, так что день ему вредит, а ночь его оплачивает. Всё остальное держим на стандартной паре:
Время сутокБонус порядочныхУрон ПехотинцаШанс убийства
Рассвет09 × 20,0 %
Утро+257 × 20,0 %
Закат09 × 20,0 %
Первая стража−2511 × 236,0 %
Глубокое подземелье−3012 × 236,0 %
Полдень и День делят +25 с Утром, Вторая стража делит −25 с Первой, Подземелье стоит на −25. Читайте форму, а не строки: между Утром и Первой стражей удар Пехотинца идёт с 7 на 11, и это превращает бой, который он арифметически не может выиграть — 18 максимального урона против 20 ЗД на Рассвете и 14 Утром — в убийство с шансом лучше одного к трём. Подождать одну фазу часто дороже любого позиционирования, которое вы могли бы сделать вместо этого.

Почему рейтинг золота 1-го уровня выигрывает Скелет — и почему это про цель

Отсортируйте все 50 юнитов 1-го уровня по отношению обмена золота против Пехотинца Северян на равнине на закате, и первым встанет Скелет Нежити с 1,50. Арифметика от начала до конца: топор Скелета — 7-3 режущий, Пехотинец получает 100 % режущего и стоит на 40 % защиты, значит 7 × 3 × 0,60 = 12,6 ожидаемого нанесённого урона. В ответ режущий 9-2 Пехотинца встречает 60 % режущего сопротивления — 9 × 0,60 = 5,4, из чего `round_damage` делает 5, — и 5 × 2 × 0,60 = 6,0 полученного. Теперь цена: одно ЗД Пехотинца стоит 12/38 = 0,316 золота, одно ЗД Скелета — 15/34 = 0,441, так что Скелет уничтожает 12,6 × 0,316 = 3,98 золота и теряет 6,0 × 0,441 = 2,65. Это и есть 1,50.
Вершина таблицы: Скелет 1,50, Мечник Народа пустыни (Dune Soldier) 1,20, Тяжёлый пехотинец Лоялистов (Heavy Infantryman) 1,19, Страж Дрейков (Drake Clasher) 1,05, Пехотинец Северян 1,00, Ратник Альянса Кналга 0,96, Копьеносец Лоялистов (Spearman) 0,95, Древень Мятежников (Wose) 0,89, Заводила Северян (Goblin Rouser) 0,88, Троллёнок Северян (Troll Whelp) 0,87, Закалыватель Северян (Goblin Impaler) 0,84, эльфийский Воин 0,83.
А теперь найдите Всадника, потому что он и есть весь аргумент за то, чтобы вообще читать отношение. Он наносит 21,6 ожидаемого урона — больше любого другого юнита 1-го уровня в наборе, против 12,6 у Скелета — и стоит на 18-м месте из 50, при 0,64. Тянут его вниз две вещи: за 24 золота он самый дорогой новобранец в списке Лоялистов, так что каждое своё ЗД терять дорого, и его собственный наскок удваивает не только то, что он раздаёт, но и то, что возвращается, — Пехотинец бьёт его на 16,8. Юнит может вести свой уровень по нанесённому урону и всё равно терять на обмене золото, и поэтому «как больно он бьёт» — неверный первый вопрос.
И вот что важнее самого рейтинга: Скелет стоит первым из-за цели. У Пехотинца единственная атака — 9-2 режущий, а Скелет получает от режущего лишь 60 %. Смените цель на что-нибудь, что размахивает крушащим или бросает огонь, и Скелет упадёт, потому что и того, и другого он получает 120 %. Прочитать эту строку как «Скелет — лучший юнит 1-го уровня» значит вычеркнуть ту половину предложения, которая несёт смысл. Юниты только с дальней атакой — Лучник Северян (Orcish Archer), Скелет-лучник (Skeleton Archer), Браконьер (Poacher), Авгур (Saurian Augur), Ассасин Северян (Orcish Assassin) — сортируются здесь в самый конец и вообще без отношения: у Пехотинца нет дальней атаки, чтобы ответить, а у обмена без контратаки отношения нет, а не бесконечность.

Эффективные ЗД — почему 38 ЗД Ратника стоят 48

Четыре юнита, с которыми открывается режим «Эффективность юнитов», замерены против Пехотинца Северян на равнине на закате за десять ходов:
ЮнитОтношение обмена золотаЭффективные ЗДЭффективные ЗД за золотоИстинная цена, 10 ходов
Пехотинец Северян1,00383,1722
Воин Мятежников0,83332,3624
Копьеносец Лоялистов0,95362,5724
Ратник Альянса Кналга0,96483,0026
У Ратника 38 напечатанных ЗД, столько же, сколько у Пехотинца, и 48 эффективных против этого атакующего: гномы получают 80 % режущего, так что каждое ЗД впитывает на четверть больше режущего урона, чем выглядит. Это самый полезный столбец режима, потому что он единственный, которого карточка юнита в игре не даёт. Обратите внимание и на то, что отношение и эффективные ЗД расходятся в вопросе, кто лучший: Пехотинец берёт эффективные ЗД за золото с 3,17, а Ратник забирает столбец выносливости начисто — и Пехотинец выходит на ровные 1,00 только потому, что его замеряют против самого себя. Убить ту же цель Пехотинцу нужно 5 ударов и 4 атаки, Ратнику и Копьеносцу — по 6 ударов и 4 атаки, эльфийскому Воину — 8 ударов и те же 4 атаки.

Замедление — модификатор, который делает не то, что написано в его описании

Официальное русское руководство говорит: «Замедленный боец будет наносить в два раза меньший ущерб и перемещаться в два раза медленнее». Поделите пополам число с экрана — и попадёте не на то целое. Движок заново прогоняет всё округление с делителем 20000 вместо 10000, а это не та же операция, что деление результата на два.
Возьмите Пехотинца в Первую стражу ещё раз: незамедленным он наносит 11. Поделите пополам — получите 5,5, что округляется к 5. Прогоните так, как это делает движок — база 9, бонус 12500, делитель 20000, — и ответ будет 6. Один пункт, на ударе, который приходит дважды, против обороняющегося с 20 ЗД: это разница между боем, который может убить, и боем, который не может. Таблица расчёта печатает использованный делитель, так что всегда видно, какая из двух ветвей в игре.

Теневой юнит в числах — правило, которое русское руководство печатает наоборот

Конник Народа пустыни (Dune Rider) — теневой новобранец 1-го уровня с крушащей атакой 5-2. Против того же эльфийского Воина фазы раскладываются так:
ФазаБонус порядочныхМодификатор теневогоУрон за удар
Рассвет0+256 × 2
Закат0+256 × 2
Утро+2505 × 2
Первая стража−2505 × 2
Глубокое подземелье−30−55 × 2
Лучшие фазы теневого юнита — ровно те две, где таблица официального руководства ставит прочерк, а его проза объявляет, что теневые бойцы наносят меньше урона и ночью, и днём. Устаревшее правило `−abs(бонус порядочных)` дало бы 5 на Рассвете и Закате и 4 ночью, то есть занизило бы сумеречный урон Народа пустыни на целых 25 пунктов модификатора. Затронуты десять юнитов, включая обоих теневых новобранцев 1-го уровня — Конника и Егеря (Dune Rover). Практический вывод короткий: если в списке вербовки есть теневые, планируйте атаку на Рассвет или Закат, а не на полдень.

Доход и содержание — во что армия обходится до того, как вы кого-то ударили

Содержание — это `max(0, платящие уровни юнитов − деревни × уровней на деревню)`, а чистый доход — это базовый доход плюс деревни × золото за деревню минус содержание. Страница открывается на обычной кампанийной форме: 6 деревень, базовый доход 2, 1 золото за деревню, 1 уровень на деревню бесплатно, шесть юнитов 1-го уровня и два 2-го, один из них верный, 50 золота на руках, копите на 20 — цену призыва.
Валовой доход — 2 + 6 = 8 золота за ход, и шесть деревень бесплатно несут шесть уровней юнитов. Сырая сумма уровней армии — 6 × 1 + 2 × 2 = 10, но панель показывает 9 платящих уровней, и недостающий — это верный юнит, вычтенный по среднему уровню армии: ввод спрашивает, сколько юнитов верны, а не какие именно, поэтому 1 × 1,25 округляется до 1. Девять платящих уровней против шести бесплатных дают содержание 3 и чистый доход 5, при 0 оставшихся бесплатных уровней и 14 уровнях юнитов, которые вы удержали бы при нулевом чистом доходе. Пятьдесят золота на руках уже покрывают те 20, на которые вы копите, так что строка про ходы читается 0. Посчитайте содержание как сырые уровни минус бесплатные — получите здесь 4; пропущенный шаг — вычет за верного юнита.
Верный юнит не платит содержания при любом уровне, и юнит нулевого уровня — Ходячий труп, Копейщик Северян — тоже не платит, потому что содержание и есть уровень. Это и есть настоящий аргумент за заслон из Ходячих трупов: восемь золота вперёд и ничего за ход после. Переключите пресет на сетевую игру, и сдвинется одно число: обычная сетевая партия платит 2 золота за деревню вместо 1, что удваивает деревенскую половину дохода и делает те же шесть деревень стоящими 12 за ход поверх базовых 2.

Семь фракций эры «Default» по цене новобранца

Всё здесь выведено из набора данных, и ничего не набрано руками. Столбец типов важен, потому что именно он решает, какое время суток помогает вашему списку вербовки:
ФракцияНовобранцыСамый дешёвыйСамый дорогойТипы
Лоялисты8Копьеносец, 14 золотаВсадник, 24 золотапорядочный
Мятежники7Воин, 14 золотаДревень, 20 золотанейтральный, порядочный
Северяне7Копейщик, 9 золотаАссасин, 17 золотахаотичный, нейтральный
Нежить7Ходячий труп, 8 золотаПризрак, 19 золотахаотичный
Альянс Кналга8Вор, 13 золотаНаездник грифона, 23 золотанейтральный, хаотичный
Дрейки6Застрельщица, 15 золотаОгненный, 21 золотапорядочный, хаотичный
Народ пустыни7Лекарь, 13 золотаКонник, 18 золотатеневой, порядочный, нейтральный
Четыре профиля сопротивлений из этой таблицы стоит запомнить, потому что короткая формулировка каждого из них звучит правдоподобно и при этом неверна. Орки не сопротивляются вообще ничему и стоят на 100 % по всем шести типам. Дрейки держат 50 % огня по всему списку вербовки: Страж не меняет огнестойкость на броню, а сохраняет 50 и добавляет крушащий 70; ящеры в том же списке переворачивают профиль на 120 % огня. А в Альянсе Кналга гномы прочны без исключений, их разбойники — нет: Вор получает 130 % режущего. У Мятежников же эльфы получают на 10 % больше мистического урона (сырые 110), и это цена за лес.

Русские слова игры и их английские оригиналы

ЗД и ОП

Здоровье и опыт. Русская сборка игры сокращает их именно так — не HP и не XP. Кто читает англоязычную ветку форума и видит там HP и XP, читает те же два значения; вся эта страница держится русских сокращений, потому что их показывает сам инструмент.

Лучник — Bowman и Orcish Archer сразу

Единственное точное совпадение среди 192 имён юнитов: русская локализация зовёт «Лучником» и Bowman у Лоялистов, и Orcish Archer у Северян, и список переводов на официальной вики делает то же. Имя юнита не определяет, а поиск идёт по подстроке — это слово поднимает в подборе шесть карточек. В лесу и Bowman, и Orcish Archer стоят на 50 %, и по этому числу их не различить; в разговоре о числах имя обязано идти с фракцией.

Воин, Ратник, Пехотинец, Копейщик, Копьеносец

Elvish Fighter, Dwarvish Fighter, Orcish Grunt, Goblin Spearman и Spearman. Пять самых родовых имён набора, и две пары из них разводятся одним словом. Воин — эльф Мятежников, Ратник — гном Альянса Кналга, Пехотинец — орк Северян, Копейщик — гоблин Северян нулевого уровня, Копьеносец — человек Лоялистов с особенностью «бьёт первым». Список переводов на вики, кстати, зовёт Dwarvish Fighter «ополченцем», а сборка игры — «Ратником»: в подборе юнитов ищите второе.

Стрелок и Меткий стрелок

Elvish Archer и Elvish Marksman. Первый — 1-й уровень и без особенности «меткий», второй — 2-й уровень и с ней. Оба стоят в лесу на 70 % как тип передвижения `woodland`; эльфийский Воин и Гонец (Elvish Scout) переопределены до 60 %.

Отношение обмена золота (gold trade ratio)

Нанесённый урон, умноженный на цену одного ЗД цели, делённый на полученный урон, умноженный на цену одного ЗД своего юнита. Выше 1,00 обмен приносит золото. Значение, которого игра не показывает нигде, — потому оно здесь и главное.

Тип: порядочный, нейтральный, хаотичный, теневой

Lawful, neutral, chaotic и liminal. Текущая русская сборка использует эти четыре слова. Порядочный сильнее днём, хаотичный ночью, нейтральный безразличен, а теневой получает +25 % в сумерках, 0 % днём и ночью и −25 % никогда — вопреки таблице в официальном русском руководстве.

Защита от местности (terrain defense)

Показанное значение — это 100 минус сырое значение из файла WML, потому что файл хранит шанс быть задетым. Больше — труднее попасть. Ваш шанс попадания равен 100 минус защита обороняющегося, и ваша собственная местность в это не входит.

Наскок (charge)

Удваивает базовый урон этого обмена ударами для обеих сторон, а не только для атакующего. Поэтому это риск, а не бесплатное улучшение, и поэтому Всадник стоит на 18-м месте из 50, хотя наносит больше всех на своём уровне.

Отвод (deflect)

Отнимает у атакующего 10 пунктов шанса попадания и работает только в обороне. В эре «Default» носитель ровно один: Сикарий (Naga Sicarius) Народа пустыни 3-го уровня, на изогнутом клинке. Русская Википедия насчитывает двенадцать особенностей оружия; калькулятор моделирует тринадцать, и это тринадцатая.

Истинная цена (true cost)

Цена вербовки плюс одно золото за уровень юнита за каждый ход содержания, за столько ходов, сколько юнит проживёт. Пехотинец за десять ходов стоит 22 вместо 12, Ратник — 26 вместо 16.

Эффективные ЗД (effective HP)

ЗД юнита, пересчитанные через его сопротивление к типу урона конкретного атакующего. 38 ЗД Ратника стоят 48 против режущего, потому что гномы получают от него 80 %.

Пехотинец (Orcish Grunt)

Атакующий по умолчанию на этой странице: 12 золота, 38 ЗД, меч 9-2 режущий, хаотичный, сопротивление 100 % по всем шести типам — то есть не сопротивляется ничему. Самым дешёвым новобранцем Северян он при этом не является: это Копейщик за 9 золота.


Что делать с результатом

  • Читайте отношение, а не урон. Обмен, который в ЗД выглядит плохо, в золоте может быть хорош, и наоборот тоже — дешёвые ЗД по ту сторону обмена тянут вниз любое отношение. Обмен урона Скелета 12,6 против 6,0 с Пехотинцем выглядит лучше чем два к одному, а считается в 1,50, потому что одно ЗД Пехотинца стоит 0,316 золота против 0,441 у Скелета. Всадник — тот же урок с другого конца: 21,6 нанесённого урона, больше всех на уровне, и отношение 0,64.
  • Выше 1,00 вы делаете золото, ниже — тратите золото на продвижение. Верным может быть и то, и другое. Потратить золото, чтобы удержать деревню, прикрыть юнита в двух ОП от повышения или добить раненого юнита 2-го уровня, который иначе вылечится, — это решение, которое отношение готовит, но не принимает. Оно не даёт другого: потратить золото случайно.
  • Проверяйте время суток раньше, чем позиционирование. Хаотичный атакующий бьёт на 7 Утром и на 11 в Первую стражу — тем же оружием и по той же цели, — а против обороняющегося с 20 ЗД это разница между 0,0 % и 36,0 % шанса убийства. Подождать фазу бесплатно; зайти на плохое поле нет.
  • Один шаг местности сдвигает шансы дальше, чем кажется. Переставить того же эльфийского Воина с равнины в лес — значит срезать шанс убийства Пехотинца с 36,0 % до 16,0 %, не изменив ни одного пункта урона. Когда выбираете между добиванием этим ходом и местом получше, прогоните оба поля через таблицу защиты от местности.
  • Берите эффективные ЗД, когда решаете, кого ставить вперёд. 38 ЗД Ратника против режущего стоят 48, потому что гномы получают 80 %. Этот столбец говорит, какой юнит переживёт этого атакующего, — а это другой вопрос, чем «у кого на карточке число больше».
  • Сортируйте по урону за золото, когда отстаёте по золоту, и по эффективным ЗД за золото, когда отстаёте по полю. Это два разных порядка для двух разных задач. Среди двенадцати юнитов в голове рейтинга 1-го уровня Закалыватель Северян ведёт урон за золото с 1,11, а по отношению обмена сидит одиннадцатым с 0,84; Древень Мятежников стоит 20 золота, несёт 52 ЗД и обменивается при 0,89.
  • Задайте цель рейтинга прежде, чем рейтингу поверить. Каждое число в этом режиме замерено против одного конкретного обороняющегося на одном конкретном поле. Смените цель — сменится порядок, и это режим за работой, а не его дефект. Закат стоит там по умолчанию намеренно: бонус порядочных на нём равен 0, так что порядочные и хаотичные не получают ни бонуса, ни штрафа и рейтинг не превращается в скрытый рейтинг хаотичных.
  • Помните, что содержание делает с планом. Содержание — это уровень юнита, каждый ход, постоянно, и деревни покрывают по одному уровню каждая. Второй юнит 2-го уровня на шести деревнях стоит два золота за ход из восьми золота дохода — за десять ходов это больше, чем цена вербовки Копьеносца. Столбец истинной цены считает ровно это.
  • Вставляйте ссылку, а не утверждение. Постоянная ссылка несёт каждое поле, которое вы изменили, а сохранённое состояние читателя для этой вкладки пропускается, стоит ссылке назвать хотя бы одно её поле, — так что пара откроется вашей, а не его настройками по умолчанию. Ответ, который ссылается на спорный обмен ударами, спор заканчивает; ответ, который называет число, начинает его заново.

Как пользоваться тремя режимами

Три вкладки, и каждая держит свои входы при переключении.
Атака — разрешить один обмен ударами
1. Выберите Атакующий юнит и его Атака. Поиск принимает имя, расу или фракцию, не различает регистр и диакритику, а рядом лежит короткий список Частые пары. Дальняя атака заставляет обороняющегося отвечать на дистанции — или не отвечать вовсе.
2. Выберите Обороняющийся юнит. Поле Контратака само берёт лучший ответ обороняющегося на вашей дистанции, пока вы его не измените, а «Без контратаки» — допустимое значение, а не ошибка.
3. Задайте обе местности. Местность обороняющегося определяет ваш шанс попадания; Местность атакующего влияет только на контратаку. Каждый вариант подписан защитой этого юнита там, а переключатель Переопределить защиту в % закрывает местности и моды вне четырнадцати перечисленных.
4. Задайте ЗД обороняющегося. Страница намеренно открывается на раненом обороняющемся с 20 из 33: целая пара 1-го уровня рисует 0,0 % на обеих карточках и ничему не учит. Кнопка Полные ЗД возвращает максимум.
5. Задайте Время суток. Каждая фаза подписана своим бонусом порядочных, а плашка сообщает действующий бонус, когда учтено Освещённое поле.
6. Откройте Дополнительно ради того, что решает близкие бои: черты «Сильный», «Ловкий», «Выносливый» и «Бесстрашный», Уровень соседнего лидера, Уже замедлен, Уже отравлен, Удар в спину активен, Текущие ОП и переключатель ОП до повышения между кампанией (100 %) и сетевой игрой (70 %).
Результат даёт по карточке каждой стороне: шанс убийства, шанс, что атакующий погибнет, шанс, что никто не погибнет, шанс, что атакующий не получит ничего, ожидаемый урон, ожидаемые ЗД после, ОП за убийство, ОП за выживание и отношение обмена золота с вердиктом в одно слово рядом — «Выгодный», «Равный» или «Невыгодный». Ниже лежат диаграмма Распределение исходов по ЗД, таблица Как считается урон с базовым уроном, временем суток, лидерством, сопротивлением, особенностями оружия, совокупным множителем, округлением и итоговым целым числом, таблица сопротивлений для пары и таблица защиты от местности, в которой обороняющегося можно переставить нажатием на строку. Скопировать эту точную пару как ссылку укладывает всё состояние в адрес.
Эффективность юнитов — отсортировать новобранцев
Выберите до шести Юниты для сравнения, отфильтруйте по Фракция и Уровень, задайте Замер против и Местность цели, и сортируйте по отношению обмена золота, урону за золото, золоту за ЗД, эффективным ЗД за золото, ожидаемому нанесённому урону, цене или ЗД. Поле Ходов, которые юнит проживёт питает столбец Истинная цена — цена вербовки плюс одно золото за уровень за ход содержания. Любая строка открывается прямо на вкладке «Атака» вместе со своими местностями и временем суток, так что рейтинг и разбор боя не расходятся.
Доход и содержание — хватит ли на следующего
Введите Деревень удержано, Базовый доход за ход, Золота за деревню (кампания 1 или сетевая игра 2), Уровней юнитов на деревню бесплатно, свои количества юнитов по уровням, сколько из них Верные юниты, своё Текущее золото и Сумма, на которую копите — по умолчанию 20, цена призыва. На выходе валовой доход, содержание, чистый доход, уровни, покрытые деревнями бесплатно, сколько уровней ещё можно выставить бесплатно, число уровней при нулевом чистом доходе и ходы до цели.
Ссылка и есть смысл. Постоянная ссылка строится против неизменного контракта входов калькулятора, поэтому несёт каждое поле, которое вы изменили, и опускает только те, что остались на значении по умолчанию. Приоритет действует по вкладкам: если ссылка называет хотя бы одно поле вкладки, сохранённое состояние читателя для этой вкладки пропускается целиком, а остальные его вкладки остаются его. Пара, которую вы вставили в ответ на форуме, откроется той парой, о которой вы спорили.

Чего этот калькулятор намеренно не моделирует

Быть точным в одном обмене ударами — значит отказываться подмешивать то, что относится к другому вопросу. Каждое исключение ниже — решение, а не пробел.
Один атакующий против одного обороняющегося. Распределение — это точная свёртка по ЗД обоих юнитов, и точной она остаётся потому, что область ограничена: нет второго атакующего в том же ходу, нет повышения посреди боя, нет лечения между раундами. Ход, в котором по одной цели бьют три юнита, — это три отдельных обмена, и считать их последовательно руками правильно: второй просто стартует не от числа, а от распределения.
Окаменение и чума сообщаются, а не симулируются. Оружие, которое обращает цель в камень или поднимает Ходячий труп при убийстве, получает примечание. Ни то, ни другое не меняет арифметику ЗД самого обмена, поэтому ни то, ни другое не входит в распределение.
Яд — эффект после боя. Он стоит 8 ЗД на следующем ходу и никогда не опускает юнита ниже 1 ЗД, так что внутри обмена не действует. Страница сообщает вероятность того, что обороняющийся окажется отравлен, — то число, которое идёт в план на следующий ход.
Берсерк ограничен 30 раундами, собственным пределом движка, а для любой другой пары предел раундов равен 1.
Основная ветка 1.18.7, эра «Default». 192 юнита, 349 атак, 7 фракций, прочитанные из файлов данных игры на зафиксированном коммите. Эры-дополнения, самодельные кампании и изменённые деревья юнитов меняют константы, на которых стоит эта страница: формула продолжает работать, числа нет. Ровно для этого случая есть Свой юнит — уровень, тип, стоимость, ЗД, урон, удары, тип урона, дистанция, особенности оружия, все шесть сопротивлений, защита и отметка «не подвержен яду, высасыванию и чуме» настраиваются, и свой юнит едет в постоянной ссылке, как любой другой.
Рейтинг эффективности — это обмен ударами, а не бой. Каждая строка берёт оружие с наибольшим ожидаемым уроном против выбранной цели и оценивает контратаку на той же дистанции, причём на обороняющейся стороне: наскок самого оцениваемого юнита удваивает и то, что возвращается к нему, — и именно это ставит Всадника на 18-е место. Зоны контроля, отступление, лечение, стоимость передвижения по местности и второй ход в рейтинг не входят. Он отвечает на вопрос «во что мне обходится этот новобранец за пункт урона против вон того», — тот вопрос, на который меню вербовки ответить не может.
Лидерство принимает один уровень, потому что считается один лидер. Движок применяет самое сильное подходящее лидерство и отбрасывает остальные, так что список соседних лидеров был бы списком, в котором важна одна запись.

Калькулятор урона Wesnoth — частые вопросы

Как считается урон в «Битве за Веснот»?

Урон за удар — это базовый урон, умноженный на один множитель и округлённый один раз. Движок собирает (100 + модификатор времени суток + бонус лидерства), умножает это на значение сопротивления цели и передаёт в round_damage с делителем 10000 — или 20000, если бьющий юнит замедлен. Модификаторы никогда не применяются по одному с округлением между шагами. Особенности оружия сидят по другую сторону суммы: наскок и удар в спину удваивают базовый урон до того, как множитель собран, а не сам множитель.

От чего зависит шанс попадания в Wesnoth?

Только от местности обороняющегося. Шанс попадания — это 100 минус показанная защита обороняющегося, и ваше собственное поле её никогда не меняет. Местность перебивают три особенности: «магия» фиксирует шанс на 70 %, «меткий» поднимает атакующего минимум до 60 %, «отвод» у обороняющегося отнимает 10 пунктов.

У эльфийского Воина 70 % защиты в лесу?

Нет — 60 %. Семьдесят процентов принадлежат типу передвижения woodland, который несут эльфийский Стрелок (Elvish Archer) и Ведунья (Elvish Shaman); Воин и Гонец (Elvish Scout) переопределены вниз до 60 %. Мятежники стоят в лесу на 60–70 % в зависимости от юнита, никогда на ровных 70.

Сколько ОП даётся за выживание в бою?

По одному ОП за каждый уровень выжившего противника — то есть против юнита нулевого уровня ничего. С убийством иначе: 8 ОП за уровень и 4 за убийство юнита нулевого уровня. Юнит, погибший в обмене ударами, не получает ничего.

Правда ли, что теневые юниты слабее и днём, и ночью?

Нет, и это самая частая русская ошибка про Народ пустыни. Таблица «Время суток и ущерб» в официальном русском руководстве к 1.18 ведёт теневых с −25 % и днём, и ночью, а на Рассвете и Закате ставит прочерк; английская версия той же таблицы делает то же. Движок считает 25 минус модуль бонуса порядочных, а игровая справка называет +25 % урона в сумерках. Значит теневой юнит идёт на +25 % на Рассвете, Закате и «Внутри», на 0 % в полный день и в полную ночь и на −5 % только в Глубоком подземелье. В числах: крушащая атака 5-2 у Конника Народа пустыни кладёт 6 за удар в сумерках и 5 во всё остальное время. Вики-страница Introduction to factions на русском, кстати, пишет верно — «теневые (сильнее на восходе и закате)», — только без числа.

Почему имя «Лучник» относится к двум разным юнитам?

Потому что русская локализация игры даёт его и Bowman у Лоялистов, и Orcish Archer у Северян — это единственное точное совпадение среди 192 имён юнитов набора, и список переводов RussianListOfUnits на официальной вики отдаёт «лучник» обоим. В подборе юнитов это слово поднимает шесть карточек: поиск идёт по подстроке, и ещё четыре имени юнитов его содержат. Два точных совпадения в лесу неразличимы — и Bowman, и Orcish Archer читаются как 50 %, так что защита их не разводит; разводят фракция, тип и характеристики. А семьдесят процентов в лесу — это уже третий юнит, эльфийский Стрелок (Elvish Archer) с типом передвижения woodland, и «Лучником» игра его не зовёт. Называйте фракцию вместе с именем, иначе разговор о числах разъезжается. Родовые имена вроде «Воин», «Ратник», «Пехотинец» и «Копейщик» такой же оговорки требуют, хотя они и не совпадают.

Что такое отношение обмена золота?

Оно оценивает обмен ударами в золоте, а не в здоровье. Каждое снятое ЗД стоит столько, сколько стоимость цели, делённая на её максимум ЗД; каждое потерянное — столько, сколько ваша, делённая на ваши. Разделите первое на второе, и выше 1,00 бой уничтожает больше золота, чем стоит вам. Игра не показывает это значение нигде — потому здесь оно и главное.

Замедление просто делит урон надвое?

Не совсем. Замедление заново округляет весь расчёт против делителя 20000, а не делит видимое целое число на два. Удар, который показывает 11, замедленным становится 6, а не 5 — и на атаке в два удара этот один пункт решает, может ли бой убить вообще. Русское руководство описывает эффект как «в два раза меньший ущерб», и в этом описании и прячется ошибка на единицу.

Наскок удваивает и урон контратаки?

Да. Наскок удваивает то, что раздают обе стороны в этом обмене, и именно это делает его риском, а не бесплатным улучшением. Копье Всадника Лоялистов 9-2 кладёт 18 за удар на Рассвете и 14 в Первую стражу, а эльфийский Воин, на которого он наскакивает, отвечает 8-4 вместо своих обычных 5-4. Восьмёрка получается в два шага: наскок сначала удваивает базу с 5 до 10, и уже потом её режет режущее сопротивление Всадника в 80 %. Это же и есть причина, по которой Всадник стоит на 18-м месте из 50 по отношению обмена золота, хотя наносит на своём уровне больше всех.

Какой юнит 1-го уровня самый выгодный по золоту?

Это целиком зависит от того, против кого он воюет, и в этом весь смысл режима. Против Пехотинца Северян на равнине на закате ведёт Скелет Нежити с отношением 1,50, впереди Мечника Народа пустыни с 1,20 и Тяжёлого пехотинца Лоялистов с 1,19 — но Скелет выигрывает там только потому, что единственная атака Пехотинца режущая, а Скелет получает от режущего 60 %. Наведите его на что-нибудь с крушащей или огненной атакой, и Скелет откатится назад, потому что и того, и другого он получает 120 %. Всадник Лоялистов — предупреждение с другого конца: 21,6 нанесённого урона, больше всего на 1-м уровне, 16,8 обратно, стоит правильно оценить его собственный наскок, и 18-е место из 50 при 0,64. Сначала задайте цель, потом читайте рейтинг.

Отношение вышло 0,85. Всё равно атаковать?

Иногда да, и отношение — это то, чем вы решаете это осознанно. Ниже 1,00 вы тратите золото, чтобы купить что-то другое: деревню, поле, которое нужно вам следующим ходом, снятие вражеского юнита в двух ОП от повышения или добивание раненого юнита 2-го уровня, пока он не вылечился до полных. Всё это может стоить больше золота. Отношение ниже 1,00 исключает другое — потратить золото случайно, потому что процент шанса убийства выглядел обнадёживающе.

Что делать с шансом убийства 36 %?

Считать его тем, что он есть: чаще цель после этой атаки останется стоять, чем упадёт. Сначала посмотрите, во что вам обходится контратака — в стандартной паре это 8,8 ожидаемого урона против 38 ЗД, — и кто ещё может ударить по той же цели в этом ходу. Потом проверьте время суток и таблицу защиты от местности: одна фаза ожидания поднимает тот же удар с 7 до 11, а одно поле в сторону роняет шанс убийства с 36,0 % до 16,0 %. И прочитайте рядом отношение обмена золота, чтобы обнадёживающий процент не продал вам обмен, который стоит вам золота.

Сколько золота приносит деревня за ход?

Зависит от сценария: обычная сетевая партия платит 2 золота за деревню, всё остальное — 1. Потому калькулятор и поставляет оба пресета. Каждая деревня вдобавок бесплатно оплачивает содержание одного уровня юнита — уровня, а не юнита, так что юнит 2-го уровня даже при своей деревне стоит ещё одно золото за ход.

Почему у некоторых местностей защита 0 %?

Потому что юнит там стоять не может. Местность, в которую наземный тип передвижения войти не может, несёт сырое значение WML 100, а оно отображается как 0 % защиты — в стандартной паре это Глубокая вода и больше ничего. Отмель и Болото проходимы и читаются там как 20 % и 30 %. Строка с 0 % означает, что поле недоступно, а не что цель беззащитна.

Как работает содержание и сколько юнитов я могу держать?

Содержание — это одно золото за уровень юнита за ход, и каждая удержанная деревня бесплатно оплачивает один уровень. Значит содержание — это платящие уровни ваших юнитов (сумма уровней минус верные) минус деревни, умноженные на уровней на деревню, но не ниже нуля; а чистый доход — базовый доход плюс золото с деревень минус это содержание. Юнит нулевого уровня не стоит ничего, потому что содержание и есть уровень, и верный юнит не стоит ничего при любом уровне. На стандартных значениях панели — 6 деревень, шесть юнитов 1-го уровня и два 2-го, один верный — выходит 9 платящих уровней против 6 бесплатных, содержание 3 и чистый доход 5.

Калькулятор бесплатный?

Да, и ничего не закрыто. Таблица расчёта урона, распределение исходов по ЗД, таблица сопротивлений, таблица защиты от местности и полный рейтинг 1-го уровня из 50 строк открыты с первой отрисовки — без аккаунта и без ограничений.

Насколько он точен по сравнению с игрой?

Он воспроизводит основную ветку 1.18.7 для тех случаев, которые покрывает. Правило округления, порядок множителя, переопределения шанса попадания, чередование ударов, начисление ОП и правила дохода и содержания — это переносы кода самого движка на зафиксированном коммите, а характеристики юнитов, сопротивления и строки местности вычитаны из файлов данных игры, а не переписаны руками. Распределение исходов по ЗД — точная свёртка, а не симуляция, так что одни и те же входы всегда дают одни и те же цифры. Вне области: несколько атакующих по одной цели в одном ходу, повышение посреди боя и любая эра вне основной ветки «Default».

Поддерживает ли он эры-дополнения, самодельные кампании и изменённых юнитов?

Не в виде пресетов. Набор данных — только эра «Default» основной ветки 1.18.7, 192 юнита и 349 атак. Для всего остального берите «Свой юнит»: он принимает уровень, тип, стоимость, ЗД, урон, удары, тип урона, дистанцию, особенности оружия, все шесть сопротивлений и значение защиты в процентах. Формула в обоих случаях движковая; меняется только таблица характеристик.

Можно ли сослаться на конкретную пару в ответе на форуме?

Да, для этого адрес и нужен. «Скопировать эту точную пару как ссылку» пишет в URL каждое поле, отличающееся от значения по умолчанию, включая полностью свой юнит. Приоритет действует по вкладкам: если ссылка называет хотя бы одно поле вкладки, сохранённое состояние читателя для этой вкладки пропускается, так что пара откроется у него вашей, а не его настройками.

Источники и ссылки

  1. Wesnoth 1.18.7, `src/actions/attack.cpp` — цепочка множителя урона, применяемая за один раз, чередование ударов и приоритет удара первым, которые воспроизводит этот калькулятор.
  2. Wesnoth 1.18.7, `src/utils/math.hpp` — `round_damage`, где при равенстве округление идёт к базовому урону, а нижняя граница не даёт попаданию упасть ниже 1.
  3. Wesnoth 1.18.7, `data/core/macros/weapon_specials.cfg` — значения удара в спину и наскока (×2), высасывания (50 %), яда (8 ЗД), берсерка (30 раундов), магии (70 %) и меткости (не менее 60 %).
  4. Wesnoth 1.18.7, `data/core/units.cfg` — типы передвижения, чьи строки сопротивлений и защиты от местности наследует каждый юнит.
  5. Вики Wesnoth, UnitsWML — источник, где сказано, что значение `[defense]` — это шанс быть задетым, а значение `[resistance]` — процент получаемого урона; именно поэтому на этой странице для обоих показано `100 − значение`.

Содержание проверено командой Smart Calculators