Как я разрабатывал боевую систему для хардкор RPG и чуть не сошёл с ума от одной формулы
Привет. Меня зовут Виталий, я инди-разработчик и делаю хардкор фэнтези RPG на кроссплатформ. Сегодня расскажу как я провёл несколько дней в мозговом штурме пытаясь найти идеальную формулу поглощения урона. Спойлер: формула оказалась той ещё засранкой.
С чего всё началось
Я делаю игру в духе хардкор RPG — с настоящей глубокой боевой системой, нестандартной для смартфонов, пошаговыми боями, множеством героев, детальным крафтом снаряжения и боссами которых нужно продумывать а не просто закликивать. Движок Unity, сервер собственный, язык C#.
Когда дошло до боевого ядра — я понял что мне нужно сесть и выстроить всю механику на бумаге прежде чем писать код. Иначе потом переписывать всё с нуля.
Первые пять минут всё было хорошо
Я сопоставил все базовые вещи. 12 раундов на бой. 6 героев на поле плюс 4 в резерве. Передний и задний ряд. Враги сверху, герои снизу — вертикальный экран. Пошаговый бой, полный автомат, герои сами выбирают цели.
Потом начался цирк.
В игре 5 классов: Воин, Страж, Рейнджер, Маг, Жрец. У каждого свои базовые статы. 12 характеристик. Система звёздности, рангов, уровней, снаряжения. Гравировки. Бафы. Дебафы. Провокация. Воскрешение. итд.
Казалось бы, а чем плоха формула из Доты 2?
Поглощение = (0.052 × Броня) / (0.9 + 0.048 × Броня)
Красиво. Проверено годами. Работает в одной из самых сбалансированных игр в мире.
Но нет. У меня не работает.
Почему?
Потому что в Доте броня это маленькие числа — 5, 10, 20 единиц. У меня герои качаются до 80 уровня, имеют 6 рангов рамки, 20 звёзд, и топовое снаряжение даёт до 480% к защите. Цифры улетают в десятки тысяч. Формула Доты при таких числах либо даёт 0.1% поглощения либо 99.9% — никакой середины.
Ладно, сказал я. Придумаем свою.
Следующие несколько часов я подбирал константу
Я ушел от базовой казуальной формулы которая работает по типу АТК = (АТК / (АТК + ЗАЩ) - это вообще "забейте" она будет хорошо смотреться в кликерах но не в хардкор рпг. Затем я сменил тактику, работать от защиты а не атаки(так делают многие топ ММО) и перевести бонус к защите от снаряжение не + процент от базы, а пойти в плоскую величину(это тоже фишка топ ММО но есть свои косяки)
Новая формула выглядела просто:
Поглощение = Защита / (Защита + Константа)
Константа — это число которое определяет при какой защите поглощается ровно 50% урона. Всё логично.
Одна проблема — какое число?
Я перебрал: 300, 500, 1000, 3000, 6000, 7000, 12000, 20000.
При маленькой константе — новичок в серой рамке поглощает 80% урона и игра превращается в детский сад.
При большой константе — прокачанный танк в мифическом снаряжении поглощает 3% и жрец который бафает его броню на 50% выглядит как шарлатан потому что разница между 3% и 4.5% это издевательство а не механика.
В какой-то момент Жрец со своими +50% к броне как будто даёт танку святую воду вместо защиты. :D
Тогда я попробовал гибрид
Плоские цифры плюс проценты. Казалось элегантно — плоское даёт базовую защиту всем, процент усиливает тех у кого высокая база.
Считаем этап 3 — синий шмот, 40 уровень:
Воин: 37% поглощения. Норма!
Но потом смотрю на другие вариации и вижу что Воин, Страж, Маг и Рейнджер на каждом этапе поглощают примерно одинаково. Разница между самым толстым танком и хрупким магом — 5%. Это не хардкор RPG, это мусор.
Плоская часть шмота одинакова для всех классов и просто давит разницу между ними.
Семь лет в ArcheAge спасли проект
Я играл в ArcheAge семь лет почти до закрытия игры в мире(в РФ она все еще функционирует но вроде как отрезана от Кореи). И пока я кружил по одним и тем же граблям — на след. утро я пошёл на работу, погуглил скриншоты шмота из ArcheAge и вспомнил как там всё устроено.
Вернулся и думаю, давай возьмём их подход, ведь не зря это бестселлер 2014.
В ArcheAge шмот всегда давал два стата сразу — физическую защиту и магическое сопротивление. Тип брони определял пропорцию: тяжёлый давал много брони и мало сопры, лёгкий наоборот. И всё это были плоские числа — никаких процентов.
И главное — константу нужно подбирать не с потолка а под конкретную точку баланса. Голый прокачанный Воин на максимальном уровне и ранге без шмота должен поглощать ровно 50% урона. Это точка отсчёта. Под неё считаем базовую защиту Воина, и константа определяется сама.
Воин максимальная прокачка = 5000 единиц защиты
Константа = 5000
Поглощение = 5000 / (5000 + 5000) = 50% - норма
Элегантно. Просто. Работает.
голый | Мид. гейм | Лейт гейм
Воин 10% 32% 77%
Страж 11% 36% 81%
Маг 8% 24% 64%
Рейнджер 9% 26% 68%
Разница между Стражем и Магом на лейте — 19%. Страж реально толще. Маг реально хрупкий. Жрец который бафает танка наконец перестал быть шарлатаном.
Что ещё зафиксировал
Пока искал формулу — попутно выстроил всю систему:
Типы навыков — Вступление, Активная, Пассивная, Фатальная, Реакция. Все с шансом срабатывания.
Система прогрессии — уровень до 80, 6 рангов рамки, 20 звёзд четырёх типов (медь, серебро, золото, алмаз), тир героя от обычного до босса ( этого можно укротить и получить себе)
Механика рядов — автоатака всегда бьёт первый ряд, навыки с шансом 30/70. Провокация перехватывает все атаки на носителя с абсолютным приоритетом.
Крафт снаряжения — три типа брони с разными пропорциями защиты и сопротивления, шесть тиров редкости, гравировки, сет-бонусы за полный комплект.
Штрафы за неподходящую броню — Маг в тяжёлом шмоте теряет 5% маг атаки и HP за каждый предмет. Надеть можно всё что угодно, но цена есть. Это песочница.
Боевое ядро ещё не дописано — осталась механика блока, парирования, уклонения, воскрешения и визуальные эффекты. Потом верстка боевого экрана.
Если интересно — напишу продолжение когда дойду до кода.
А пока главный урок: если делаешь глубокую игру а не казуалку — не берите первую попавшуюся формулу из популярной игры. Контекст имеет значение. Дота это не мобильный хардкор RPG, и формула которая работает там будет выдавать мусор у вас.
Иногда решение приходит от задротства в ArcheAge. :D
Разрабатываю в одиночку. Вертикальный срез в процессе. Если есть вопросы по механикам — спрашивайте в комментариях.











