Skip to content

Создание контента

Создание элементов игры

Почти все, что создается для игры - сами абилки, оружие, тэги и прочее, создаются в папке /content.

Внутри вы увидите множество файлов, которые называются по классам, которые они подразумевают. Например, в tags.py нужно заполнять тэги, а в blueprints.py блюпринты. Используйте здравый смысл.

Все, что от вас требуется - это создавать инстансы питонических классов, добавляя .save() на конце (хоть есть и исключения).

bodyparts.py
from properties.part import Part
from content.tags import head, organic_bodypart, arm_bodypart_tag

Part(uid="human_torso", display_name="Торс", hp=100, tags=[organic_bodypart], deadly=True).save()
Part(uid="human_head", display_name="Голова", hp=21, tags=[organic_bodypart, head], deadly=True).save()
Part(uid="human_arm", display_name="Рука", tags=[arm_bodypart_tag], hp=50).save()
Part(uid="human_leg", display_name="Нога", hp=50).save()

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

statuses.py
from properties.status import Status
import content.tags as tags

hot = Status(
    uid="hot",
    display_name="Тепло",
    description="Вам тепло!",
    duration=3,
    override_by_name=False,
    unique_by_tag="anti_thermal",
    tags=[tags.thermal_status],
    can_concat=False,
)

Где надо .save(), а где нет?

Везде, кроме статусов и их деривативов (Откровения, Травмы). Они не являются Document, а являются EmbeddedDocument. В их случае вы лишь создаете "шаблон".

Как вызывать сущности в коде

Если это Document, то есть вы его сейвите, можно либо присвоить переменную, либо вытащить его по какому-либо полю из БД. Синтаксис тут обычный для mongoengine, например, чтобы вытащить Holdable с uid "big_gun", нужно сделать что-то такое:

from core.items.holdable import Holdable
big_gun = Holdable.objects(uid="big_gun").first()

В данном случае .first() позволяет нам получить первый элемент полученного в резуьтате использования .objects() инстанса класса QuerySet. Поскольку мы использовали поиск по айдишнику, мы точно знаем, что он один, поэтому смело пользуется методом .first(); все аргументы в .objects() это, по сути, аргументы поиска в базе данных. Подробнее лучше смотреть в оригинальной документации.

Если это статус то для вас есть специальный словари all_statuses, all_traumas и all_revelations, они лежат соотв-но в properties/status.py.

from properties.statuses import all_statuses
all_statuses["burning"]
Вы можете вытаскивать по строке любые травмы или откровения, а так же любые статусы, кроме динамических (имеющих dynamic=True).

Но это достаточно костыльный способ, проще всего присвоить переменную, поэтому лучше сразу ее назначать, когда вы создаете статус.