Metadata-Version: 2.1
Name: questgen
Version: 0.4.2
Summary: Generator of nonlenear quests with events and flow validating.
Home-page: https://github.com/Tiendil/questgen
License: BSD-3
Keywords: gamedev,procedural content generation,quests,quests generation
Author: Aliaksei Yaletski (Tiendil)
Author-email: a.eletsky@gmail.com
Requires-Python: >=3.6,<4.0
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: License :: Other/Proprietary License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Games/Entertainment
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Project-URL: Repository, https://github.com/Tiendil/questgen
Description-Content-Type: text/x-rst

########
Questgen
########

Библиотека для автоматической генерации заданий (квестов). Позволяет по описанию мира (в виде набора предикатов) автоматически создавать вложенные нелинейные задания с событиями и разного рода ограничениями (вроде «исход задания для этого персонажа должен быть только положительным»).

Также позволяет визуализировать то, что получилось, пример визуализации: svg_

.. _svg: http://tiendil.org/static/trash/collect_debt.svg

Конструкторы всех заданий: ``./questgen/quests/``

Создавалась для использования в MMOZPG игре Сказка_.

.. _Сказка: http://the-tale.org

Визуализации всех «базовых» шаблонов заданий лежат в каталоге ``./questgen/svgs/``

Работа библиотеки описана в статье на habrahabr_.

.. _habrahabr: http://habrahabr.ru/post/201680/

************************************
Условные обозначения в визуализаторе
************************************

Отображается граф квеста без модификаций (например, со всеми вариантами события, см. далее).

* серые узлы — начало и окончание задания;
* фиолетовые узлы — точки выбора;
* зелёные узлы — обычные точки сюжета;
* красные узлы — условные переходы;
* бирюзовые контуры — подквесты;
* более тёмным фоном на в узлах отмечены требования к ситуации, которые должны быть выполнены для возможности перехода в эту точку сюжета;
* более светлым фоном выделены действия, которые должны быть выполнены сразу после перехода в точку сюжета.
* жёлтые контуры — события;


*********
Установка
*********

::

   pip install git+git://github.com/Tiendil/questgen.git#egg=Questgen

**************
Принцип работы
**************

Состояния мира описывается в виде предикатов вроде

.. code:: python

   LocatedIn(object='hero', place='place_1')


и сохраняются в базу знаний (БЗ)

Задание описывается ориентированным связанным графом с одной начальной вершиной и несколькими конечными (который тоже хранится в БЗ).

* каждая вершина имеет список требований, которые должны быть удовлетворены, прежде чем можно будет перейти в неё (например, герой должен находиться в конкретном месте);
* каждая вершина имеет список действий, которые должны быть выполнены, когда мы в неё перешли;
* каждая дуга имеет два списка действий:
  * которые должны быть выполнены, когда мы начинаем двигаться по дуге;
  * когда мы заканчиваем двигаться по дуге (т.е. переходим в новую вершину после удовлетворения всех её требований);
* существует несколько типов вершин:
  * Начальная — одна на задание, с неё начинается «путешествие»;
  * Конечная — несколько на задание, определяет результат выполнения (для стыковки с другими заданиями);
  * обычная — узел истории, можешь иметь несколько входящих дуг и ровно одну исходящую;
  * выбор — может иметь несколько исходящих дуг, между которыми можно переключаться, пока не пришли в одну из следующих вершин;

Несколько вершин могут быть объединены в «событие», которое раскрывается при завершении генерации графа, удаляя все вершины кроме одной. Таким образом можно делать случайные события.

Общий порядок генерации:

#. создать описание мира;
#. создать задание;
#. обработать задание (см. пример использования далее);
#. проверить на корректность;
#. работать с квестом в коде игры (игра реализует код, который выполняется при проходе по графу).

**Следует помнить, что генерация задания может быть неудачной (вызывается исключение questgen.exceptions.RollBackError). Это не значит, что всё плохо, это значит, что необходимо повторить генерацию, т.к. был сформирован неудачный граф задания.** Из этого следует, что для лучшей и более быстрой генерации заданий лучше иметь мир побольше, чтобы не было много коллизий.

******
Пример
******

см. ``./helpers/example.py``

************
Визуализация
************

Визуализатор: ``./helpers/visualizer.py``  создаёт изображения шаблонов заданий в ``./questgen/svgs/``

Использует ``graphviz`` через библиотеку ``pygraph``

*Если создаются неверные (поехавшие) изображения, поставьте новую версию graphviz*

