Всем привет.
Сегодня будем обсуждать механику счётчика стиля из Devil May Cry, но в диалоговой системе! (СКРИН_1)

СКРИН_1
СКРИН_1

Одним из самых лучших дизайнерских решений, которые придумали дизайнеры DMC, стал счётчик стиля. (СКРИН_2)

СКРИН_2
СКРИН_2

Немного о том, какую проблему он решает. DMC - это слэшер. В этом жанре игрока атакуют группы противников ш��ук по 10 в среднем. Для победы вы можете использовать уклонения, различные модификаторы здоровья, модификаторы условной маны (режим Devil Trigger'а, в котором главный герой обретает демонический облик и неуязвимость) и предметы, ослабляющие врагов. Но самое важное - это прямая атака, которой вы и будете пользоваться большую часть времени. В отличие от остальных экшен-игр, где всю игру можно пройти, зажимая ЛКМ, в DMC дизайнеры решили добавить большое количество разных приёмов. Дважды нажали удар - это один приём. Нажали 2 раза, подождали и нажали снова - это другой приём. В такой системе нет причины для использования различных комбинаций атак. Поэтому дизайнеры ввели счётчик стиля - чем более разнообразные приёмы вы используете, чем длиннее ваше комбо и чем дольше вы удерживаете противника в воздухе, тем больше ваш счётчик стиля. Поднимать счётчик вы хотите не только потому, что это само по себе круто, но и потому, что он увеличивает количество опыта, которое вы получаете в каждом сражении. А без опыта и прокачки игра становится сложнее и почти непроходимой. Сам счётчик привязан ко времени - повторяющиеся приёмы, полученный урон и стояние на месте приводят к сгоранию счётчика - так что торопитесь отправить демонов обратно в ад побыстрее!

Так вот, счётчик нужен, чтобы мотивировать игрока использовать разные приёмы и играть как задумано - элегантное решение.

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

Варианты реализации, которые можно попробовать сделать:
1. Счётчик накапливает особо крутые реплики, которые дают +5 или +2 опыта. Чем больше и чаще такие реплики выбираешь - тем выше твой показатель. Это спорный вариант, который я сразу отклонил - все реплики должны быть унифицированными, иначе игрок начнёт полностью отключаться от сюжета и выбирать не смысл реплик, а их модификаторы. Это превращает диалог в мини-игру типа убеждения из Обливиона или, ещё хуже, Старфилда. (СКРИН_3)

СКРИН_3
СКРИН_3

2. Добавить репликам не модификаторы, а маркеры стиля, которые будут чем-то типа системы тегов из Divinity (или такой же, но неявной системы из BG3). То есть в начале реплики будет записан разблокированный тег:
"1. [Необарокко] Я обладатель чёрно-белого герба. (показать запонки)"
В BG3 и Divinity я при любой возможности выбирал только те реплики, которые мне разблокирует класс - потому что они особенные и я хочу получить эксклюзивный контент. Это убирает агентность из выбора, так что этот вариант тоже не в тему. Отклонён. (СКРИН_4)

СКРИН_4
СКРИН_4

3. Есть ещё разные варианты счётчика, но все они сводятся к разным способам начислять бонусы и множители из количества ответов игрока или реакции НПЦ.
Я взял следующее:
Все уникальные реплики дают +1 к счётчику.
Сноски дают +1 к множителю и повышают оценку.
Каждый выход из сноски или диалога обнуляет счётчик и подсчитывает накопленные очки навыка (100 очков опыта = 1 очко навыка).
В такой системе сноски, текст, опыт и оценка стиля формируют хорошую мотивацию игрока к исследованию и возможности для комбо:
Просто разговаривая, вы получаете за каждый клик очко опыта. Это мотивация к чтению текста через награду в виде прокачки.
При возможности сноски - вы её открываете и ваш счётчик получает множитель. Это мотивация к использованию механики сносок через ещё большую награду.
Сноски внутри сносок дают ещё больше опыта и множителей - как раз возможность для комбо и вложенных сносок, которую хочется использовать.

Какую проблему это решает:
1. Прогрессия и опыт. В демке мне нужна система прогрессии, чтобы можно было прокачивать навыки и проходить активные проверки. Во всех CRPG вы получаете опыт либо за выполнение квеста, либо за принятие промежуточных решений. Это требует тестирования и балансировки. Счётчик тоже нужно балансировать, но он позволяет поэкспериментировать с самой системой накопления опыта.
2. Мотивация к чтению - постоянная награда. По сути, счётчик становится такой морковкой на удочке, за которой будет идти игрок. Буквально каждое действие в разговоре поощряется системой.
3. Сама система стиля идеально связывает между собой тематику игры - Фэшнпанк (буквально стиль повсюду) как оценка стиля и сноски как возможность для комбо.

Как сделал (блок для тех, кто хочет знать архитектуру системы):Выбрал, что оценок будет 4: C, B, A, S (я всё ещё планирую до 4 окон диалога на одном экране). И могут увеличиваться до SS, SSS, SSS+.

Сам счётчик крепится к диалоговому окну. Это виджет, который имеет текст для счёта и текст для оценки.

Сперва клик по кнопке ответа. При клике на уникальную кнопку (она уникальная через систему World State, про которую писал в предыдущем девлоге) внутри самой логики кнопки она берёт стек комбо и обновляет значение счётчика на +1 - заменяет последний элемент на такой же, но +1. И добавляет +1 к переменной Total_XP.

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

Диалог имеет стек для вложенных сносок.
Сноски могут закрываться (pop) и открываться (push).Так что я добавил 2 функции в те же места, но для счётчика.

При открытии сноски:PushComboState - проверяет длину стека (через GetRankByDepth). Если диалог уже открыт — сохраняет счётчик и увеличивает множитель, увеличивает оценку. Если нет - создаёт пустой счётчик.

При выходе из сноски/закрытии диалога:PopComboState - чистит стек и обнуляет счётчик (обрывает комбо на выходе из сноски).GetCurrentComboState - проверяет общий счёт в конце комбо.CheckSkillPointReward - конвертирует очки опыта в очки навыков для прокачки (просто в цикле - 100 у Total_XP и +1 к skill points).

Отображение. Также сам счётчик одновременно отображается только 1 на всех диалогах - на самом последнем. Мой диалоговый контейнер, который включает в себя все диалоговые окна, проходит по всем окнам, скрывает счётчик на них и, если это последнее окно, показывает.

Уведомление. Также, чтобы показать, что очко навыка получено, я добавил особую дополнительную реплику. Её обрабатывает мой парсер реплики (штука, которая обрабатывает именно текст реплики), он спрашивает у диалогового менеджера, есть ли новые очки навыка (отдельная переменная для буферного значения в рамках одной цепочки открытых окон), и добавляет в конце «[Получено n очков навыка]». Это справочная информация, и она добавляется именно в реплику НПЦ, потому что в реплике главного это будет неожиданным и незаметным поведением игры со стороны игрока.

Осталось обсудить последнее - узкие места такой механики.

Вопросы баланса и ощущений.
Что решит плейтест:
1. Сама система выглядит хорошо, но на плейтесте узнаю, насколько именно хорошо она работает.
2. Количество сносок и комбо. Может быть такое, что система будет работать в своей лучшей форме, если сноски будут короче и чаще. Это тоже нужно смотреть на плейтесте.
3. Баланс - сколько лучше начислять очков навыка и за сколько опыта.
4. Расположение счётчика и анимации. Сейчас я не до конца могу определиться, должен ли он быть в прямой видимости игрока под кнопками ответов или сверху под портретом, чтобы всегда был под рукой, но немного на фоне. Анимации буду добавлять на этапе полировки.

Вопросы дизайна:
1. Отсутствие разнообразия приёмов. Всегда получать +1, даже при наличии множителей, выглядит как досада. Так что после тестирования я попробую обойти проблему с тегами и явными бонусами при выборе реплики. Например, +5 к счётчику можно получать не за выбор реплики, а за реакцию НПЦ. То есть Диско позволяет вести себя безобразно на людях и наслаждаться реакцией персонажей. Это хорошее место для разнообразия в количестве получаемого опыта.
2. Нет примеров с пошаговой реализацией, к сожалению, так что изобретаю. Игры со счётчиком часто называют даже не слэшерами, а action games.
3. Не уверен насчёт наказания для игрока. Не очень хочется добавлять таймер для каждой реплики, как в DMC, потому что хочу сохранить за игроком право играть в своём темпе.
4. Выход из сноски обнуляет счётчик, даже если ты внутри другой сноски. То есть в ситуации "диалог - сноска - сноска" при выходе из последней мы опускаемся не в диалог (как на землю в DMC), а в предыдущую сноску (словно из одной воздушной атаки на атаку чуть ниже, но тоже в воздухе). И сноску приходится дочитывать уже без напряжения с комбо. Тут придётся, скорее всего, тоже что-то придумать.

Финальный результат можете посмотреть в (ВИДЕО_5).

Вот и всё. В этот раз получилось довольно объёмно. ЧАО КАКАО!