## Инвентарь

Положить объект в инвентарь можно нажатием "кнопки действия" рядом с объектом (взять, событие `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`.

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