Инвентарь - TrueCat17/Ren-Engine GitHub Wiki

Инвентарь

Положить объект в инвентарь можно нажатием "кнопки действия" рядом с объектом (взять, событие take). Берётся ближайший объект, которые можно взять в инвентарь. Эта операция приоритетнее "действия" в определённом месте локации (см. События).

Объект в инвентаре можно:

  • Использовать: Генерируется событие use, "использованный" объект не удаляется из инвентаря (но его может удалить вызванная метка).
  • Удалить (вернуть в локацию или совсем удалить, в зависимости от параметра remove_to_location при регистрации): Генерируется событие remove.

Все события с объектами инвентаря (take, use и remove) хранят название объекта события в переменной rpg_event_object.


Объекты

Во всех функциях для работы с инвентарём используется необязательный объект obj, с которым и ведётся работа.

В качестве объекта можно передать персонажа (Character), объект (RpgLocationObject) или место в локации (RpgPlace).
В этом случае в качестве инвентаря объекта используется obj.inventory.

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


Одежда

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

Размеры инвентарей по умолчанию для каждой одежды у всех персонажей указываются, например, так:

inventory.dress_sizes = {
	'default': 10,
	'winter': 20,
	'summer': 6,
}

Здесь зимняя одежда содержит 20 ячеек инвентаря, летняя - 6, а все остальные (например, весенняя) - 10.

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

Инвентари для других одежд хранятся в inventories персонажей.
Это свойство является словарём (dict), и ключами в нём выступают названия одежд.

Важно: если одежда ещё не была надета на данного персонажа в текущей игре и она не указана в inventory.dress_sizes, то и в inventories её не будет.


Указать размер инвентаря

$ inventory.set_size(size, obj = None)
Где:

  • size - новый размер инвентаря (при уменьшении невлезающие вещи будут разбросаны вокруг),
  • obj - объект, у которого меняется размер инвентаря (по умолчанию - персонаж me).

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

Как и говорилось выше, инвентарь может быть у объектов и мест (для ящиков, шкафов и т. д.), подробности см. в статье Объекты локаций.


Добавить в инвентарь

inventory.add("obj_name", count, obj = None)

Добавляет в инвентарь count объектов типа obj_name и возвращает кол-во объектов, которые нельзя поместить из-за ограничений по размеру инвентаря.


Наличие в инвентаре

inventory.has("obj_name", count = 1, obj = None)
Возвращает True, если в инвентаре имеется count объектов типа obj_name, иначе - False.


Удалить из инвентаря

inventory.remove("obj_name", count, obj = None)
Удаляет из инвентаря count объектов типа obj_name и возвращает кол-во объектов, которые нельзя удалить из-за их отсутствия.


Сгенерировать событие инвентаря

inventory.add_event("event", "obj_name")
Где:

  • event - название события инвентаря (одна из строк среди "take", "use", "remove"),
  • obj_name - название объекта, который связан с событием.

Открыть окно инвентаря

inventory.show(first = None, second = None)
Где:

  • first - объект для "своего" инвентаря (по умолчанию - me), который будет отображаться снизу,
  • second - другой объект вроде шкафа или сундука, None - отсутствие.

Перекладывание между инвентарями

Для автоматического перекладывания вещей из инвентаря (не объекта!) old в new используется
inventory.change(old, new, show_on_fail)

Если для автоматического режима в новом инвентаре не хватает свободного места и параметр show_on_fail установлен в True, то будет открыто окно для ручного перемещения объектов.

Именно эта функция используется при смене одежды (show_on_fail устанавливается в True только для основного персонажа).


Закрыть окно инвентаря

inventory.close()


Разброс выкидываемых вещей

Свойство inventory.throw_radius (по умолчанию - 3) отвечает за радиус, в котором вокруг персонажа будут разбросаны выкидываемые вещи.

Хотя вернее, наверно, было бы назвать это половиной стороны квадрата, а не радиусом круга, но "радиус" звучит проще и понятнее, а разница обычно не имеет значения.


Внутреннее устройство инвентаря

Инвентарь объекта является списком и обычно хранится в свойстве inventory.
Инвентарь у объекта может отсутствовать (None) или быть нулевого размера (пустой список []).

Каждый элемент списка (ячейка) является массивом из 2 элементов: название объекта (строка) и их кол-во в этой ячейке.
Если данная ячейка пуста, то названием объектов, которые она содержит, будет пустая строка.
Нужно следить за этим при ручном изменении кол-ва объектов.

Пользовательский код может без проблем менять содержимое инвентаря вручную, если в этом возникнет необходимость.
Например, так можно заменить все монеты в 10 тугриков монетами в 20 (удвоив таким образом наличные):

for i in me.inventory:
	if i[0] == 'coin-10':
		i[0] = 'coin-20'

Здесь предполагается, что объект coin-20 был зарегистрирован также, как и coin-10.

В случае увеличения кол-ва объектов стоит помнить о том, что у объекта может быть ограничение на максимальное кол-во в 1 ячейке.
Возможно, в этом случае будет проще использовать функцию inventory.add.


Далее ->
<- Назад

⚠️ **GitHub.com Fallback** ⚠️