Комментирование битвы

Продолжим рассказывать элементы разработки игры Комбикорм-2. Подготовка и карты были рассмотрены ранее здесь и здесь.
Допустим, вы автор текстовой игры с боевой системой. Скажите, хотелось бы вам добавить литературного описания к поединку? Чтобы вместо холодных цифр, были попадания и промахи, хитрые приёмы врагов и проявления черт характера персонажей? Конечно же хочется. Однако препятствий кажется намного больше чем, чем возможностей, поэтому придётся накладывать ограничения:
  • Выдача боевой ситуации происходит линейно, событие за событием. Сначала первый попал во второго, второй умер. В дальнейшем, это облегчит составление описаний и их отладку.
  • Всего один тип монстров и все герои — люди. Не очень люблю универсальные описания, по типу “муха нанесла удар крылом”. Для игры решил, что лучше делать более естественные, но всего для трех типов нападений: человек на быка, бык на человека и бык на быка.
  • Каждый удар отнимает по одной жизни. Получается два типа комментариев — нанесение урона и гибель.
  • Добавление описательных фраз для сглаживания механистичности описания. Как раз в эту категорию попадают некие уникальные черты персонажей, состояния перед нападением, реакции на нападение.


Стратегия

Для начала определимся с мета-шаблоном, по которому будет выводиться описание всей сцены. Немного полазив по писательским сайтам, нашел такие советы: ficwriter.info/stati/56-kak-napisat-knigu-q/obmen-opytom-q/165-batalnye-stseny-osnovnye-oshibki-fikrajterov.html
и writercenter.ru/blog/school/kak-pisat-dinamichnye-sceny-dlya-nachinayuschih.html
Решил для простоты использовать вот такой метод для случая нападения быка на актёра:

(с вероятностью 30%) Выдача состояния быка перед нападением
Выдача текста нападения
(с вероятностью 30%) Реакция актёра на нападку
Чтобы было интереснее, решил сделать периодическую выдачу “воды” — состояния актёров и противников, а также деталей фона. Описание фона выдаётся в тестовом примере (ниже), однако, в самой игре не добавил из-за трудоёмкости разработки уровней.

Шаблоны фраз

Хотелось бы удобно задавать фразу, на основе общего шаблона. Когда определяешь имя объекта в парсере, то всегда добавляешь синонимы к объекту, поэтому хотелось бы использовать эти синонимы в генерации. Ой, забыл, надо еще чтобы фраза выводилась с учётом падежей. Во фразе максимум два участника. Итак, после долгих раздумий шаблон фразы стал выглядеть так:
'zmon_im разогнался и ударил tar_ro рогом по ногам.'
, где: zmon_im — означает, что будет подставлено имя источника повреждений (mon) с заглавной буквы (префикс z) в именительном падеже, tar_ro — подставляется цель (tar) с маленькой буквы в родительном падеже.
Соответственно, легко составлять и читать шаблонные фразы, то что нужно.

Управление выдачей

Следующий момент — фразы из шаблона не должны повторяться, пока не будет исчерпан весь список, случайный выбор будет часто повторяться. Для этого взял библиотеку от Никиты Цейковца lexicon, которая выдавала неповторяющиеся фразы до исчерпания запаса и немного подкорректировал. Например, список фраз, когда один бык нападает на другого:

bykHitTemplatesMonster: lexicon
    use_templ = true
    phrases = [
	'zmon_im яростно боднул tar_ro.'
	'zmon_im ударил задним правым копытом в tar_ro.'
	'tar_im получил удар передними копытами от mon_ro.'
	'ztar_im хотел увернуться, но не успел, mon_im попал в него. '
	'zmon_im укусил tar_ro в район шеи, брызнула кровь.'
    ]
;

Для удобства обернул выдачу в методы для монстров и персонажей, диаграмма классов выглядит так:


Тестовый пример

Выложил тестовый пример на github: github.com/alastochkinheroku/test_comments
Там уже есть все инструменты для сборки (под Windows) и выполнения в консольном интерпретаторе. Просто заходите в папку game и пользуйтесь батничками. Скриншот тестового примера, где надо просто набирать команду осмотреть, чтобы видеть происходящее:


В игре идёт одна и та же сцена битвы: зелёный бык нападает на старого, старый умирает, затем Кит нападает на красного, который умирает, а потом синий бык бьёт по Киту.

Выводы

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

Ссылки

Тестовый пример: github.com/alastochkinheroku/test_comments
Собранная версия (gam-файл для проигрывателей): cloud.mail.ru/public/4X36/BWE7fh5J3

Нет комментариев