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