Ответ на пост «Основная проблема генератора вещей для 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, попинайте уже разрабов, пусть делают голосование в постах! Можно было бы устраивать голосование за темы следующих статей.

Лига Разработчиков Видеоигр

6.6K постов22.1K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

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


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"