Инвентарь - 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
.