Dev Math
660 subscribers
138 photos
3 videos
5 files
76 links
Как на самом деле создаются игры. Как сделать игру интересной и реализовать технически. А главное причём тут математика?

Разборы на пальцах, рабочий код, интерактивы. dev-math.ru

Сотрудничество: @it_bizdev
Download Telegram
Coyote Time

Чтож. Начнем писать заметки по самой заголосованной теме. И начнём с моего любимого термина.

Математика математикой, а в творчестве всегда есть место магии. И время койота — это одна из моих любимых «магических техник». Наверное даже больше из-за названия, и так как мне в Looney Tunes всегда нравился этот персонаж. И как иллюстрация, что не всё делается формулами, иногда для правильной эмоции у игрока надо добавить немного «магии».

Coyote Time — это окно в несколько кадров после того, как персонаж сошел с платформы в течении которого он всё ещё может прыгнуть.

Все дело в том, что игрок прыгает не когда видит край платформы, а когда «собирается с неё спрыгнуть». Между намерением и срабатыванием прыжка есть окно состоящее из: реакции человека, отправки сигнала клавиатуры, время пока отрисуется кадр и тому подобное. Когда игрок жмет прыжок, но при этом падает вниз — это ощущается как проблема с управлением. Тут и спасает время койота.

Причём это константа зависит как от устройства ввода (клавиатура, тач, геймпад), так и от свойств геймплея вроде скорости персонажа. Поэтому подбирается оно для игры в ручную.

#devmath #математика #геймдизайн #платформеры #gamefeel
🔥7❤1💯1
Что лучше: сила или выбор?
https://youtube.com/shorts/WZj18eg6kLw?si=B7nygNEzPc2Y_cqq

Благодаря необратимой смерти и отсутствия прямой прокачки персонажа рогалики как жанр обладают часто тремя прикольными свойствами для игроков. Точнее во многом проще выстраиваются из-за специфики жанра.

Атрибуция результата — прогресс в рогаликах организован таким образом, что он сильно смягчает ощущение гринда. У вас нет уровня, нет статов которые вы постоянно прокачиваете. Вы открываете больше перков, но в основном любая победа ощущается как заработанная собственным скиллом, а не тем что вы нагриндили прокачку. Если это выстроить правильно. Такая победа кажется более ценной.

Градиент Цели — во многих роуглайк играх вам видно что открыто и что осталось открыть. Чем больше вы открываете, тем больше накопленный прогресс, что влияет не удержание игрока. Но помимо этого интересный эффект это градиент цели. Чем ближе конец игры, тем активнее начинает играть игрок. Но для этого надо показывать сколько надо всего открыть.

Конкретность цели — вы замечали что в Balatro на новой колоде написано, что надо сделать чтобы её открыть. Это тоже важный крючок мотивации, причем не только в этом жанре. Но фишка рогаликов, что они держат цель предельно чёткой, а путь до неё непредсказуемым. Он позволяет достигать игроку конкретного и понятного результата каждый раз новым путём.

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

А как сделать интересным путь, интересным выборы и вариативность тактик разберёмся дальше в будущих постах.

#devmath #roguelike
🔥4
А нужна ли математика?

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

Математика заранее помогает отслеживать:

1. Редкие события. Ломает игру не медианный ран, а один процент сборок. Чтобы встретить событие с вероятностью 1/500 руками, нужны месяцы; симулятору нужны минуты.
2. Позволяет смоделировать некоторые процессы и логику геймплея без аудитории.
3. Поиск аномалий. В роуглайках, скажем, какая пара предметов и синергии дают на порядок выше остальных. И это не всегда плохо, игроку может "везти", и это тоже часто используется, но для того чтобы знать, что аномалии есть и где они, — проще смоделировать, нежели бегать 10к забегов самому.
4. Можно ломать бесплатно. Меняя коэффициенты в модели, она не пожалуется, что "вы сломали игру". А выпуская патч с изменением баланса на живую аудиторию вслепую — вы узнаете о себе часто много нового.

Кстати говоря, в сингл-плеере это не так критично. Сломанный баланс не ухудшает опыт игрока, так как какая-то оверпавернутая комба не обидит компьютер, против которого мы играем. А когда компьютер почему-то слишком силен, может восприниматься просто хардкорной сложностью игры. Но в пвп дела обстоят иначе. Любой сильный дисбаланс вызывает много негатива и ломает игру. Поэтому в пвп чаще пользуются инструментами математического баланса.

Но математическое моделирование не серебряная пуля. Симулятор моделирует не игру, а ваше представление о ней. Слабое звено — модель игрока: он либо жадный по локальной эвристике, либо случайный, и оба не похожи на человека. Баланс, настроенный под бота, ломается о людей, которые ищут не то, что ищет бот. Win rate 25% может быть выстраданной победой, а может — скукой. Ну и, конечно, математические модели не находят того, чего нет в правилах. Эксплойты живут на стыке механики и реализации: неожиданный порядок выполнения, баг, взаимодействие, которое никто не закладывал.

У игр нет формальных доказанных теорем, как сделать что-то интересным. А при этом главный критерий оценки качества игры — в неё интересно играть. Математика предоставляет инструменты, чтобы построить это ощущение и не сломать его ненароком + улучшать там, где надо. А ощущение от игры вы подстраиваете всегда под свой геймплей самостоятельно. И если интуиция вырабатывается насмотренностью — надо просто играть в хорошие игры, то математика — это инструмент, изучив который, многое вы начинаете делать быстрее и проще.

P.S. Математика всё равно есть в любой вашей игре, потому что это не что-то, что надо "вносить". Сама по себе она всего лишь описывает и моделирует различные процессы. Поэтому крутую игру можно сделать и без неё, но с ней проще. Это по своей сути язык, на котором окружающий мир говорит с теми, кто этот язык понимает.

#devmath #gamefeel #math
🔥6😁2
Как создать ощущение, что противники в шутерах действуют слаженно?

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

Барк (bark) — это короткая реплика NPC, которая срабатывает по событию, а не по сценарию. Заметил игрока, ранен, перезаряжается, идёт в укрытие, остался один — на каждое такое событие висит пул строк, и система выбирает одну. В отличие от диалога, барк ничего не спрашивает у игрока и ответа не ждёт: он просто вслух помечает, что ИИ только что решил. Отсюда и название.

Барки используются не только в шутерах, но именно в них им нашли красивое применение. Один из ярких примеров — NPC в F.E.A.R. Это описано в докладе Оркина.

У каждого солдата F.E.A.R. конечный автомат всего с тремя состояниями: Goto (дойти до точки), Animate (проиграть анимацию), UseSmartObject (воспользоваться объектом уровня: перевернуть стол, перелезть через окно). Больше ничего. Вся «умность» вынесена из автомата наружу.

У солдата есть цели с приоритетами: убить врага, дойти до укрытия, выжить, патрулировать. И есть набор действий, у каждого — предусловия и эффекты: «стрелять» требует, чтобы оружие было заряжено и враг был виден, «перезарядить» требует наличия патронов. Планировщик (GOAP, отголосок STRIPS) берёт самую приоритетную цель и обратным поиском собирает цепочку действий, которая к ней ведёт. Цепочка скармливается тому самому автомату из трёх состояний. Мир изменился, предусловие сломалось — и план пересобирается заново. Так солдат сам находит, что перед перезарядкой стоит зайти за стену, а если путь перекрыт — перевернуть стол и спрятаться за ним.

Поверх одиночек стоит координатор. Он собирает NPC, стоящих рядом, в отряд и выбирает для него одно из четырёх поведений: Get-to-Cover, Advance-Cover, Orderly-Advance, Search. Поведение раздаёт каждому бойцу цель, скажем, «займи вот это укрытие ближе к игроку», а дальше каждый планирует свой маршрут сам. Клещи получаются из Advance-Cover сами собой: укрытия стоят по разные стороны коридора, маршруты расходятся.

Когда координатор назначил поведение и раздал роли, он же выдаёт реплики под уже принятое решение. Advance-Cover запустился, боец А пошёл в обход стены, и в этот момент звучит «обхожу». Решение принято, движения ещё не видно, слово уже прозвучало. Игрок слышит план, потом видит движение, которое ему соответствует, и достраивает тактику сам.

Так работает атрибуция намерения: услышанная фраза становится гипотезой о плане врага, а любое совпавшее действие — подтверждением. Отрядный ИИ в F.E.A.R. довольно простой, всего с четырьмя поведениями, ИИ каждого юнита относительно сложный (GOAP как-никак), но именно барки создают ощущение сложной скоординированной тактики у группы NPC.

#devmath #gamedesign #gamefeel #shooter #bark
🔥6✍3
Как Hades прячет ускорение в ровной шкале

Мы немного отвлеклись от рогаликов. Вернемся к разным интересным механикам в них. Сегодня взглянем на God Mode в Hades.

Это режим для тех, кто хочет дойти до конца истории. Правило одно. Игрок получает 20% сопротивления урону, и после каждой смерти прибавляется ещё 2%. Потолок 80%.

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

Пусть у вас 100 здоровья, а враг бьёт на 25. Без режима вы держите 4 удара.
С 20% сопротивления удар режется до 20. Это 5 ударов.
После 15 смертей сопротивление 50%, удар режется до 12.5. Это 8 ударов.
После 30 смертей потолок 80%, удар режется до 5. Это 20 ударов.

Первые пятнадцать смертей купили вам три лишних удара. Следующие пятнадцать купили двенадцать. Шкала в настройках ползёт ровно, по 2% за смерть, а запас прочности под ней разгоняется. И это неочевидно для игрока. У всех всё в целом сложно с процентами.

Почему так. Сопротивление r оставляет от удара (1 − r), значит число ударов, которые вы держите, растёт как 1/(1 − r). Это гипербола: на малых процентах она почти прямая, а к концу шкалы взлетает. Про эту формулу мы уже говорили в ролике про броню и убывающую отдачу.

Судя по интервью Касавина, так и задумано. Стартовые 20% должны ощущаться сразу, «immediately palpable», а шаги по 2% «aren't as noticeable»: они дают время выучить того, кто тебя убил. Ослаблять врагов не хотели, идея звучала как «What if we just make you a little bit tougher?».

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

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

#devmath #gamedesign #gamefeel #hades #godmode
🔥6✍2
Зачем нужна броня, если есть здоровье

Закроем тему брони в играх. Мы разобрали как она работает и на каких формулах. Но зачем она нужна?

Возьмите любую игру с бронёй и посчитайте эффективное здоровье: сколько урона персонаж выдержит до смерти. Получится одно число. И тут резонный вопрос: если всё сводится к одному числу, зачем два стата? Дайте игроку здоровье и не морочьте голову.

Ответ: броня отличается от здоровья не тем, сколько EHP даёт, а тем, против чего и вместе с чем.

Против чего. Броня в LoL режет физический урон по 100/(100+R). Магию не трогает, true damage проходит насквозь. Значит, у одного и того же персонажа EHP против одного противника одно, против другого другое, и появляется выбор, что покупать. У здоровья выбора нет: оно одинаково хорошо против всего.

Вместе с чем. Хил на 100 при 50% снижения урона восстанавливает 200 эффективного здоровья. Броня умножает каждое лечение и каждую регенерацию, здоровье не умножает ничего. Xypherous из Riot ещё в 2013 писал, что резисты «magnify the effect of your other self-healing, resistance and regeneration effects». Это и есть разница между толстым и танком: танка дешевле держать живым.

А здоровье ещё и кормит противника. Против Warwick'а 4000 здоровья не помогают, а 100 магического сопротивления помогают: «Your health pool is becoming their health pool». Броню можно пробить, и это отдельный слой контрмер. Здоровье пробить нельзя.

Плоская броня добавляет ещё одну ось. В Overwatch она не делит, а вычитает по 10 с каждого попадания. Пулемёт с мелкими пулями теряет половину урона, снайпер почти ничего. Тут EHP зависит не от суммы урона, а от того, как он нарезан.

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

#devmath #balance #gamefeel #gamedesign #armor
❤‍🔥6✍3