↓
 ↑
Регистрация
Имя/email

Пароль

 
Войти при помощи
Временно не работает,
как войти читайте здесь!
Asteroid Онлайн
вчера в 13:55
Aa Aa
#размышления #gamedev
Я сегодня попробовал прикинуть, как посчитать уровень юнита с броней, которая не процентно режет урон, а вычитается из него. И понял, почему игроделы такое не используют.

Обычно просто берётся и строится линейка Уровень = (Урон * Эффективное_Хп)^0,5, а тут не получается, потому что нет эффективного Хп - против разных противников оно разное.
Тут прикол в том, что Эффективное Хп - это суммарное количество урона, которое может выдержать юнит. И оно становится гиперболически больше, когда Броня приближается к Урону врага. Потому что Эффективное_Хп = Хп / (Урон - Броня). А поскольку Урон у разных врагов разный, то у одного и того же юнита получается разное Эффективное_Хп: от одного юнита он может принять 10000 суммарного урона, а от другого пару сотен.
Если у юнита Броня больше Урона противника, то он становится неуязвим, и его относительная мощность уходит в бесконечность.

Итак, проблема в том, чтобы отобразить в формуле вот это разное и к тому же гиперболически растущее Эффективное_Хп. Формула должна правильно отображать синергию между Хп и Броней. А с другой стороны, мы должны учитывать неуязвимость сильнобронированных юнитов.

1.
Вот эта неуязвимость наводит на мысли о классах брони: лёгкая, средняя, тяжелая.
Тогда и в формуле Эффективного_Хп мы можем поставить вместо Урона некий средний урон у типичного противника нашего юнита: Эффективное_Хп = Хп / (Средний_Урон - Броня). Для каждого класса брони мы получаем свой фиксированный Средний_Урон противника. Условно, по танкам бьют другие танки и РПГ.

Это было бы легко, но... оно плохо работает на переходах между разными классами брони.
Представим некое фэнтези, где есть рыцари, чьи статы плавно растут при прокачке. Тогда его уровень будет плавно расти вверх, пока не перейдёт в следующий класс, где он резко скакнёт вниз, потому что Хп, Урон и Броня у него почти такие же, как и вчера, а вот класс брони мы считаем выше, ставим в формуле больше Средний_Урон, и его Эффективное_Хп становится рывком меньше. Отчего и Уровень становится рывком меньше.
Я не люблю разрывные функции. Ещё с универа, когда диплом писал. ))

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

2.
Но вообще, хочется плавно растущую функцию, которая отобразит гиперболическую синергию между Хп и Броней.
Поболтал с чатботом, предлагает использовать экспоненту, либо Хп^(0,1 * Броня), либо Хп * Броня^К. Первый вариант вроде бы ближе по характеру роста к гиперболе. Хм...
То, что мы возводим что-то в степень брони - это вроде как отображает гиперболический рост, но вот вообще Эффективное_Хп от Хп растёт мультипликативно, а умножение на 2 Хп в первой формуле даст слишком дофига. Возможно, стоит заменить на Хп * К^(0,1 * Броня).

У нас числа очень быстро уйдут в стратосферу. Как вариант, логарифмируем всё это: Уровень = логарифм( Урон * Хп * К^(0,1 * Броня)) = логарифм( Урон ) + К * Броня + логарифм( Хп ).

Всё вроде ничего, но заметно, что у нас теперь Урон как-то отстаёт, становится менее значим. Хотя по факту, у него тоже есть синергия с Броней. Пусть и с Броней врага. Ведь если каждое Броня+1 делает наше Эффективное_Хп гиперболически больше, то и каждое Урон+1 у врага делает Эффективное_Хп гиперболически меньше.
А теперь немножко магии: я не буду париться с обдумыванием изначальной формулы, я просто сделаю магический переход - если мы Броню вынесли за логарифм, то и Урон тоже вынесем. Итоговая формула: Уровень = К1 * Урон + К2 * Броня + К3 * логарифм ( Хп ).
Честно говоря, это вообще не то, что я ожидал, когда начинал писать пост. )))

3. Мы можем также использовать вторую формулу от чатбота, не забывая, что Урон симметричен Броне. Тогда Уровень = Хп * (Урон * Броня)^К.
Числа, опять-таки, будут быстро расти. Но в этом случае можно попробовать вместо логарифма кубический корень. Там всё очевидно, расписывать не буду.

4.
Дальше, у нас стоит задача выбрать одну формулу из трёх, а это можно сделать только опираясь на практику:
А) Надо где-то взять, или придумать юнитов с их характеристиками;
Б) Составить таблицу с попарным сравнением их силы: сражаются два юнита, и если после смерти одного юнита у второго осталось 50% Хп, то значит, он в два раза сильнее (главное, сравнивать не сильно отличающиеся друг от друга юниты, потому что иначе относительная мощность уходит в бесконечность);
В) Попытаться подогнать коэффициенты в формулах так, чтобы разница в уровне для всех юнитов чётко коррелировала с разницей в силе.
Г) Выбрать из прошедших испытание формул те, что больше нравятся. Мне нравятся формулы с простым смыслом: аддитивные, мультипликативные или экспоненциальные. Например: экспоненциальная - это если +1 Уровень означает +10% силы.

5.
У нас может не пройти испытание ни одна формула. То есть, они все назначают уровни, которые слабо коррелируют с фактическими данными. Тогда просто берём фактические данные, и назначаем уровни руками, опираясь на экспоненциальное, или любое другое правило, например: "+1 Уровень означает +10% силы". Либо ищем апроксимацию.

Сами понимаете, мне всем этим заниматься влом. )))
Уверен, что и игроделам тоже. Взять обычную процентную броню гораздо проще во всех смыслах. Это ведь был только расчёт уровня, там ещё дофига всего повылазит.

Итог.
В любом случае. Ни аддитивная, ни мультипликативная, ни экспоненциальная формулы не отображают гиперболический смысл "враг на Х уровней выше - неуязвим", нет там этой асимптоты. Я хз что с этим можно вообще сделать.
Есть мысли?
вчера в 13:55
20 комментариев из 35
Marlagram Онлайн
Asteroid
Battletech и мехи против танков, вестимо. Как оно из настолки мутирует в симулятор...
И насколько легко опрокинуть Катапульту 8" фугасом в средний сустав ноги.
:-)))
The Last Spell вообще есть три типа брони: сначала процентное снижение, потом плоское, потом барьер (аналог щитов в космооперах). Был у меня пост на эту тему.

Это, кстати классика ещё со времён варкрафта третьего.
Asteroid Онлайн
onixx
Окей, что есть сила юнита?
Я пока что хотя бы просто "боевую силу" пытаюсь посчитать. Собственно пункт 4 об этом: сталкиваем двух юнитов, процент оставшегося хп у победившего показывает его относительный уровень силы.
Все эти сапорты и хилеры потом идут. Если даже просто боевую силу не получается посчитать, то в слово "уровень" вкладывается совсем другой смысл.
Asteroid Онлайн
EnGhost
Это, кстати классика ещё со времён варкрафта третьего.
Что? Где это в варкрафе было? Там только процентное снижение брони.
Формулу, которая будет рассчитывать Уровень, чётко коррелирующий с силой юнита. Чтобы между каким-нибудь 23 и 21 уровнями была та же разница, что и между 43 и 41 уровнями. И всё в таком духе.
Это что-то отвратительное. Крыса 23 уровня не будет равна воину 23 уровня или там некроманту 23 уровня.
А ещё персонаж встретивший врага 21 уровня будет иметь одни возможности, а встретивший 43 - другие. И ощущения у него всё равно в итоге будут отличаться. Т.е. "той же разницы" на уровне опыта игрока точно не выйдет.
Asteroid
Не только, в редакторе и самопальных картах, были и вещи с плоским срезом армора и маг. щиты. В той же доте первых версий. В тех же footman wars и ещё десятках карт.
Но это не то. Смысл уровня в сравнении всех юнитов. А тут скорее классы.
Но это как раз общий уравнитель для всех юнитов. А классов тут нет совсем. А они в игре наверное всё таки будут, к слову. Между прочим, система твоим требованиям соответствует - формула улетает в небо, сравнение всегда одинаковое (и на 23 и на 43).
Да, кстати, Эффективное_Хп не совсем имеет смысл, потому что если у нас есть атаки разной силы, то для каждой из них у противника будет разное Эффективное_Хп.
И это надо балансить, внезапно! Чтобы враг был уязвим к атакам типа N, но сопротивлялся M. И в зависимости от контекста (которого епт всё ещё нет совсем), надо будет либо выбирать персонажей с типом N, либо добавлять эффект N какой-нибудь боевой механикой, либо просто ковырять вилкой и ненавидеть разработчика!
Ну и всегда есть разные способности. У тебя может быть очень большой дпс на кнопке, который будет долго откатываться, а может быть дпс поменьше, но постоянный. И разные вариации вокруг.
Хм. Во многих играх как раз используется эта "плоская броня" - порой совместно с процентной, порой сама по себе.
Самый знаменитый пример - Starcraft 2, в котором весь баланс строится на этой нелинейности эффективного урона. Самый типичный пример: один из лучших юнитов в игре - морпехи, бьют далеко, стреляют быстро, любой враг умирает от тысячи уколов. Но стоит им столкнуться с врагом, у которого реально большая плоская броня - скажем, с крейсером - то твоя армия морпехов мгновенно становится бесполезной, потому что ты тыкаешь чуть ли не по единичке урона, а здоровья у крейсера много. Поэтому в данном случае нужно строить войска, которые наносят урон "большой порцией", вроде истребителей "Викинг", пусть даже их теоретический урон в секунду и ниже.
Asteroid Онлайн
MonkAlex
Это что-то отвратительное. Крыса 23 уровня не будет равна воину 23 уровня или там некроманту 23 уровня.
Ты смотришь с странной позиции. Я считаю чисто боевую силу от статов. Уровень здесь сокращение от Уровень_силы. Так что, если у крысы статы примерно как у воина, то да - в базе она будет равна. Навыки и прочее тут не учитываются.

И это надо балансить, внезапно!
Это всё очень сильно потом. Тут я просто пытался понять, можно ли построить формулу уровня силы в случае плоской брони. Сейчас я сомневаюсь, что оно будет работать.
Asteroid Онлайн
StragaSevera
Самый знаменитый пример - Starcraft 2
Блин, а я в только первую часть трилогии играл. Понял, что мозги уже не те, и не стал дальше.
Видео смотрел, там очень прикольно развили идеи с способностями юнитов: видел как чел какими-то летающими кораблями разводил противника, он ещё ими в призрачное состояние входил, чтобы урон задоджить. Очень красиво было. Но я как представил, какой же это гемор вот так отыгрывать, и как-то желания столько микрить нету. ))
Asteroid Онлайн
EnGhost
Asteroid
Не только, в редакторе и самопальных картах, были и вещи с плоским срезом армора и маг. щиты. В той же доте первых версий. В тех же footman wars и ещё десятках карт.
Хм. Я там не видел. Футман варс не играл. В доте это просто предмет был, который не совсем то, так как он один такой (ладно, два, так как пурманс шилд был ещё).
Asteroid
Угу, такое микро - красота, но самому так микрить - это жесть. Но на уровне любителя это совсем не обязательно, я чаще всего собираю основную пачку армии из солдат, которым можно просто ткнуть в сторону врага (скажем, за зергов это тараканы плюс гидралиски, за протоссов это зилоты+бессмертные+архонты), плюс парочку юнитов, которыми можно подмикрить (скажем, кинуть АОЕшку на врага, когда он скучкуется).
Разумеется, высоких рангов на этом не достичь, но я играю ради интереса =-)
Asteroid, ну чисто англоязычную игру я не глядел, основной Грим Дон, если не парится насчёт допсложностей без всяких дрочилен и супербилдов проходится, едва ли не чем попало, ну и вполне себе весело. В Гримдоне есть и щит, который тоже плоский урон поглощает (не помню, до или после плоской брони срабатывает, кажется, до) - он с каким-то шансом активируется, если ты, ну, щит в левой руке носишь:) Шанс можно до 100% довести. Помимо прочего, есть сразу % резалки для каждого урона (сопротивления), для физурона - броня (которая чуть иначе обычной процентной резалки работает, здесь не суть важно), потом ещё процентные щиты (срабатывают после сопротивления), всякая милота типа снижения вражеского урона, плоская резалка типа "получаешь -10 от нежити", насколько-то сокращает урон навык защиты, особенно если тот распределённый (в смысле от X до Y урона - итоговый решается исходя из соотношения твоего навыка защиты и его навыка атаки, аналогично когда ты атакуешь; с некоторым рандомом, понятно). В общем, суммарная формула непростая, скажем так. По ощущениям, да, враги на уровень-другой выше всегда ощущаются одинаково, если это не боссы, конечно. Но это ещё и вопрос подбора характеристик мобов и их прогрессии по мере роста уровня, а не только формулы защиты-атаки, по идее, едва ли не для любой формулы защиты-атаки можно прогрессию мобов подобрать так, чтобы разница в два уровня всегда одинаково ощущалась.

...Хотя ладно, ещё и собственный билд играет роль, типа, на одних билдах ты можешь спокойно не замечать мобов на 10 уровней выше и резать боссов как свиней (с супербоссами уже не выйдет, но с боссами - вполне), на других нужно бесконечно кайтить всё, кроме, разве что, самых слабых зомбей. Если ты даёшь игроку свободу билдостроя и разницу между удачными и неудачными билдами - отсюда следует, что и разница по уровням будет иначе ощущаться. Может быть, одинаково для каждого отдельного билда, но между билдами - очень по-разному. Иначе в чём прикол свободы билдостроя, верно?
Показать полностью
Asteroid
Блин, а я в только первую часть трилогии играл. Понял, что мозги уже не те, и не стал дальше.
Второй старкрафт требует в разы меньше микро, чем первый. В смысле, микро ты можешь и во втором выжать дико, но во втором целая ТОННА упрощения микроконтроля, чтобы игрок мог сосредоточиться на макро - стратегии, экономике, армии, тактике, в конце концов. Зачастую удачная стратегия или хорошая экономика передавливает хорошее микро в хламину. Не всегда, но это прям нормальное развитие событий на среднем и средневысоком уровне. В ГМЛ, понятно, без нормального микро не попасть, но и там был чувак с ~100 APM, который вполне себе раскатывал чуваков с APM 200+ за счёт стратегии и тактики.
Матемаг
Главное упрощение современного второго старкрафта старт на большим числе рабочих, что зарубает почти все раш стратегии.
Asteroid Онлайн
Помучил другую нейросеть. В итоге она подтвердила моё подозрение, что создать формулу силы невозможно. Плоская броня делает отношение сильный>слабый нетранзитивным, появляются камень-ножницы-бумага.
Asteroid Онлайн
StragaSevera
Но на уровне любителя это совсем не обязательно
Я перфекционист. Меня душит моя неспособность сделать идеально. Нет, в Старкрафт я не вернусь никогда, это путь к мучениям.

Поэтому я играю только в пошаговые стратегии - там можно сделать красиво. Кстати, если ещё не рекомендовал тебе, то рекомендую The Last Spell. Она небольшая, но лучшая из асимметричных стратегий.
Asteroid Онлайн
> создать формулу силы невозможно

А я уже дофига всякого надумал. Например, сравнение двух юнитов делать не через "насколько тот сильнее", которое приводит к бесконечности в ответе, что не есть гуд. А инвертировать это и считать через оставшееся Хп у победителя. И получаем сравнение, где ответ от 0 до 100%.
С точки зрения программирования можно вообще результат сравнения красиво возвращать из функции одним числом от -100 до 100.

Я теперь даже не знаю, в какую сторону думать.
Вообще, плоская броня создаёт три архетипа, где каждый предыдущий побеждает следующего: ДД > Бронированный > Жирный > ДД.
У ДД большой урон, и потому он пробивает Бронированного. Бронированный не получает урона от Жирного и потому побеждает. Жирный тупо за счёт толщины живёт дольше ДД.

Теперь думаю, можно ли добавить к этому уровень силы (очевидно да), и как его считать.
Asteroid Онлайн
Я щас мозги себе сломаю. )))
ПОИСК
ФАНФИКОВ











Закрыть
Закрыть
Закрыть