Questgen
Библиотека для автоматической генерации заданий (квестов). Позволяет по описанию мира (в виде набора предикатов) автоматически создавать вложенные нелинейные задания с событиями и разного рода ограничениями (вроде «исход задания для этого персонажа должен быть только положительным»).
Также позволяет визуализировать то, что получилось, пример визуализации: svg
Конструкторы всех заданий: ./questgen/quests/
Создавалась для использования в MMOZPG игре Сказка.
Визуализации всех «базовых» шаблонов заданий лежат в каталоге ./questgen/svgs/
Работа библиотеки описана в статье на habrahabr.
Условные обозначения в визуализаторе
Отображается граф квеста без модификаций (например, со всеми вариантами события, см. далее).
- серые узлы — начало и окончание задания;
- фиолетовые узлы — точки выбора;
- зелёные узлы — обычные точки сюжета;
- красные узлы — условные переходы;
- бирюзовые контуры — подквесты;
- более тёмным фоном на в узлах отмечены требования к ситуации, которые должны быть выполнены для возможности перехода в эту точку сюжета;
- более светлым фоном выделены действия, которые должны быть выполнены сразу после перехода в точку сюжета.
- жёлтые контуры — события;
Установка
pip install git+git://github.com/Tiendil/questgen.git#egg=Questgen
Принцип работы
Состояния мира описывается в виде предикатов вроде
LocatedIn(object='hero', place='place_1')
и сохраняются в базу знаний (БЗ)
Задание описывается ориентированным связанным графом с одной начальной вершиной и несколькими конечными (который тоже хранится в БЗ).
- каждая вершина имеет список требований, которые должны быть удовлетворены, прежде чем можно будет перейти в неё (например, герой должен находиться в конкретном месте);
- каждая вершина имеет список действий, которые должны быть выполнены, когда мы в неё перешли;
- каждая дуга имеет два списка действий: * которые должны быть выполнены, когда мы начинаем двигаться по дуге; * когда мы заканчиваем двигаться по дуге (т.е. переходим в новую вершину после удовлетворения всех её требований);
- существует несколько типов вершин: * Начальная — одна на задание, с неё начинается «путешествие»; * Конечная — несколько на задание, определяет результат выполнения (для стыковки с другими заданиями); * обычная — узел истории, можешь иметь несколько входящих дуг и ровно одну исходящую; * выбор — может иметь несколько исходящих дуг, между которыми можно переключаться, пока не пришли в одну из следующих вершин;
Несколько вершин могут быть объединены в «событие», которое раскрывается при завершении генерации графа, удаляя все вершины кроме одной. Таким образом можно делать случайные события.
Общий порядок генерации:
- создать описание мира;
- создать задание;
- обработать задание (см. пример использования далее);
- проверить на корректность;
- работать с квестом в коде игры (игра реализует код, который выполняется при проходе по графу).
Следует помнить, что генерация задания может быть неудачной (вызывается исключение questgen.exceptions.RollBackError). Это не значит, что всё плохо, это значит, что необходимо повторить генерацию, т.к. был сформирован неудачный граф задания. Из этого следует, что для лучшей и более быстрой генерации заданий лучше иметь мир побольше, чтобы не было много коллизий.
Пример
см. ./helpers/example.py
Визуализация
Визуализатор: ./helpers/visualizer.py
создаёт изображения шаблонов заданий в ./questgen/svgs/
Использует graphviz
через библиотеку pygraph
Если создаются неверные (поехавшие) изображения, поставьте новую версию graphviz