Как я разрабатывал боевую систему для Project Hardcore RPG и чуть не сошёл с ума от одной формулы

Привет. Меня зовут Виталий, я III инди - разработчик и потихоньку делаю хардкор фэнтези 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

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

3
Начать дискуссию