15

Ответ на пост «Основная проблема генератора вещей для RPG»

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

По-хорошему, пост должен быть на одну какую-то тему, но автор затронул две: про квесты и про процедурную генерацию предметов, а мне есть что сказать на обе эти темы.

Начнём с более простого. Если надо нагенерить названий, и чтобы они сочетались не только по смыслу, но и по склонениям, спряжениям и прочему, люди придумали жавным давно много всяких полезных библиотек и правил.
Вот первый попавшийся обзор таких библиотек для оперирования естественным языком: https://pythonist.ru/8-luchshih-bibliotek-obrabotki-estestve...

Но я бы посоветовал в первую очередь обратить внимание на питоновскую либу NLTK (от яндекса, кажется). Она умеет токенизировать слова: определять склонение, спряжение, пол, род, число. Серьёзное подспорье для разметки или генерации текста.


Для генератора нужен словарь. Это небольшая БД, куда мы складываем слова, которые будут использоваться для нашего генератора.

Слова храним сразу во всех нужных словоформах с указанием части речи (прилагательное, существительное...).


При добавлении каждого слова в наш словарь для генератора нужно заполнить целиком многомерную таблицу. По осям её будут характеристики:

- Число (0, 1, 2) - для задания словоформ по числу вся табоица умножается на три варианта: 0 - много (ноль или больше 5 предметОВ), 1 - один (=1 предмет.), 2 - от двух до четырёх (2, 3, 4 предметА).

- Род (м, ж, ср) - тут всё и так понятно, снова наша таблица утраивается.

- Падеж (именительный, родительный, дательный, винительный, творительный, предложный). Надо же, без подглядывания вспомнил=). Падежи нам нужны, чтобы более развесистые генераторы текстов писать, например текстов для квестов. Об этом я упомяну ниже, если не забуду. Но для простой генерации названий предметов падежей в словаре нам не требуется, хотя их можно потом добавить, если правильно разработать структуру данных словаря. Да, поддержка падежей умножает таблицу словоформ в 6 раз, что в итоге из 9 словоформ (род с числом) превращается в 54. Приличная такая трёхмерная табличка, правда? Её заполнение. впрочем, одноразовая операция и её можно избежать, воспользовавшись библиотеками для работы с натуральным текстом, или отложить на потом, ведь главное сделать несколько примеров, а всю рутину можно набить позже, когда ребёнок приведёт своих друзей, готовых работать за вкусняшки. Заодно и грамматику подтянут, орфографическим словарём пользоваться научатся.

Кстати, об орфографических словарях. Только что пришла в голову мысль. Можно же поискать достаточно хорошо протегированнй и формализованный исходник орфографиеского словаря! Оттуда можно в готовом виде дёргать огромное количество прилагательных для нашего генератора. Ну и не забываем про NLTK, если хотим генерить словоформы на лету.


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

Ещё к к таблие с белым сиском слов вы можете прописать характеристики, с которыми те или иные слова связаны. К примеру характеристики у нас: сила, ловкость, удача, скорость, защита...

Если взять словарь синонимов, а еще лучше ассоциаций, то по этим характеристикам можно автоматичски строить очень удачные говорящие названия. Ваш генератор подбирает характеристики оружия или доспехов, а затем отдельный алгоритм генерит рандомизированный поток названий. Я говорил, что в белом списке можно указывать веса встречаемости слов?
А ещё можно заоверрайдить =)... ну в смысле перекрыть, таблицу частот N-грамм и когда при тестировании вам часто попадается какое-то неприятное сочетание, вы можете его забанить большим отрицательным коэффициентом для этого сочетания.


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


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

Да, забыл про дисклеймер. Я не настоящий гейм-девелопер, а тот еще дилетант. Еинственный раз когда я работал в студии, разрабатывающей игры я... ох, это тоже, наверно, отдельная история. Даже не уверен, что готов её поведать.
Спецам в индустрии просьба. Если пищу ересь и чушь, и то же самое делается иначе и проще, то вы критикуйте и пишите. Буду учиться и переубеждаться, или спорить. Тут я доношу только свои наивные идеи, которые когда либо хотел применить в играх которые "джва года ждал" и отчаявшись начал было разрабатывать даже.


@SupportTech, попинайте уже разрабов, пусть делают голосование в постах! Можно было бы устраивать голосование за темы следующих статей.

Показать полностью
334

Основная проблема генератора вещей для RPG

Недавно в одном из комментариев я упомянул, что между делом занимаюсь разработкой некоторых РПГ механик, которым в свое время не нашлось места (или времени на проработку) в моем первом проекте Dark Plane.

В частности, это диалоговый модуль, плавно перетекающий в систему квестов. Выглядит он примерно так:

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

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

Давайте я сразу покажу как выглядят сгенерированные вещи, а тем, кому не хватит видео для понимания, расскажу немного подробнее.

Префиксы, постфиксы и градации качества. Чувствуете, запахло Дьябло 2? :) Кстати, не обращайте внимание на графику, много где это заглушки.

Так вот. Я держал в голове необходимость именно автоматической генерации дополнительных характеристик, таких как +сила, +интеллект итд. В первую очередь, для этого был создан ряд, назовем их так, "базовых вещей", содержащих тип, иконку и привязку к мешу. Ни основных статов, ни вторичных. Например, Куртка. Или Сапоги.

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

На бумаге все работает. Да и в билде тоже. Все, кроме одного.

Русских, мать их, названий предметов!

По задумке опять же, я хотел давать префиксы и постфиксы названиям предметов в зависимости от их качества и вторичных характеристик. Таким образом, условная Куртка низкого качества со статами на +сила и +крит превращалась бы в Потрепанную Могучую Куртку Внезапной Смерти (да, я могу в названия >_<). И все бы хорошо, но внезапно выяснилось, что прилагательные в русском языке умеют склоняться! Это я выяснил, запустив билд и увидев предметы типа Могучий Носки или Простой Одеяние.

Не буду утомлять долгим описанием поиска выхода из ситуации. Скажу лишь, что изначально планировалось в каждую (лол) базовую вещь добавить поля, в которых вручную силами одного ребенка за вкусняшки будут добавляться все словоформы (!) всех прилагательных (!!) в двух формах префикс-постфикс в зависимости от рода и числа основного названия базовой вещи. Говоря проще, для Куртка это были бы Могучая, Новая, Старая, Фамильная итд. Для Штаны это Могучие, Новые, Старые итд. Это охрененная и дурная работа.

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

На этом пока что все. Если есть вопросы - задавайте :)

Показать полностью 3 1
Отличная работа, все прочитано!